说明:这个实验(1)和(2)题目是相同,只是试验(2)要求简化代码,原本想偷个懒,但想想还是做一次吧,有比较,才有优劣嘛!
----------------------------------------------------------------------------------------------------------------
(1)代码如下:
assume cs:code
code segment
mov ax,0
mov ds,ax
mov bx,200h
mov dx,0
mov cx,64
s:
mov [bx],dx ;可以换成mov [bx],dl
inc bx
inc dx ;可以换成inc dl
loop s
mov ax,4c00h
int 21h
code ends
end
------------------------------------------------------------------------------------
在debug中跟踪一下:
------------------------------------------------------------------------------------
D:\masm>debug 41.exe
-r
AX=0000 BX=0000 CX=0019 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B2F ES=0B2F SS=0B3F CS=0B3F IP=0000 NV UP EI PL NZ NA PO NC
0B3F:0000 B80000 MOV AX,0000
-------------------------------------------------------------------------------------
查看一个目标单元内容:全为0。
-------------------------------------------------------------------------------------
-d 0:200
0000:0200 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0210 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-t
AX=0000 BX=0000 CX=0019 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B2F ES=0B2F SS=0B3F CS=0B3F IP=0003 NV UP EI PL NZ NA PO NC
0B3F:0003 8ED8 MOV DS,AX
-t
AX=0000 BX=0000 CX=0019 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=0005 NV UP EI PL NZ NA PO NC
0B3F:0005 BB0002 MOV BX,0200
-t
AX=0000 BX=0200 CX=0019 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=0008 NV UP EI PL NZ NA PO NC
0B3F:0008 BA0000 MOV DX,0000
-t
AX=0000 BX=0200 CX=0019 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=000B NV UP EI PL NZ NA PO NC
0B3F:000B B94000 MOV CX,0040
-t
AX=0000 BX=0200 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=000E NV UP EI PL NZ NA PO NC
0B3F:000E 8917 MOV [BX],DX DS:0200=0000
-t
AX=0000 BX=0200 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=0010 NV UP EI PL NZ NA PO NC
0B3F:0010 43 INC BX
-t
AX=0000 BX=0201 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=0011 NV UP EI PL NZ NA PO NC
0B3F:0011 42 INC DX
-t
AX=0000 BX=0201 CX=0040 DX=0001 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=0012 NV UP EI PL NZ NA PO NC
0B3F:0012 E2FA LOOP 000E
-----------------------------------------------------------------------------
在这跟了几次循环,一切正常,直接g14吧
------------------------------------------------------------------------------
-g 14
AX=0000 BX=0240 CX=0000 DX=0040 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=0014 NV UP EI PL NZ AC PO NC
0B3F:0014 B8004C MOV AX,4C00
-t
AX=4C00 BX=0240 CX=0000 DX=0040 SP=0000 BP=0000 SI=0000 DI=0000
DS=0000 ES=0B2F SS=0B3F CS=0B3F IP=0017 NV UP EI PL NZ AC PO NC
0B3F:0017 CD21 INT 21
-p
Program terminated normally
-------------------------------------------------------------------------------
以下是实验4.1的结果:
-------------------------------------------------------------------------------
-d 0:200
0000:0200 00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F ................
0000:0210 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F ................
0000:0220 20 21 22 23 24 25 26 27-28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./
0000:0230 30 31 32 33 34 35 36 37-38 39 3A 3B 3C 3D 3E 3F 0123456789:;<=>?
0000:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0000:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-------------------------------------------------------------------------------------------
(2)
要求:只能用9条指令,即要方法要简单。
分析:地址0:200-0:23F和0020:0-0020:3F表示的是同一段内存空间。之所以要换一种描述,是为了使目标单元和源数据0-3F从一个数值0开始。
---------------------------------------------------------------------------------------------
代码如下:
assume cs:code
code segment
mov ax,0020h
mov ds,ax
mov bx,0
mov cx,64
s:
mov [bx],bx ;可以写成mov [bx],bl
inc bx ;可以写成inc bl
loop s
mov ax,4c00h
int 21h
code ends
end
--------------------------------------------------------------------------------------------
开始跟踪:
-------------------------------------------------------------------------------------------
-r
AX=0000 BX=0000 CX=0015 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B2F ES=0B2F SS=0B3F CS=0B3F IP=0000 NV UP EI PL NZ NA PO NC
0B3F:0000 B82000 MOV AX,0020
-------------------------------------------------------------------------------------
查看一个目标单元内容:全为0
-------------------------------------------------------------------------------------
-d 0020:0000
0020:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
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 ................
-t
AX=0020 BX=0000 CX=0015 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B2F ES=0B2F SS=0B3F CS=0B3F IP=0003 NV UP EI PL NZ NA PO NC
0B3F: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=0B2F SS=0B3F CS=0B3F IP=0005 NV UP EI PL NZ NA PO NC
0B3F: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=0B2F SS=0B3F CS=0B3F IP=0008 NV UP EI PL NZ NA PO NC
0B3F: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=0B2F SS=0B3F CS=0B3F IP=000B NV UP EI PL NZ NA PO NC
0B3F:000B 891F MOV [BX],BX DS:0000=0000
-t
AX=0020 BX=0000 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B2F SS=0B3F CS=0B3F IP=000D NV UP EI PL NZ NA PO NC
0B3F:000D 43 INC BX
-t
AX=0020 BX=0001 CX=0040 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B2F SS=0B3F CS=0B3F IP=000E NV UP EI PL NZ NA PO NC
0B3F:000E E2FB LOOP 000B
-g 10
AX=0020 BX=0040 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B2F SS=0B3F CS=0B3F IP=0010 NV UP EI PL NZ AC PO NC
0B3F:0010 B8004C MOV AX,4C00
-t
AX=4C00 BX=0040 CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0020 ES=0B2F SS=0B3F CS=0B3F IP=0013 NV UP EI PL NZ AC PO NC
0B3F:0013 CD21 INT 21
-p
Program terminated normally
----------------------------------------------------------------------------------------
实验4.2结果:
----------------------------------------------------------------------------------------
-d 0020:0000
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 ................
-----------------------------------------------------------------------------------------
小结:题目要求很直接,把0到3Fh传送内存到0:200到0:23F这段空间里。要传送的数据是0到3fH,由于数据比较小(小于255),所以可以放在dl中,当然放到dx中也是可以的。目标单元的物理地址是00200到0023F,至于采用什么样子的描述,可以根据实际需要,(2)的做法就比较灵活。
-------------------------------------------------------------------
下面是第(3)题:
-------------------------------------------------------------------
(3)这个题目很有意思,要把自己“送人”,即要把程序的前半部分,传送到0:200开始的空间中。
先来分析一下:
首先,要搞清楚,要复制的什么?题目明确提出要求:“mov ax,4c00h ” 之前的指令。我们知道,一个编译成功的exe文件被加载到cup中,包括psp和源程序。很明显,这里要求复制的是源程序的一部分。
其次,要复制的指令在哪里?当然是在内存中,就是程序被加载到内存中源程序对应那些二进制数。我们知道,它的起始地址放在cs中。在本程序中code也代表它的起始地址,因为code是该段段名,在内存中代表该段的起始地址。
还有,就是复制的字节有多少?这个问题,有个最笨的办法就是去数数了。其实是不用这么麻烦的,我们知道,在cx中就保存程序的字节总数,这就保证不会遗漏。但如果想不多不少正好复制“mov ax,4c00h”之前的指令,好像只好去数数了(还有别的办法吗?)。
程序代码:
------------------------------------------------------------------------------------------------------
assume cs:code
code segment
mov ax,cs ;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
--------------------------------------------------------------------------------------------------------
开始跟踪:
--------------------------------------------------------------------------------------------------------
D:\masm>debug 43.exe
-r
AX=0000 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B2F ES=0B2F SS=0B3F CS=0B3F IP=0000 NV UP EI PL NZ NA PO NC
0B3F:0000 8CC8 MOV AX,CS
--------------------------------------------------------------------------------
查看一下要复制的指令:(注意:CX=001B就是本程序的总字节数目)
--------------------------------------------------------------------------------
-u cs:0
0B3F:0000 8CC8 MOV AX,CS
0B3F:0002 8ED8 MOV DS,AX
0B3F:0004 B82000 MOV AX,0020
0B3F:0007 8EC0 MOV ES,AX
0B3F:0009 BB0000 MOV BX,0000
0B3F:000C 8BC9 MOV CX,CX
0B3F:000E 8A07 MOV AL,[BX]
0B3F:0010 26 ES:
0B3F:0011 8807 MOV [BX],AL
0B3F:0013 43 INC BX
0B3F:0014 E2F8 LOOP 000E
----------------------------------------------------------------------------------
就复制到这里(16h个字节)。
----------------------------------------------------------------------------------
0B3F:0016 B8004C MOV AX,4C00
0B3F:0019 CD21 INT 21
0B3F:001B FE50E8 CALL [BX+SI-18]
0B3F:001E E270 LOOP 0090
----------------------------------------------------------------------------------
查看一下目标单元的情况:
----------------------------------------------------------------------------------
-d 20:0
0020:0000 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
0020:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
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 ................
------------------------------------------------------------------------------------
跟踪继续:
------------------------------------------------------------------------------------
-t
AX=0B3F BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B2F ES=0B2F SS=0B3F CS=0B3F IP=0002 NV UP EI PL NZ NA PO NC
0B3F:0002 8ED8 MOV DS,AX
-t
AX=0B3F BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0B2F SS=0B3F CS=0B3F IP=0004 NV UP EI PL NZ NA PO NC
0B3F:0004 B82000 MOV AX,0020
-t
AX=0020 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0B2F SS=0B3F CS=0B3F IP=0007 NV UP EI PL NZ NA PO NC
0B3F:0007 8EC0 MOV ES,AX
-t
AX=0020 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=0009 NV UP EI PL NZ NA PO NC
0B3F:0009 BB0000 MOV BX,0000
-t
AX=0020 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=000C NV UP EI PL NZ NA PO NC
0B3F:000C 8BC9 MOV CX,CX
-t
AX=0020 BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=000E NV UP EI PL NZ NA PO NC
0B3F:000E 8A07 MOV AL,[BX] DS:0000=8C
-t
AX=008C BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=0010 NV UP EI PL NZ NA PO NC
0B3F:0010 26 ES:
0B3F:0011 8807 MOV [BX],AL ES:0000=00
-t
AX=008C BX=0000 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=0013 NV UP EI PL NZ NA PO NC
0B3F:0013 43 INC BX
-t
AX=008C BX=0001 CX=001B DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=0014 NV UP EI PL NZ NA PO NC
0B3F:0014 E2F8 LOOP 000E
---------------------------------------------------------------------------------
到这里直接-g 16:
---------------------------------------------------------------------------------
-g 16
AX=0021 BX=001B CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=0016 NV UP EI PL NZ NA PE NC
0B3F:0016 B8004C MOV AX,4C00
-t
AX=4C00 BX=001B CX=0000 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B3F ES=0020 SS=0B3F CS=0B3F IP=0019 NV UP EI PL NZ NA PE NC
0B3F:0019 CD21 INT 21
-p
Program terminated normally
--------------------------------------------------------------------------------------
看看实验结果:
--------------------------------------------------------------------------------------
-d 20:0
0020:0000 8C C8 8E D8 B8 20 00 8E-C0 BB 00 00 8B C9 8A 07 ..... ..........
0020:0010 26 88 07 43 E2 F8
---------------------------
可以发现这就是复制过来的数据。
----------------------------------------------------------------------------
CC 00-4C CD 21 00 00 00 00 00 &..C....L.!.....
-----------------------------------------------------------------------------
实际上本程序还传送了以上数据。因为cx=1Bh,而mov ax,4c00h前面只有16h个数据。
但仔细观察可以发现,后面传送到过来数据,跟源数据有出入,源数据是:
0B3F:0016 B8004C MOV AX,4C00h
0B3F:0019 CD21 INT 21
即 B8 00 4C CD 21
而传送到这里的数据是:CC 00-4C CD 21
------------------------------------------------------------------------------
数据怎么就改变了呢?
这就牵出一个问题:一个程序能否把自己的全部代码传送到另一段空间中去?
------------------------------------------------------------------------------
实验表明不能,问题可能就出在:
mov ax,4c00h
int 21h
对于这两条指令的理解,目前仅局限在:它们能使程序正常返回!
因此,现在还无法回答该问题(只能作个记号,有待后续了)。
- [游客] 懂了,太有技巧了,又找到编程方向了,多谢楼主! 10/20 22:50
- [游客] 有帮助,谢了:) 10/29 11:28
- [游客] 解释的和详细啊 09/20 20:39
- [游客] 非常的详细,基本新手一看也就能了解到了。。其中还讲了PSP占用256字节,用实际情况巩固了前面的知识 12/27 22:35
- [游客] 分析的很……很细!鼓励 09/21 11:21
- [vvfire] 学习了 04/12 22:14
- [c_losed] 第3题 mov cx,23 08/07 23:35
- [游客] 多谢楼主,以后还请多多指教 05/03 22:23
- [游客] 非常仔细!分析得非常到位! 11/30 11:52
- [maxm] 我先收藏 03/22 17:52
- [skyleiou] 谢谢你的鼓励,你的鼓励也让我看到了现在网站里还有人~~~ 06/14 20:12
- [hihi] 不好意思,最近有事没来。刚去看了一下,已经有人回答了 04/22 09:40
- [w0922] 你好 !能不能到我的博客看哈 有个问题想请教哈你··· 就是我博客实验十分析的那个问题 04/18 15:19