汇编网首页登录博客注册
hihi的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
友情链接

[2008-03-31 14:00] 实验4  [bx]和loop的使用

说明:这个实验(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
对于这两条指令的理解,目前仅局限在:它们能使程序正常返回!
因此,现在还无法回答该问题(只能作个记号,有待后续了)。
评论次数(2)  |  浏览次数(1226)  |  类型(汇编作业) |  收藏此文  | 

[  lwbfq   发表于  2008-03-31 15:26  ]

对于第三题,确实如博主所说。
不过,我试了一次,如果不用g命令,一步一步执行到最后,结果就不会出现博主所说的问题,真有点怪了。

[  c_losed   发表于  2010-08-07 23:35  ]

第3题
mov cx,23

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码