第五章 实验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麻烦将程序中打横线部分的内容讲解一下为什么要那么填? 我主要是不知道这道题的意思是什么
<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-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。真心不懂 关于题意 每条指令的长度,是一个或多个字节,从指令对应的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段中。“挂勾”是鱼老师在视频中用到的词语) 学习学习了~~~~ 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]