(1)(2)
C:\masm>debug ex4-1.exe
-u0 13
0B6D:0000 B82000 MOV AX,0020
0B6D:0003 8ED8 MOV DS,AX
0B6D:0005 BB0000 MOV BX,0000
0B6D:0008 B94000 MOV CX,0040
0B6D:000B 881F MOV [BX],BL
0B6D:000D 43 INC BX
0B6D:000E E2FB LOOP 000B
0B6D:0010 B8004C MOV AX,4C00
0B6D:0013 CD21 INT 21
-r
AX=0000 BX=0000 CX=0015 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B5D ES=0B5D SS=0B6D CS=0B6D IP=0000 NV UP EI PL NZ NA PO NC
0B6D:0000 B82000 MOV AX,0020
-t
AX=0020 BX=0000 CX=0015 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B5D ES=0B5D SS=0B6D CS=0B6D IP=0003 NV UP EI PL NZ NA PO NC
0B6D:0003 8ED8 MOV DS,AX
-t
AX=0020 BX=0000 CX=0015 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=0005 NV UP EI PL NZ NA PO NC
0B6D:0005 BB0000 MOV BX,0000
-t
AX=0020 BX=0000 CX=0015 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=0008 NV UP EI PL NZ NA PO NC
0B6D:0008 B94000 MOV CX,0040
-t
AX=0020 BX=0000 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=000B NV UP EI PL NZ NA PO NC
0B6D:000B 881F MOV [BX],BL DS:0000=00
-t
AX=0020 BX=0000 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=000D NV UP EI PL NZ NA PO NC
0B6D:000D 43 INC BX
-t
AX=0020 BX=0001 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=000E NV UP EI PL NZ NA PO NC
0B6D:000E E2FB LOOP 000B
-t
AX=0020 BX=0001 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=000B NV UP EI PL NZ NA PO NC
0B6D:000B 881F MOV [BX],BL DS:0001=01
-t
AX=0020 BX=0001 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=000D NV UP EI PL NZ NA PO NC
0B6D:000D 43 INC BX
-t
AX=0020 BX=0002 CX=003F DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=000E NV UP EI PL NZ NA PO NC
0B6D:000E E2FB LOOP 000B
-p
AX=0020 BX=0040 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B5D SS=0B6D CS=0B6D IP=0010 NV UP EI PL NZ AC PO NC
0B6D:0010 B8004C MOV AX,4C00
-d ds:0 3f
0020:0000 00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F ................
0020:0010 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F ................
0020:0020 20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
0020:0030 30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>?
之前在用执行可执行文件的方法运行过一次,所以单步执行时,“mov [bx],bl”执行前,ds:0和ds:1就已经是所要求的数据了。
(3)这个题目,从前天晚上就开始考虑,这两天事情比较多,一直没有动手调试。第二个空让我百思不得其解。最后想到教材里提到“debug加载一个程序后,cx中存放的是这个程序的长度”,于是把第二个空填cx试试看。当然,这不符合题目要求。题目要求是“mov ax,4c00h”之前的指令复制过去,要是我这样处理,就会把整个程序复制过去。最后两条指令长度为5个字节,但是“mov cx,cx-5”这样的指令存在语法错误。姑且用“mov cx,cx”试试吧。
assume cs:code
code segment
mov ax,code
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,cx
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
调试结果如下:
C:\masm>debug 4-2.exe
-r
AX=0000 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B5C ES=0B5C SS=0B6C CS=0B6C IP=0000 NV UP EI PL NZ NA PO NC
0B6C:0000 B86C0B MOV AX,0B6C
-u0 1a
0B6C:0000 B86C0B MOV AX,0B6C
0B6C:0003 8ED8 MOV DS,AX
0B6C:0005 B82000 MOV AX,0020
0B6C:0008 8EC0 MOV ES,AX
0B6C:000A BB0000 MOV BX,0000
0B6C:000D 8BC9 MOV CX,CX
0B6C:000F 8A07 MOV AL,[BX]
0B6C:0011 26 ES:
0B6C:0012 8807 MOV [BX],AL
0B6C:0014 43 INC BX
0B6C:0015 E2F8 LOOP 000F
0B6C:0017 B8004C MOV AX,4C00
0B6C:001A CD21 INT 21
-d 20:0
0020:0000 00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F ................
0020:0010 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F ................
0020:0020 20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
0020:0030 30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>?
0020:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-g 17
AX=0021 BX=001C CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0017 NV UP EI PL NZ NA PO NC
0B6C:0017 B8004C MOV AX,4C00
-d 20:0
0020:0000 B8 6C 0B 8E D8 B8 20 00-8E C0 BB 00 00 8B C9 8A .l.... .........
0020:0010 07 26 88 07 43 E2 F8 CC-00 4C CD 21 1C 1D 1E 1F .&..C....L.!....
0020:0020 20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
0020:0030 30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>?
0020:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-u 20:0
0020:0000 B86C0B MOV AX,0B6C
0020:0003 8ED8 MOV DS,AX
0020:0005 B82000 MOV AX,0020
0020:0008 8EC0 MOV ES,AX
0020:000A BB0000 MOV BX,0000
0020:000D 8BC9 MOV CX,CX
0020:000F 8A07 MOV AL,[BX]
0020:0011 26 ES:
0020:0012 8807 MOV [BX],AL
0020:0014 43 INC BX
0020:0015 E2F8 LOOP 000F
0020:0017 CC INT 3
0020:0018 004CCD ADD [SI-33],CL
0020:001B 211C AND [SI],BX
0020:001D 1D1E1F SBB AX,1F1E
反汇编后发现,居然只有“mov ax,4c00h”之前的复制过来了!但是我的循环次数明明是1c——整个程序长度。为什么会这样?仔细观察,发现只是0020:0017单元的内容,本来应该是B8,但实际结果是CC。再用“g=0 17”执行一次,居然就退出debug了!重新加载,第一次执行,就跟上面结果一样,第二次执行,就直接退出debug。仔细分析,发现问题。因为程序中对cx赋值,是“mov cx,cx”,第一次执行后,cx已经为0,再次执行,执行到loop指令时,cx减1,变成了FFFFH,循环次数错了。为什么会退出,我没有细想,先放一放。
修改cx,单步执行,几行指令后,用p命令执行loop。结果如下:
-rcx
CX 0000
:1c
-rip
IP 0017
:0
-t
AX=0B6C BX=001C CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0003 NV UP EI PL NZ NA PO NC
0B6C:0003 8ED8 MOV DS,AX
-t
AX=0B6C BX=001C CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0005 NV UP EI PL NZ NA PO NC
0B6C:0005 B82000 MOV AX,0020
-t
AX=0020 BX=001C CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0008 NV UP EI PL NZ NA PO NC
0B6C:0008 8EC0 MOV ES,AX
-t
AX=0020 BX=001C CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=000A NV UP EI PL NZ NA PO NC
0B6C:000A BB0000 MOV BX,0000
-t
AX=0020 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=000D NV UP EI PL NZ NA PO NC
0B6C:000D 8BC9 MOV CX,CX
-t
AX=0020 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=000F NV UP EI PL NZ NA PO NC
0B6C:000F 8A07 MOV AL,[BX] DS:0000=B8
-t
AX=00B8 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0011 NV UP EI PL NZ NA PO NC
0B6C:0011 26 ES:
0B6C:0012 8807 MOV [BX],AL ES:0000=B8
-t
AX=00B8 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0014 NV UP EI PL NZ NA PO NC
0B6C:0014 43 INC BX
-t
AX=00B8 BX=0001 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0015 NV UP EI PL NZ NA PO NC
0B6C:0015 E2F8 LOOP 000F
-t
AX=00B8 BX=0001 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=000F NV UP EI PL NZ NA PO NC
0B6C:000F 8A07 MOV AL,[BX] DS:0001=6C
-t
AX=006C BX=0001 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0011 NV UP EI PL NZ NA PO NC
0B6C:0011 26 ES:
0B6C:0012 8807 MOV [BX],AL ES:0001=6C
-t
AX=006C BX=0001 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0014 NV UP EI PL NZ NA PO NC
0B6C:0014 43 INC BX
-t
AX=006C BX=0002 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0015 NV UP EI PL NZ NA PO NC
0B6C:0015 E2F8 LOOP 000F
-p
AX=0021 BX=001C CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0017 NV UP EI PL NZ NA PO NC
0B6C:0017 B8004C MOV AX,4C00
-d 20:0 1f
0020:0000 B8 6C 0B 8E D8 B8 20 00-8E C0 BB 00 00 8B C9 8A .l.... .........
0020:0010 07 26 88 07 43 E2 F8 CC-00 4C CD 21 1C 1D 1E 1F .&..C....L.!....
查看内存的0020:0017单元,发现还是cc。只好用笨办法,用单步执行,看看到底是哪一步出了问题。
-rcx
CX 0000
:1c
-rip
IP 0017
:0
-t
AX=0B6C BX=001C CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0003 NV UP EI PL NZ NA PO NC
0B6C:0003 8ED8 MOV DS,AX
-t
AX=0B6C BX=001C CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0005 NV UP EI PL NZ NA PO NC
0B6C:0005 B82000 MOV AX,0020
-t
AX=0020 BX=001C CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0008 NV UP EI PL NZ NA PO NC
0B6C:0008 8EC0 MOV ES,AX
………………………………………………
-t
AX=004C BX=001A CX=0003 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0015 NV UP EI PL NZ NA PO NC
0B6C:0015 E2F8 LOOP 000F
-t
AX=004C BX=001A CX=0002 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=000F NV UP EI PL NZ NA PO NC
0B6C:000F 8A07 MOV AL,[BX] DS:001A=CD
-t
AX=00CD BX=001A CX=0002 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0011 NV UP EI PL NZ NA PO NC
0B6C:0011 26 ES:
0B6C:0012 8807 MOV [BX],AL ES:001A=CD
-t
AX=00CD BX=001A CX=0002 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0014 NV UP EI PL NZ NA PO NC
0B6C:0014 43 INC BX
-t
AX=00CD BX=001B CX=0002 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0015 NV UP EI PL NZ NA PE NC
0B6C:0015 E2F8 LOOP 000F
-t
AX=00CD BX=001B CX=0001 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=000F NV UP EI PL NZ NA PE NC
0B6C:000F 8A07 MOV AL,[BX] DS:001B=21
-t
AX=0021 BX=001B CX=0001 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0011 NV UP EI PL NZ NA PE NC
0B6C:0011 26 ES:
0B6C:0012 8807 MOV [BX],AL ES:001B=21
-t
AX=0021 BX=001B CX=0001 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0014 NV UP EI PL NZ NA PE NC
0B6C:0014 43 INC BX
-t
AX=0021 BX=001C CX=0001 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0015 NV UP EI PL NZ NA PO NC
0B6C:0015 E2F8 LOOP 000F
-t
AX=0021 BX=001C CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=0017 NV UP EI PL NZ NA PO NC
0B6C:0017 B8004C MOV AX,4C00
-t
AX=4C00 BX=001C CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B6C ES=0020 SS=0B6C CS=0B6C IP=001A NV UP EI PL NZ NA PO NC
0B6C:001A CD21 INT 21
-d 20:0 1f
0020:0000 B8 6C 0B 8E D8 B8 20 00-8E C0 BB 00 00 8B C9 8A .l.... .........
0020:0010 07 26 88 07 43 E2 F8 B8-00 4C CD 21 1C 1D 1E 1F .&..C....L.!....
全程用t命令执行下来,我直接哭了。0020:0017,居然是B8!
难道用t命令和g命令执行,对结果也有影响吗???
另外,这个题,到底应该怎么做呀?
真是要崩溃了,55555
PS:刚才做检测题,居然碰到了类似的题目:
对于如下程序
assume cs:code
code segment
start:mov ax,code
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end
下列说法正确的是______。
1、 指令mov ax,code改为mov ax,start对程序要实现的功能没有任何影响。
2、 程序不能通过编译,因为在loop指令之前,没有对寄存器cx进行设定。
3、 程序实现的功能是将程序的所有指令复制到内存中以0:200h为起始地址的一段内存空间中。
4、 程序实现的功能是用内存中以0:200h为起始地址的一段内存空间中的数据将程序的所有指令覆盖。
答案是3。
他直接就没有设置cx。
- [游客] 感谢 11/15 22:10
- [游客] 把:DD 5937000,改成:DD 4294967295,你的错误,立刻就暴露出来。呵呵 05/19 18:30
- [游客] 计算人均时,是DD型除以DW型。把DD型的最大值代进去,你的程序,就溢出了。 05/19 18:28
- [游客] 注意不溢出的除法。 05/19 18:25
- [游客] 老师好啊~ 06/28 11:01
- [longphui] 谢谢 09/03 20:10
- [longphui] 谢谢 09/03 16:23
- [longphui] 谢谢 09/02 15:26
- [longphui] 谢谢 09/02 09:13
- [sissim] 恩恩,谢谢指正 01/11 18:24
- [even3] 亲,你好。。。这边有一个汇编语言程序,但是就是不知道哪里出了问题,问了很多人,都不知道想麻烦您一下, 05/16 20:48
- [mcjfo] 楼主可以帮我解决这个问题吗?谢谢! 为什么它会跳过JMP DD 指令不执行啊 小弟搞了好久抖没 06/08 06:50