家里穷 发表于 2013-7-5 00:08:14

第五章 实验4 [bx]和loop的使用

下面的程序功能是将“mov ax,4c00h"之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。assume cs:code    code segment       mov ax, code ;或mov ax, cs   mov ds,ax       mov ax,0020h       mov es,ax       mov bx,0       mov cx, 18h ;或mov cx, 17h    ;或sub cx,5s: mov al,       mov es:,al       inc bx       loop s       mov ax,4c00h       int 21h    code ends    end

麻烦将程序中打横线部分的内容讲解一下为什么要那么填? 我主要是不知道这道题的意思是什么

monk-half 发表于 2013-7-5 00:08:15

<1>题意:这里代码段有两个作用:1、实现复制功能(复制到内存地址)   2、当做数据段来使用
               (要复   制过去的数据)   也就是说,这段代码的功能是将代码内容复制到另一段内存中。

<2>空格:1, mov ax, code       ;将code的值(也就是代码段的基地址)复制给ax(为了传递给DX)
             2、 mov ax, cs            ;将cs的内容复制给ax
             3、 mov cx, 18h\17h;cx是循环次数, 18h是代码段的长度,值得注意的是:若前面用到1、
                                             mov ax, code   此时code是idata(立即数),简单讲就是这个指令占
                                             用三个字节啦。若用到(2、mov ax, cs) 则指令长度是两个字节
             5、sub cx, 5               ;首先应当明白:cx是计数寄存器,编译之后cx值是整个代码的长度,
                                              但是我们只复制到mov ax,4c00h"之前,故 应当减去后面两个命令的
                                              长度,5 = 3+2
<3>个人总结的计算指令长度的方法:
            寄存器占1个字节 idata占2字节 偏移地址给出前缀的情况下前缀算一个自己(因为编译为代码
            时段地址单独成一个指令行)

2012300819 发表于 2013-7-5 18:15:23

本帖最后由 2012300819 于 2013-7-6 19:33 编辑

这题目提的好,同求解答!
就我的理解来说,“mov ax,4c00h"之前的指令指的是 :
   mov ax, cs
   mov ds,ax   
   mov ax,0020h   
   mov es,ax   
   mov bx,0   
   mov cx, 18h   ;或mov cx, 17h    ;或sub cx,5
s: mov al,   
   mov es:,al   
   inc bx   
   loop s   
所以要把cs这个段地址赋值给ds中,但是接下来的横线处填18h或17h,我的电脑上应该填18h,如图file:///C:\Users\j\AppData\Roaming\Tencent\Users\670215448\QQ\WinTemp\RichOle\PPU`N8。至于sub cx,5。真心不懂

Dardy 发表于 2013-7-6 01:28:39

关于题意    每条指令的长度,是一个或多个字节,从指令对应的2进制形式里,可以数出来,在debug里是16进制显示的。如果用d命令显示这段代码在内存中的数据,它们是连续放在一起的16进制数字。
题目需要你把从代码最开始到mov ax,4c00h之前的这些16进制数复制到另一块内存。

把一块内存中A的一段指令(16进制数)复制到另一块内存B中,需要知道,A的起始地址,B的起始地址,A的长度,知道这3点,就可以通过循环,把A中的内容一个字节一个字节地复制到B中,循环次数放在CX中

A的数据放在DS段中,DS开始保存着这个段的起始地址。复制的目的地B,挂勾到ES段,ES开始何存着B的起始地址,通过这两次挂勾后,要做的就是把DS段中的数据复制到ES段中。以后每复制一次,DS和ES值都增加1,直至全部复制完成。题中使用BX保存相对于DS和ES的偏移地址。DS的第1个字节复制到ES的第一个字节,然后第2个····

A的起始地址,是code的地址,也是CS初始化的值。

要复制的次数放到CX中进行循环。而CX的初始值为整个代码的总长度。

A的长度,需要你数出来,每条指令的长度,可在debug里查出来,并可计算出A的总长度,多选的地方,你选用不同的指令,A的长度是不同的。第3行真code,A的长度为18h,若填CS,A的长度为17h
至于sub cx,5,CX的初始值为这个代码的总长度,通过减去一个数,得到A的长度

(我没有去数,不知道填上去的是否正确,也不知道这题是否完整,但题中代码的思路很简单,通过两次挂勾,操作就变成,把DS段中的数据复制到ES段中。“挂勾”是鱼老师在视频中用到的词语)

小号4 发表于 2013-7-6 19:51:06

学习学习了~~~~

康小泡 发表于 2013-11-12 21:33:06

Dardy 发表于 2013-7-6 01:28 static/image/common/back.gif
关于题意    每条指令的长度,是一个或多个字节,从指令对应的2进制形式里,可以数出来,在debug里是16进制 ...

为什么我用 mov ax,code   与mov ax,cs 时cx的到的值是不一样的   我不懂为什么会
第一个 cx=001D   第二个cx=001C
页: [1]
查看完整版本: 第五章 实验4 [bx]和loop的使用