努力学习 发表于 2012-6-12 21:39:57

实验四第三小题

本帖最后由 努力学习 于 2012-6-13 20:19 编辑

题目:下面的程序的功能是将"mov ax,4c00h"之前的指令复制到内存0:200处,补全代码。
代码: assume cs:code
         code segment
         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
         code ends
         end
虽然看了答案和解析,可还是不懂,请各位鱼友解释解释,谢谢啦

Yara 发表于 2012-6-12 21:39:58

努力学习 发表于 2012-6-14 21:54 static/image/common/back.gif
对呀,问题就是你这指令所占的字节的大小怎么计算出来,总不可能人工数出来吧

这个计算有多种方法,如果你熟悉每个指令占内存的大小,可以人工计算,还有你可以先随机赋值一个数给cx,再利用DEBUG的U命令查看内存大小,还有一种就是你可以利用计算机自己计算,后面你会学到的,代码如下:
assume cs:code
       code segment
s0:       mov ax,cx
         mov ds,ax
         mov ax,0020h
         mov es,ax
         mov bx,0
         mov cx,offset s1 - offset s0
s:         mov al,
         mov es:,al
         inc bx
         loop s
s1:       mov ax,4c00h
         int 21h
         code ends
         end

Yara 发表于 2012-6-13 12:28:13

第一个空是mov ax,cs意思是将你code segment这个代码段的段地址赋值于ds中,第二个空好像是mov cx,10h意思是将从mov ax,cs到loop s这些指令在内存中占的字节数的大小赋值在cx中,再在后面的loop指令中循环cx次,每次复制一个字节到0:200h处。

努力学习 发表于 2012-6-13 20:21:17

Yara 发表于 2012-6-13 12:28 static/image/common/back.gif
第一个空是mov ax,cs意思是将你code segment这个代码段的段地址赋值于ds中,第二个空好像是mov cx,10h意思 ...

第二个空还是没理解,答案里好像是先填一个较大的数,然后再debug查看出cx的值,然后再减去mov ax,4c00h 和 int 21 所占的字节数5然后答案好像是18这个答案的解释不理解

Yara 发表于 2012-6-14 12:40:00

努力学习 发表于 2012-6-13 20:21 static/image/common/back.gif
第二个空还是没理解,答案里好像是先填一个较大的数,然后再debug查看出cx的值,然后再减去mov ax,4c00h...

s:         mov al,
         mov es:,al
         inc bx
         loop s

这上面的意思是把ds:内存单元上的值赋给es:中,而且是以al(占1个字节)为中介,那么loop指令就是要循环多少次,才可以把你从mov ax,cs到mov ax,4c00h的指令在内存中占字节数复制到0020h:0处。所以说mov cx,10h就是循环的次数,取决于你指令所占的字节的大小而已

努力学习 发表于 2012-6-14 21:54:58

Yara 发表于 2012-6-14 12:40 static/image/common/back.gif
s:         mov al,
         mov es:,al
         inc bx


对呀,问题就是你这指令所占的字节的大小怎么计算出来,总不可能人工数出来吧

骑着蟑螂闯红灯 发表于 2012-6-22 08:48:23

晕死,我在另一个贴中给你回复了!!!{:5_90:}

努力学习 发表于 2012-6-22 19:50:01

骑着蟑螂闯红灯 发表于 2012-6-22 08:48 static/image/common/back.gif
晕死,我在另一个贴中给你回复了!!!

哦,说说看你的见解吧{:5_92:}

骑着蟑螂闯红灯 发表于 2012-6-22 22:56:28

努力学习 发表于 2012-6-22 19:50 static/image/common/back.gif
哦,说说看你的见解吧

你的帖子发表已经很长时间了,估计你已经弄懂了,既然交流论坛,作为初学者我也谈谈我的理解(我视频才看到第六章,你的困惑我也遇到了)

注意:①内存中的数据改变会影响相应的代码(指令)变化。
      ②在debug中cx默认显示当前指令的长度
      ③code即为cs的值
   要想把“mov ax,4c00H”指令复制到内存0:200处,只需把每条指令所对应的内存数据赋到0:200处即可。
   18H怎么来的呢???“mov ax,4c00H和int21H”的总长度为5H,1DH-5H=18H即为剩余指令长度(即为题目中要我们复制指令的长度)。
接下只需按照我提到的再去看程序   应该能看懂!!!


我是初学者难免有错,希望大家能指出错误!!!
谢谢!!!

努力学习 发表于 2012-6-23 02:10:55

骑着蟑螂闯红灯 发表于 2012-6-22 22:56 static/image/common/back.gif
你的帖子发表已经很长时间了,估计你已经弄懂了,既然交流论坛,作为初学者我也谈谈我的理解(我视频才看 ...

{:5_106:},恩恩

痛彻心扉 发表于 2012-11-20 15:51:40

:L 看得回复多啦越看越迷糊
页: [1]
查看完整版本: 实验四第三小题