ffff:0-ffff:d内存中数值求和放入dx寄存器中
代码:
add.asm
1 assume cs:code 2 code segment 3 mov ax,0ffffH 4 mov ds,ax 5 6 mov dx,0 7 8 mov al,ds:[0] 9 mov ah,0 10 add dx,ax 11 12 mov al,ds:[1] 13 mov ah,0 14 add dx,ax 15 16 mov al,ds:[2] 17 mov ah,0 18 add dx,ax 19 20 mov al,ds:[3] 21 mov ah,0 22 add dx,ax 23 24 mov al,ds:[4] 25 mov ah,0 26 add dx,ax 27 28 mov al,ds:[5] 29 mov ah,0 30 add dx,ax 31 32 mov al,ds:[6] 33 mov ah,0 34 add dx,ax 35 36 mov al,ds:[7] 37 mov ah,0 38 add dx,ax 39 40 mov al,ds:[8] 41 mov ah,0 42 add dx,ax 43 44 mov al,ds:[9] 45 mov ah,0 46 add dx,ax 47 48 mov al,ds:[0ah] 49 mov ah,0 50 add dx,ax 51 52 mov al,ds:[0bh] 53 mov ah,0 54 add dx,ax 55 56 mov ax,4c00H 57 int 21h 58 code ends 59 end
编译,链接add.adm
masm add;
link add;
执行add.exe
如上图
-r 将显示寄存器值. cs:ip 为 0B60:0000为程序起始地址
-t 则执行程序 显示为上一次执行后的寄存器内容,最后一行为 将要执行的指令,
-u 显示汇编代码,及内存中得位置.如现在程序开始地址为 0B60:0003 MOV DS,AX 默认从cs:ip指向的地址显示代码
接上图
-g 偏移地址, 表示执行到001D为止, 001D处的代码还未执行.类似断点跟踪
-p int 21h要用p命令执行
以上程序可用loop优化,优化后为:
连续内存可以使用[bx]方法
1 assume cs:code 2 code segment 3 mov ax,0ffffH 4 mov ds,ax 5 mov bx,0 6 7 mov dx,0 8 9 mov cx,12 10 s:mov al,[bx] 11 mov ah,0 12 add dx,ax 13 inc bx 14 loop s 15 16 mov ax,4c00H 17 int 21h 18 19 code ends 20 end
执行LOOP循环:
(1) 用-g直接指定到 0015 loop代码段,使用-p
-p 在遇到LOOP 000E时,用-p命令执行,Debug自动重复执行loop中内存,直到(cx) = 0
最后一次执行loop 000E后, (cx) = 0 (IP) = 0017H,当前CS:0017处的mov ax,4c00H.
(2) 用 -g 直接执行到 cs:0017
-g 0017