1 ;ex1.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 7 mov byte ptr ds:[0], 1 8 mov byte ptr ds:[1], 1 9 mov byte ptr ds:[2], 2 10 mov byte ptr ds:[3], 2 11 mov byte ptr ds:[4], 3 12 mov byte ptr ds:[5], 3 13 mov byte ptr ds:[6], 4 14 mov byte ptr ds:[7], 4 15 16 mov ah, 4ch 17 int 21h 18 code ends 19 end
1 ; ex2.asm 2 assume cs:code 3 code segment 4 mov ax, 0b810h 5 mov ds, ax 6 7 mov bx, 0 8 mov ax, 101H 9 mov cx, 4 10 s: mov [bx], ax 11 add bx, 2 12 add ax, 101H 13 loop s 14 15 mov ah, 4ch 16 int 21h 17 code ends 18 end
首先用g命令执行到loop指令,而后再使用t命令进行单步调试,发现下一条是int指令时使用p命令,即步过中断指令。
第二次尝试使用t命令进入loop循环,一次循环结束之后用p命令直接执行完loop,并尝试用t命令跟踪INT 21h命令,发现下一指令为STI。通过查阅资料了解到该指令全称为Set Interupt,作用是允许中断发生。在STI起效之后,所有外部中断都被恢复,这样可以打破被保护代码的运行,允许硬件中断转而处理中断的作用。
二者实现了相同的功能,都是向b810:0000开始的连续8个字节依次填充1 1 2 2 3 3 4 4,在具体实现上ex1.asm是一条一条指令将数据送入,而ex2.asm是采取循环的方式。
1 assume cs:code 2 code segment 3 mov ax,0b800h 4 mov ds,ax 5 mov bx,07b8h 6 mov cx,16 7 s: mov [bx],0437h 8 add bx,2 9 loop s 10 mov ah,4ch 11 int 21h 12 code ends 13 end
通过对比以上的三张图片,不难发现第一张与第二张显示的数字不同,第一张与第三张显示的颜色不同,故此猜想高位字节存放的是颜色信息,低位存放的是字符信息。
1 assume cs:code 2 code segment 3 mov ax,0020h 4 mov ds,ax 5 mov cx,64 6 mov bx,0 7 s: mov [bx],bl 8 add bx,1 9 add al,1 10 loop s 11 mov ah,4ch 12 int 21h 13 code ends 14 end
根据下图的结果,可以确定已经成功将0~3F传送至0:200~0:23F。
1 assume cs:code 2 code segment 3 mov ax,cs 4 mov ds,ax 5 mov ax,0020h 6 mov es,ax 7 mov bx,0 8 mov cx,17h 9 s: mov al,[bx] 10 mov es:[bx],al 11 inc bx 12 loop s 13 mov ax,4c00h 14 int 21h 15 code ends 16 end
line3和line4的功能是给到程序一个源地址,故填入cs;line8的功能是设置循环次数,可以先随便填入一个数字,我试验时填入了7,然后用u命令查看得到mov ax,4c00h之前的指令一共需要多少字节。通过下图可知,一共需要从0到16h的17个字节,故填入17。
本次直接使用g命令调试整段程序。
使用d命令可以得到如下的结果。
使用u命令进行反汇编,确定此时mov ax, 4c00h之前的指令已经复制到指定位置。
原文:https://www.cnblogs.com/jewnicorner/p/13927448.html