a3468 发表于 2014-2-21 21:41:10

汇编实验四 第3题,都进来看看是不是因为这个原因没搞懂!

本帖最后由 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,
    mov es:,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=0000BX=0000CX=001CDX=0000SP=0000BP=0000SI=0000DI=0000
DS=0B48ES=0B48SS=0B58CS=0B58IP=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,
0B58:0011 26            ES:
0B58:0012 8807          MOV   ,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,
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的值就是程序代码的长度,这个是我看其他大牛写出的答案才知道的。

有错误望大牛指出,谢谢!

HB无影 发表于 2014-2-25 14:04:16

刨根问底学习之必啊!!!

瓜瓜 发表于 2014-2-26 08:28:15

在debug下不行,如果是汇编源代码应该是可以了.我自已的想法.

动感超人xx 发表于 2014-5-1 11:23:49

cx也是循环的次数吧.我也不太清楚
页: [1]
查看完整版本: 汇编实验四 第3题,都进来看看是不是因为这个原因没搞懂!