鱼C论坛

 找回密码
 立即注册
查看: 2409|回复: 5

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

[复制链接]
发表于 2013-7-5 00:08:14 | 显示全部楼层 |阅读模式
4鱼币
下面的程序功能是将“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,5
  s: mov al,[bx]   
     mov es:[bx],al   
     inc bx   
     loop s   
     mov ax,4c00h   
     int 21h   
code ends   
end


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

最佳答案

查看完整内容

题意: 这里代码段有两个作用:1、实现复制功能(复制到内存地址) 2、当做数据段来使用 (要复 制过去的数据) 也就是说,这段代码的功能是将代码内容复制到另一段内存中。 空格: 1, mov ax, code ;将code的值(也就是代码段的基地址)复制给ax(为了传递给DX) 2、 mov ax, cs ; 将cs的内容复制给ax 3、 mov cx, 18h\17h ;cx是循环次数, 18h是代码 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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字节 偏移地址给出前缀的情况下前缀算一个自己(因为编译为代码
            时段地址单独成一个指令行)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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,[bx]   
     mov es:[bx],al   
     inc bx   
     loop s   
所以要把cs这个段地址赋值给ds中,但是接下来的横线处填18h或17h,我的电脑上应该填18h,如图[img=0,1]file:///C:\Users\j\AppData\Roaming\Tencent\Users\670215448\QQ\WinTemp\RichOle\PPU`N8[46EYC(EP@}%W}2QW.jpg[/img]。至于sub cx,5。真心不懂 PPU`N8[46EYC(EP@}%W}2QW.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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段中。“挂勾”是鱼老师在视频中用到的词语)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-6 19:51:06 | 显示全部楼层
学习学习了~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-12 21:33:06 | 显示全部楼层

为什么我用 mov ax,code   与mov ax,cs 时  cx的到的值是不一样的   我不懂  为什么会
  第一个 cx=001D   第二个cx=001C
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-16 18:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表