实验3 多个段的汇编源程序编写与调试
四、实验结论
1. 实验任务1
源代码文件task1.asm
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
使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

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


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

分析源代码中data段line4的字节数据的用途是?
答:控制显示的字符的颜色。
2. 实验任务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 si,0 mov cx,5 s: mov ax,0 mov al,[si] mov bl,10 div bl add al,30H //将数值->数字字符 add ah,30H mov [si+5],al mov [si+6],ah mov ah,2 //输出十位字符(商) mov dl, [si+5] int 21h mov ah,2 //输出个位字符(余数) mov dl,[si+6] int 21h mov ah,2 //输出空格 mov dl,32 int 21h inc si loop s mov ah, 4ch int 21h code ends end start
运行结果:

3. 实验任务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
①cpu执行程序,程序返回前,data段中的数据为多少?
答:不变

②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
4. 实验任务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段中的数据为多少?
答:不变。

②cpu执行程序,程序返回前,cs=076ch,ss=076bh,ds=076ah。

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
④对于如下定义的段:
name segment
...
name ends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为_(N/16+1)*16_。
5. 实验任务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
①cpu执行程序,程序返回前,data段中的数据为多少?
答:不变。
②cpu执行程序,程序返回前,cs=076ah,ss=076eh,ds=076dh。

③设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
6. 实验任务6
如果将task3,task4,task5中的最后一条伪指令“end start"改为”end",则哪个程序仍然可以正确执行?请说明原因。
答:task5可以正确执行,task3、task4不可以正确执行。因为若不指明标号,cpu顺序执行指令。
7. 实验任务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 c1 segment ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称 db 8 dup(0) c1 ends code segment start: mov ax,a mov ds,ax mov si,0 mov cx,8 s: mov al,[si] add al,[si+16] mov [si+32],al inc si loop s mov ax,4c00h int 21h code ends end start
在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正 确实现了题目要求。
执行前:

执行后:

8. 实验任务8
完整源代码文件task8.asm
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,16 mov ax,a mov ds,ax mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s mov ax,4c00h int 21h code ends end start
在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正 确实现了题目要求。
执行前:

执行后:


浙公网安备 33010602011771号