实验2 汇编源程序编写与汇编、调试
1. 实验任务1
使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。
1 ;ex1.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 mov byte ptr ds:[0], 1 7 mov byte ptr ds:[1], 1 8 mov byte ptr ds:[2], 2 9 mov byte ptr ds:[3], 2 10 mov byte ptr ds:[4], 3 11 mov byte ptr ds:[5], 3 12 mov byte ptr ds:[6], 4 13 mov byte ptr ds:[7], 4 14 mov ah, 4ch 15 int 21h 16 code ends 17 end
使用masm、link对ex1.asm进行汇编、链接,得到可执行文件ex1.exe,运行并观察结果。
使用debug加载可执行文件ex1.exe后,使用d命令查看程序段前缀PSP所占的256个字节。
结合可执行文件中寄存器CX的值,使用u命令对ex1.exe进行精确反汇编
使用g命令执行到程序退出执行之前(即源码文件中line16之前),观察结果。
此处,第一次并没有将数据送入目标内存,但ex1.exe这个文件运行时正常,猜测:是屏幕回滚的原因,因为第二次直接查看效果是可以得到的
2. 实验任务2
ex2.asm源码
1 ; ex2.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 mov bx, 0 7 mov ax, 101H 8 mov cx, 4 9 s: mov [bx], ax 10 add bx, 2 11 add ax, 101H 12 loop s 13 mov ah, 4ch 14 int 21h 15 code ends 16 end
使用masm.link工具汇编,链接的命令及运行结果
结合可执行文件中寄存器CX的值,使用u命令对ex2.exe进行精确反汇编
灵活使用t命令、p命令、g命令,对ex2.exe进行调试。
注意:单步调试时,对于循环指令loop, 中断指令int,使用t命令和p命令单步调试的区别。
把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,保存后重新汇编、链接、运行并观察结果。
结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
答:两者效果相同,但实现方式不同,ex1.asm是将一步步将数据放入指定内存,ex2.asm利用loop和[bx]指令,大大缩短了重复代码,并且易于更改,如:只需改变步长,便可增加图形显示
3. 实验任务3
综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。
1 ;ex3.asm 2 assume cs:code 3 code segment 4 mov ax,0b800H 5 mov ds,ax 6 7 mov bx,7b8H 8 mov ax,0237H 9 mov cx,10H 10 s: mov [bx],ax 11 add bx,2 12 loop s 13 14 mov ah,4ch 15 int 21h 16 code ends 17 end
把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,观察结果。
把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察结果。
猜测并分析,这个字数据中高位字节里存放的是什么信息,低位字节里存放的是什么信息。
高字节存放颜色信息,低字节存放内容信息
4. 实验任务4
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
1)综合使用[bx]和loop,编写汇编源程序
1 ;ex4.asm 2 assume cs:code 3 code segment 4 mov ax,0020h 5 mov ds,ax 6 7 mov bx,0H 8 mov ax,0H 9 mov cx,64 10 s: mov [bx],al 11 inc bx 12 inc ax 13 loop s 14 15 mov ah,4ch 16 int 21h 17 code ends 18 end
灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。
2)利用栈的特性,综合使用loop,push实现(限定仅使用8086中已学过指令实现),编写源程序
1 ;ex4_.asm 2 assume cs:code 3 code segment 4 mov ax,0020h 5 mov ss,ax 6 mov sp,0040h 7 8 mov bh,3fH 9 mov bl,3eH 10 mov cx,64 11 s: push bx 12 add bh,-2h 13 add bl,-2h 14 loop s 15 16 mov ah,4ch 17 int 21h 18 code ends 19 end
灵活使用debug的t命令、g命令、p命令调试。在程序退出前,用d命令查看 0:200~0:23F,确认是否将0~3F传送至此段内存区域。
5. 实验任务5
将“mov ax,4c00h"之前的指令复制到内存0:200处,补全程序
1 ;ex5.asm 2 assume cs:code 3 code segment 4 mov ax,cs 5 mov ds,ax 6 mov ax,0020h 7 mov es,ax 8 mov bx,0 9 mov cx,23 10 s: mov al,[bx] 11 mov es:[bx],al 12 inc bx 13 loop s 14 15 mov ax,4c00h 16 int 21h 17 code ends 18 end
1)复制的是什么,从哪里到哪里
复制字节数据,从cs代码段到ds数据段,即0:200处
2)复制的是什么,有多少个字节,如何知道要复制的字节数量
字节数量要看代码占多少字节,如果熟悉代码可以直接计算,我是先假设有多少字节,然后反汇编查看代码再计算