|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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的值就是程序代码的长度,这个是我看其他大牛写出的答案才知道的。
有错误望大牛指出,谢谢!
|
|