鱼C论坛

 找回密码
 立即注册
查看: 2963|回复: 4

关于实验四的一些问题

[复制链接]
发表于 2016-11-29 20:38:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处
assume cs:code
code segment
mov ax,cs
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,17h
s:mov al,[bx]
mov es:[bx],al
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

关于这个实验四的问题,我在论坛里面搜索了好多几年前的求助帖子,感觉讲的都不是特别透彻,
想问一下第一个空填写的是CS能理解了,意思就是将ds的值设置为cs,以实现循环的第一条语句mov al,[bx],让ds:[bx]的内容传递给al,也就是cs:[bx]传递给al,以此来实现代码的复制,那么第二个空,17h是怎么计算的呢? 我见 有人说根据debug中cx的值就是代码的字节数,这点小甲鱼的视频中也提到过,但是目前是没有填写完成的代码,生成的exe程序进行debug之后r命令查看中的cx值是准确的吗?还是自己随便写上一个数据来进行debug得到的字节数。
如果不进行debug可以得到这段代码的字节数?是需要自己计算吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-30 18:19:16 | 显示全部楼层
首先啊,如果cx是字节数的话你得减去程序最后两行(mov ax,4c00h  int 21h)的字节数
-r 是查看debug此程序到某一步时cpu状态
你可以用-u 0000:0000来查看指定地址的汇编指令包括它对应的字节
汇编有些模糊了,你可以多通过debug看看内存
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-30 19:27:56 | 显示全部楼层
我来解释一下吧,虽然我也才学没多久

汇编语言的每条指令基本上都占有固定的字节数,比如:MOV指令占3字节。
一些特殊的指令由于格式不同占字节数会有所不同。比如:jmp指令的跳转分为段内跳转和段间跳转。所占字节数就不一样。

实验4里,所有指令已经给出,所以无论空白处填写何种内容(前提是内容合法),指令段的长度cx是确定值。如何计算?显然,这是个经验问题,对于经常观察cx数值的人大概就会了解每种指令所占的长度。

对于实验4来说,用debug调试程序时,进入start后,cx有一个默认值,即整段代码的长度,只需要将此时的cx值减去5即空白处需要的17h了。原因是:mov ax,4c00h     int 21h这2行指令所占字节数为5.

打了好多字,楼主慢慢看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-1 08:55:01 | 显示全部楼层
zealstar 发表于 2016-11-30 19:27
我来解释一下吧,虽然我也才学没多久

汇编语言的每条指令基本上都占有固定的字节数,比如:MO ...

恩,我开始以为每条指令的长度需要根据具体的数值才能确定大小,比如mov ax,1020和mov ax,20指令的长度大小都相同,自己亲手操作了deubg u查看了一下机器码,发现都是3个字节。以前以为每条指令如果后面的数据不同,所占的大小有可能就不同,现在知道了以前的感觉是错误了。
不过随后我就想为什么后面的数据大小不同,指令所占的内存确实相同的
后发debug比较了一下发现mov ax,1020的指令的机器码是 2.jpg ,BB2010,二mov ax,0020的指令的机器码是 1.jpg ,BB2000,由此我推断出机器码BB的意思就是mov ax, 固定不变是一个字节,因为BB是2位16进制的数字,代表的是1个字节,mov ax,后面的数据由两个字节构成2010或2000,不够的补0,所以0-ffff不论大小都占两个字节
由此我想着为什么必须是两个字节,或许这是涉及到编译原理(瞎猜的),也许是由于计算机的硬性规定吧。
还是谢谢了,回答了我的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-1 08:55:46 | 显示全部楼层
zzzz76 发表于 2016-11-30 18:19
首先啊,如果cx是字节数的话你得减去程序最后两行(mov ax,4c00h  int 21h)的字节数
-r 是查看debug此程 ...

恩 ,谢了,我自己多动手实验一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-27 03:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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