实验3 多个段的汇编源程序编写与调试
实验结论
实验任务1
assume cs:code, ds:data data segment db 'Nuist' db 5 dup(2) data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800H mov es, ax mov cx, 5 mov si, 0 mov di, 0f00h s: mov al, [si] and al, 0dfh mov es:[di], al mov al, [5+si] mov es:[di+1], al inc si add di, 2 loop s mov ah, 4ch int 21h code ends end start
代码功能逐行解释:
mov cx, 5 //设置循环次数为5次 mov si, 0 //设置偏移量,这是设置数据段ds的偏移地址 mov di, 0f00h //设置es的偏移地址 s: mov al, [si] //将ds:[si]一个字节的内容存入al and al, 0dfh //将字母大写 mov es:[di], al //将al里的数据存入附加段里面去,这里存入的是数据信息 mov al, [5+si] //将ds:[5+si]存入al mov es:[di+1], al //再次存入到附加段里面去 inc si //si自加 add di, 2 //附加段的偏移地址加2,移动一个字的单位 loop s //循环
使用masm、link对task1.asm进行汇编、链接

执行task1.exe后,屏幕上出现如下图像:

使用debug工具对程序进行测试,执行到程序返回前,即line27之前,观察结果。

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果
db 5 dup(2) --> 改成: db 2,3,4,5,6

这里的数值作用是代表的颜色信息。
实验任务2
task2.asm代码:
assume cs:code,ds:data data segment db 23,50,66,71,35 data ends code segment start: mov ax,data mov ds,ax mov cx,5 mov bx,0 s: mov ah,0 mov al,ds:[bx] mov dl,10 div dl mov ds:[5],al mov ds:[6],ah mov ah,2 mov dl,ds:[5] add dl,30h int 21h mov ah,2 mov dl,ds:[6] add dl,30h int 21h mov dl,32 int 21h inc bx loop s mov ax,4c00h int 21h code ends end start
使用masm、link工具对task2.asm进行汇编和链接

执行task2.exe,运行结果显示如下:
![]()
成功输出五个数
实验任务3
task3.asm源代码:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data ends stack segment dw 0, 0, 0, 0, 0, 0, 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
使用masm、link工具对task3.asm进行汇编和链接

①CPU执行程序,程序返回前,data段中的数据:0123H, 0456H, 0789H, 0ABCH, 0DEFH, 0FEDH, 0CBAH, 0987H

②CPU执行程序,程序返回前,cs=076CH,ss=076BH,ds=076AH


③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
实验任务4
task4.asm源代码:
assume cs:code, ds:data, ss:stack data segment dw 0123h, 0456h data ends stack segment dw 0, 0 stack ends code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
①CPU执行程序,程序返回前,data段中的数据为0123H,0456H,0......


②CPU执行程序,程序返回前,可以得出cs=076CH,ss=076BH,ds=076AH,而ds里的数据没有发生变化

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
④如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(floor(N/16)+1)*16。
最少占用16个字节,然后以16的倍数增加,16 32 48
实验任务5
task5.asm源代码:
assume cs:code, ds:data, ss:stack code segment start: mov ax,stack mov ss, ax mov sp,16 mov ax, data mov ds, ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h, 0456h data ends stack segment dw 0,0 stack ends end start
对task5.asm进行汇编和链接

①CPU执行程序,程序返回前,data段中的数据为0123H ,0456H

②CPU执行程序,程序返回前,cs=076AH,ss=076EH,ds=076DH
查看ds里的数据没有发生变化

③设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4
实验任务6
只有第三个程序能够正确执行。将“end start”改为“end”数据段与栈段的数据当作程序运行出错,
而第三个程序的 data 段与 stack 段处于 code 之后,默认执行的起点就是 code 段的内容,能够正确执行。
实验任务7
task7.asm源代码:
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 8 dup(0) c ends code segment start: mov ax,a mov ds,ax mov si,0 mov cx,9 s: mov ax,0 mov al,[si] add al,[si+16] mov [si+32],al inc si loop s mov ah,4ch int 21h code ends end start
将c1段地址给es,查看es结果,已经完成相加:

实验任务8
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 8 dup(0) b ends code segment start: mov ax,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov si,0 mov cx,9 s: push ds:[si] add si,2 loop s mov ah,4ch int 21h code ends end start
先反汇编,再输出结果:


可以看到,已完成逆序存储

浙公网安备 33010602011771号