马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 a3468 于 2014-2-21 21:44 编辑
这道题花了我一天时间,都进来看看你刚开始是不是因为这个原因没搞懂!要是我的理解错了请大牛指出来!
题目是让我们将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试.
先得搞懂这句话,就是我们要把“mov ax,4c00h”之前的10行汇编指令所对应的机器数值复制到内存0:200处。
那就得知道这10行汇编指令有多少个字节,因为根据第七行与第八行中的"al"我们知道是以字节为单位来算。 mov ax,①
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,②
s: mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
我们首先来填写①,从第三行到第八行可以看出ds:dx内存地址中的数值是要赋予到内存 0:200 处的,又因为本段指令是从 cs:ip 处开始的。所以程序是要把cs段地址赋予到ds段地址中,那①就是填 cs
那我们再来填写②,前面说了我们要把“mov ax,4c00h”之前的10行汇编指令所对应的机器数值复制到内存0:200处。那我们就得知道这10行汇编指令所对应的机器数值有多少个字节,我们可以先假设②是5(此处可随便假设为多少),那我们先编译、连接一下,在debug中查看这段代码有多少个字节:
-R
AX=0000 BX=0000 CX=001C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=0B48 ES=0B48 SS=0B58 CS=0B58 IP=0000 NV UP EI PL NZ NA PO NC
0B58:0000 8CC8 MOV AX,CS
-U
0B58:0000 8CC8 MOV AX,CS
0B58:0002 8ED8 MOV DS,AX
0B58:0004 B82000 MOV AX,0020
0B58:0007 8EC0 MOV ES,AX
0B58:0009 BB0000 MOV BX,0000
0B58:000C 83E905 MOV CX,0005
0B58:000F 8A07 MOV AL,[BX]
0B58:0011 26 ES:
0B58:0012 8807 MOV [BX],AL
0B58:0014 43 INC BX
0B58:0015 E2F8 LOOP 000F
0B58:0017 B8004C MOV AX,4C00
0B58:001A CD21 INT 21
0B58:001C 8B1F MOV BX,[BX]
0B58:001E E8C600 CALL 00E7
我们可以看到这个程序共有1cH个字节(H表示16进制),前面说了我们要把“mov ax,4c00h”之前的10行汇编指令所对应的机器数值复制到内存0:200处,所以我们要减去“mov ax,4c00h 与 int 21”所对应的5个字节。所以1cH要减去5等于17H 。
从第七到第九行可以看出每次传送1个字节,所以就是要传送17H次,十进制就是23次。
所以②填17H
我不明白为什么大家都填17H,难道填23不可以吗?大牛回答下填23也可以吗?
我刚开始就是有两点没明白所以没做出来,看看你是不是也是这两点:
1、不理解 【将“mov ax,4c00h”之前的指令复制到内存0:200处 】这段话,要想几遍才懂
2、不知道我们debug程序时,开始cx的值就是程序代码的长度,这个是我看其他大牛写出的答案才知道的。
有错误望大牛指出,谢谢!
|