标签:颜色 开始 图片 debug 链接 内容 一次循环 sum 窗口
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窗口右上角出现图案,程序成功实现功能,修改显存内容:
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命令对于非基本的指令不会呈现指令内部的实现,而是直接执行完后显示结果:
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命令可以查看到对应显存已被成功修改:
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)成功存入:
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命令结果超出原本的屏幕,感觉会进行刷新,显存就无法正确修改的机制。
标签:颜色 开始 图片 debug 链接 内容 一次循环 sum 窗口
原文地址:https://www.cnblogs.com/feiranyue/p/13934521.html