实验2 汇编源程序编写与汇编、调试
一 实验结论
1.实验任务一
;ex1.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov byte ptr ds:[0], 1 mov byte ptr ds:[1], 1 mov byte ptr ds:[2], 2 mov byte ptr ds:[3], 2 mov byte ptr ds:[4], 3 mov byte ptr ds:[5], 3 mov byte ptr ds:[6], 4 mov byte ptr ds:[7], 4 mov ah, 4ch int 21h code ends end
使用link对ex1.asm进行链接
执行ex1.exe
可以看到出现了四个不同的图案
在debug中执行ex1.exe
首先使用r命令查看寄存器的值
由反汇编后的结果可知line 16 mov ah,4ch的偏移地址为002D,所以使用g 002d这个指令
我们可以看到出现了四个彩色图案
2.实验任务二
; ex2.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov bx, 0 mov ax, 101H mov cx, 4 s: mov [bx], ax add bx, 2 add ax, 101H loop s mov ah, 4ch int 21h code ends end
使用link对ex2.asm进行链接
运行ex2.exe观察结果
结果:屏幕上方出现了不同颜色的图案
使用debug工具对程序进行调试
使用g命令调试到move ah,ac 之前,再用t命令进行单步调试,最后使用p调试int 21,结束程序.
没有出现图案的原因可能是因为屏幕滚动图案就消失了,当清屏后就出现了图案。
屏幕上出现了八个图案
ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在具体实现上有什么不同?
他们的功能和效果都相同,都输出了四个不同的图案,但是ex1.asm是直接寻址,而ex2.asm是通过寄存器bx间接寻址,ex2.asm把4改成了8,所以输出了八个图案。
3.实验任务三
;ex3.asm assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov ax,0237h mov cx,16s: mov [bx],ax add bx,2 loop s mov ah,4ch int 21h code ends end
对程序进行汇编,链接
为了更好地观察结果,我们清屏之后再运行程序,可以看到屏幕中间出现了许多问号
通过结果我们可以发现,改变低位字节,字符变了颜色没变,改变高位字节和低位字节,字符和颜色都变了。所以高位字节存放的是颜色信息,而地位字节则存放的是输出字符的信息。
4.实验任务四
;ex4.asm assume cs:code code segment mov ax,0020h mov ds,ax mov bx,0 mov cx,40h s: mov [bx],bl inc bx loop s mov ah,4ch int 21h code ends End
先将程序进行汇编和链接,因为这个程序没有向显存输入信息,所以我们在屏幕上不会看到图案
先使用r命令查看寄存器的信息,再用u命令进行精确的反汇编
使用4个t命令单步运行
再用g命令执行到loop 000b之前
然后对loop指令使用p命令
使用d命令查看内存单元,可以看到实现了向内存0:200~0:23F依次传送数据0~63(3FH)的功能。
5.实验任务五
;ex5.asm assume cs:code code segment mov ax,___ mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,___ s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
因为需要将 mov ax,4c00h 前的代码复制到内存 0:200 处,所以需要先确认复制的长度。第一空填cs,第二问先随意填数,对代码进行反汇编。
由图可知,mov ax,4c00命令在0018,所以应该将0017赋给cx,代码为:
;ex5.asm assume cs:code code segment mov ax,cs mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,0017h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
运行后查看0:200的内容
由此我们可以看到,0:200后的内容成功实现了复制。
二 实验总结
1.通过这次实验,我掌握了如何对程序进行汇编,链接,运行,如何对程序实现精确反汇编。
2.LOOP指令,是循环指令,循环次数由计数寄存器CX指定。是否执行循环体的判断指令在循环体之后,至少执行1次循环体,即至少循环1次。
执行LOOP指令时,CPU自动将CX的值减1,若CX=0,则结束循环;否则,重复执行循环体。
3.有时观察不到图形可以使用清屏操作。