|
主题 : : 实验四----看清DEBUG程序如何让被调试程序一条一条执行 [待解决] |
回复[ 4次 ]
点击[ 464次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2012-07-10 01:08 ]
[引用]
[回复]
[ top ] | |
荣誉值:8
信誉值:0
注册日期:2010-07-12 08:47 |
assume cs:code
code segment
mov ax,cs ;给cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,cx ;给cx,cx默认时整个程序的长度
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
这个程序原意应该是把自己整个程序都复制到0:200h里面。包括mov ax,4c00h int 21h 。
源程序,详细看0B4D:0014~0B4D:0019的机器码。
-r
AX=0000 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3D ES=0B3D SS=0B4D CS=0B4D IP=0000 NV UP EI PL NZ NA PO NC
0B4D:0000 8CC8 MOV AX,CS
-u
0B4D:0000 8CC8 MOV AX,CS
0B4D:0002 8ED8 MOV DS,AX
0B4D:0004 B82000 MOV AX,0020
0B4D:0007 8EC0 MOV ES,AX
0B4D:0009 BB0000 MOV BX,0000
0B4D:000C 8BC9 MOV CX,CX
0B4D:000E 8A07 MOV AL,[BX]
0B4D:0010 26 ES:
0B4D:0011 8807 MOV [BX],AL
0B4D:0013 43 INC BX
0B4D:0014 E2F8 LOOP 000E
0B4D:0016 B8004C MOV AX,4C00
0B4D:0019 CD21 INT 21
下面时程序运行到mov ax,4c00h时0:200的指令。仔细看0:0216 ~021A 的机器码。
AX=0021 BX=001B CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B4D ES=0020 SS=0B4D CS=0B4D IP=0016 NV UP EI PL NZ NA PE NC
0B4D:0016 B8004C MOV AX,4C00
-u 0:200
0000:0200 8CC8 MOV AX,CS
0000:0202 8ED8 MOV DS,AX
0000:0204 B82000 MOV AX,0020
0000:0207 8EC0 MOV ES,AX
0000:0209 BB0000 MOV BX,0000
0000:020C 8BC9 MOV CX,CX
0000:020E 8A07 MOV AL,[BX]
0000:0210 26 ES:
0000:0211 8807 MOV [BX],AL
0000:0213 43 INC BX
0000:0214 E2F8 LOOP 020E
0000:0216 CC INT 3
0000:0217 004CCD ADD [SI-33],CL
0000:021A 2100 AND [BX+SI],AX
;以下是原来就有的数据。我全部给的0(看机器码)。
0000:021C 0000 ADD [BX+SI],AL
0000:021E 0000 ADD [BX+SI],AL
2个程序的不同点:
源程序:
0B4D:0014 E2F8 LOOP 000E
0B4D:0016 B8004C MOV AX,4C00
0B4D:0019 CD21 INT 21
目的程序:
0000:0214 E2F8 LOOP 020E
0000:0216 CC INT 3
0000:0217 004CCD ADD [SI-33],CL
0000:021A 2100 AND [BX+SI],AX ;这里2100后面的00时我原本给的0,不是复制过来的。
在loop s指令上时我用的p命令以运行到mov ax,4c00h处。程序运行到mov ax,4c00h时,程序居然给了条Int 3中断。
不知不觉中,debug没有把整个程序按原样复制到0:200,而是在loop s(loop 020E)后面把B8004C(mov ax,4c00h)中的B8换成了CC(INT 3)然后再复制的。
根据以上,我这样猜想。
在loop s上时,当我执行p命令后,P命令用CC(int 3)替换掉后面一条指令的第一字节。然后运行loop循环直到loop结束(这时IP为mov ax,4c00h的地址),因为loop后面是Int 3.所以程序会暂停在这里。这时,P命令在把原来的机器码B8(mov ax,4c00h的一部分)再换回来。所以我们就看到P命令执行后暂停在了mov ax,4c00h而没有看到int 3.
但为什么0:200有Int 3呢?看上面的分析,P命令是在LOOP结束时才把int 3换走,此时loop已经把最后的int 21h复制到了0:200处了,复制的程序里面就有被替换的int 3指令。从这里可以看到既然P命令是用int 3,那t命令自然也是用的int 3才能让程序能运行一条就暂停。
而王爽之所以出题说不要将mov ax,4c00h及后面的程序复制过去。或许原因之一就时因为后面跟本就没有mov ax,4c00h,而只有一条int 3后2条奇怪的代码。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2012-07-10 07:19 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
这个程序原意应该是把自己整个程序都复制到0:200h里面。包括mov ax,4c00h int 21h 。
这句话的理解是错误的。。
题目原意是,
向内存0:200~0:23f 送入数据0~3fh
功能的实现只能用9条指令。(mov ax,4c00h int 21h算2条指令。)
不是说将程序送入0:200~0:23f | | |
|
|
|
|
[第2楼]
[ 回复时间:2012-07-18 15:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2012-07-15 10:30 |
|
|
|
|
|
[第3楼]
[ 回复时间:2012-07-19 07:21 ]
[引用]
[回复]
[ top ] | |
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36 |
回复:[第2楼]
------------------
求指教。 | | |
|
|
|
|
[第4楼]
[ 回复时间:2012-08-28 02:24 ]
[引用]
[回复]
[ top ] | |
荣誉值:2
信誉值:0
注册日期:2012-08-22 18:48 |
第二题降到7条指令:
只用改一下DS段地址为0020H即可将一个变量重复使用,既作为便宜地址的递增,也可以作为向偏移地址赋值的内容,不用再重设一个变量。
mov ax,0020h
mov ds,ax
mov bl,0
mov cx,64
xx: mov [bl],bl
inc bl
loop xx | | |
|