鱼C论坛

 找回密码
 立即注册
查看: 2933|回复: 10

实验四第三小题

[复制链接]
发表于 2012-6-12 21:39:57 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 努力学习 于 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,[bx]
           mov es:[bx],al
           inc bx
           loop s
           mov ax,4c00h
           int 21h
         code ends
         end
虽然看了答案和解析,可还是不懂,请各位鱼友解释解释,谢谢啦

最佳答案

查看完整内容

这个计算有多种方法,如果你熟悉每个指令占内存的大小,可以人工计算,还有你可以先随机赋值一个数给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: mo ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-12 21:39:58 | 显示全部楼层

这个计算有多种方法,如果你熟悉每个指令占内存的大小,可以人工计算,还有你可以先随机赋值一个数给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,[bx]
           mov es:[bx],al
           inc bx
           loop s
s1:       mov ax,4c00h
           int 21h
         code ends
         end
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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处。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-13 20:21:17 | 显示全部楼层
Yara 发表于 2012-6-13 12:28
第一个空是mov ax,cs  意思是将你code segment这个代码段的段地址赋值于ds中,第二个空好像是mov cx,10h意思 ...

第二个空还是没理解,答案里好像是先填一个较大的数,然后再debug查看出cx的值,然后再减去mov ax,4c00h 和 int 21 所占的字节数5  然后答案好像是18  这个答案的解释不理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-14 12:40:00 | 显示全部楼层
努力学习 发表于 2012-6-13 20:21
第二个空还是没理解,答案里好像是先填一个较大的数,然后再debug查看出cx的值,然后再减去mov ax,4c00h  ...

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

这上面的意思是把ds:[bx]内存单元上的值赋给es:[bx]中,而且是以al(占1个字节)为中介,那么loop指令就是要循环多少次,才可以把你从mov ax,cs到mov ax,4c00h的指令在内存中占字节数复制到0020h:0处。所以说mov cx,10h就是循环的次数,取决于你指令所占的字节的大小而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-14 21:54:58 | 显示全部楼层
Yara 发表于 2012-6-14 12:40
s:         mov al,
           mov es:,al
           inc bx

对呀,问题就是你这指令所占的字节的大小怎么计算出来,总不可能人工数出来吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-22 08:48:23 | 显示全部楼层
晕死,我在另一个贴中给你回复了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 19:50:01 | 显示全部楼层
骑着蟑螂闯红灯 发表于 2012-6-22 08:48
晕死,我在另一个贴中给你回复了!!!

哦,说说看你的见解吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-22 22:56:28 | 显示全部楼层
努力学习 发表于 2012-6-22 19:50
哦,说说看你的见解吧

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

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


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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-23 02:10:55 | 显示全部楼层
骑着蟑螂闯红灯 发表于 2012-6-22 22:56
你的帖子发表已经很长时间了,估计你已经弄懂了,既然交流论坛,作为初学者我也谈谈我的理解(我视频才看 ...

,恩恩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-11-20 15:51:40 | 显示全部楼层
:L 看得回复多啦  越看越迷糊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-28 04:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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