实验2 汇编源程序编写与汇编调试

Posted feiranyue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验2 汇编源程序编写与汇编调试相关的知识,希望对你有一定的参考价值。

四、实验结论

1.实验任务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

对ex1.asm进行汇编链接:

技术图片

可以看到对应目录下出现ex1.exe:

技术图片

 然后需要进行debug才能查看是否成功修改内存,首先r命令与u命令查看寄存器状态以及程序代码是否正确:

技术图片

使用d命令查看程序段前缀PSP,可以看到其中有ex1.exe表明程序的名称以及一些其他信息有存储在PSP中:

技术图片

 然后根据u命令得到各个指令对应的地址,然后准确执行到Mov ah,4c前,可以看到dosbox窗口右上角出现图案,程序成功实现功能,修改显存内容:

技术图片

2.实验任务2

ex2.asm程序源代码如下:

;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

对程序进行汇编链接:

技术图片

得到ex2.exe文件:

技术图片

 使用r命令查看寄存器状态与然后使用u命令进行精确反汇编:

技术图片

 根据u命令反汇编得到loop指令在偏移地址为0016H的地址,因此使用g命令执行到loop命令前,若执行超过则可能会崩溃,并且使用d命令查看此次操作成功修改了第一处内存单元,右上角显示了一个图案:

技术图片

 然后使用p命令执行loop循环,可以看到b810h:0000h开始的显存的四个单元成功依次存入了0101h,0202h,0303h,0404h,右上角成功显示了四个图案:

技术图片

 然后选择不使用p命令执行循环指令,而是选择t命令执行,可以看到t命令进入了loop循环内部进行依次执行每条指令:

技术图片

 然后先使用t命令执行INT21指令,可以看到程序同样进入INT 21内部执行每一条指令,需要执行很多条指令程序才能成功正确执行:

技术图片

技术图片

技术图片

 而使用p命令,则直接输出程序被成功执行,说明p命令对于非基本的指令不会呈现指令内部的实现,而是直接执行完后显示结果:

技术图片

      结合上述实验和观察,分析、对比ex2.asm和ex1.asm,它们实现的是否是相同的功能和效果?在
具体实现上有什么不同?
答:可以看到ex1.asm和ex2.asm的功能与效果相同,但在实现上ex1是手动输入重复的代码,而ex2则使用loop循环对类似代码段进行反复执行,代码冗余少。

 3.实验任务3

ex3.asm程序源代码如下:

;ex3.asm
assume cs:code
code segment
mov ax,0b800h
mov ds,ax
mov bx,07b8h
mov ax,0437H
mov cx,0010H
s: mov [bx],ax
add bx,2
loop s
mov ah,4ch
int 21h
code ends
end

进行汇编链接后debug,可以看到屏幕中央出现16个绿色问号符合预期效果,同时使用d命令可以查看到对应显存已被成功修改:

技术图片

把填充的字数据,从0237H 改成0239H,再次保存后,汇编、链接、运行,可以看到问号的值变成了9,说明填充的数据低位表示字符的内容样式:
技术图片
把填充的字数据,从0237H 改成0437H,再次保存后,汇编、链接、运行,观察到问号的颜色变成了红色,说明高位字节存放的是颜色:
技术图片

 4.实验任务4:

ex4.asm源代码:

assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,0200H
mov ax,0
mov cx,0040H
s: mov [bx],ax
add bx,1
add ax,1
loop s
mov ah,4ch
int 21h
code ends
end

对程序进行汇编链接后debug ex4.exe,首先使用r命令查看寄存器状态并且使用u命令精确反汇编:

技术图片

然后根据反汇编得到的指令地址进行执行,并且查看0:0200H到0:023f内存的内容,可以看到数据0~63(3FH)成功存入:

技术图片

 5.实验任务5:

ex5.asm源代码:

assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,0016h
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

 

本题要求程序将自身mov ax,4c00h之前的内容复制到内存:200处,因此存放程序代码的地址是cs:ip。所以段地址ds应该通过ax存入cs的值,然后问题就在于循环执行多少次才能保证刚好将mov ax,4c00h之前的内容刚好存入,可以看到每次bx+1,因此一次循环存入一个字节内容,然后只要确认存入的程序字节数就是cx的值,因此可以选择将不确认的cx的值先随便设置为0001h然后进行debug,反汇编查看mov ax,4ch在程序中的地址是076A:0017

技术图片

 然后因此将cx的值设置为0016H,重新汇编链接,进行debug:

技术图片

 使用u命令对0:200 220的内容进行反汇编,可以看到刚好在0000:0217H开始是程序的无关内容,说明成功存入:

技术图片

 

 五、实验总结

        存在的问题就是不理解关于t命令分布执行每一次修改内存的指令时当新的t命令结果超出原本的屏幕,感觉会进行刷新,显存就无法正确修改的机制。

 










































































以上是关于实验2 汇编源程序编写与汇编调试的主要内容,如果未能解决你的问题,请参考以下文章

实验2 汇编源程序编写与汇编调试

实验2 汇编源程序编写与汇编调试

实验2 多个逻辑段的汇编源程序编写与调试

实验2 汇编程序编写与调试

实验2 多个逻辑段的汇编源程序编写与调试

实验3 多个段的汇编源程序编写与调试