本帖最后由 NBeeeeee 于 2018-6-12 15:52 编辑
。。
本帖最后由 NBeeeeee 于 2018-6-12 15:52 编辑
。。
本帖最后由 NBeeeeee 于 2018-6-12 15:51 编辑
。
楼主,一开始cx=1c这个是怎么算出来的:dizzy:
过来 看一看 呵呵。
我一直不理解为是mov ax,cs而不是其它XS,
现在明白了~~~辛苦了,谢谢
半个小时总算是弄明白了:
1,此题与其他问题无关;
2,此题问的是‘把任意一段源码中mov ax,4c00h之前的汇编指令转化成机器指令的代码’复制到0:200地址处,并依次存储
既然是汇编转机器指令的复制,且又是往内存存储,就需要cs=ds,且要以cs的段地址为基础,那就成了段寄存器与段寄存器之间的转移、复制了。段地址需要一个通用寄存器来转,而内存的内容需要一个段寄存器的段地址:偏移地址来转,s:之前的无非就是ds和cs的段地址的转化、定义一个段寄存器的段地址、再给一个通用寄存器赋初值(内存的偏移需要)、计算循环次数并赋给cx寄存器;
不知道s:中的mov al,与mov es:,al 能否合成一句 mov es:,ds: 这样能节省(cx)步执行;
智商不够都没搞明白问的是什么,只能先看答案再思考了。谢谢楼主了!
qzq 发表于 2015-11-23 00:03
楼主,一开始cx=1c这个是怎么算出来的:dizzy:
程序运行前 CX寄存器中存的是程序的大小
说实话,我真不知道指令占的字节大小,所以它那个减法的还靠谱些
顶
燕子湖畔 发表于 2016-3-7 14:16
程序运行前 CX寄存器中存的是程序的大小
说实话,我真不知道指令占的字节大小,所以它那个减法的还靠谱 ...
嗯嗯,是的,谢谢你的回答,帖子好久了,好多人都没回,最近又开始重新学习汇编了,一起加油啦!{:5_109:}
燕子湖畔 发表于 2016-3-7 14:16
程序运行前 CX寄存器中存的是程序的大小
说实话,我真不知道指令占的字节大小,所以它那个减法的还靠谱 ...
嗯嗯,是的,谢谢你的回答,帖子好久了,好多人都没回,最近又开始重新学习汇编了,一起加油啦!
風灬虚幻 发表于 2016-3-10 21:40
顶
谢谢拉
qzq 发表于 2015-11-23 00:03
楼主,一开始cx=1c这个是怎么算出来的:dizzy:
mov 寄存器和立即数是三个字节,mov寄存器和寄存器是两个字节,inc寄存器是两个字节,loop s是两个字节,这样去算吧,加起来就是17.
subCX,5不一定会正确,此题正确是因为只有一个段,如果有多个段,CX的结果就不一定正确了。
所以书中“CX存放程序的长度”应该改为只有一个段时程序的长度。
我记得坛子里有帖子说明过这个事情。
兰陵月 发表于 2016-3-16 12:55
subCX,5不一定会正确,此题正确是因为只有一个段,如果有多个段,CX的结果就不一定正确了。
所以书中 ...
嗯嗯,但这个题程序很短,肯定没超,所以是没问题的
终于在这里看到了
我想问一下,为什么我用Masm for Windows集成实验环境,然后什么也不写,代码段只有MOV AH 4CH 和 INC 21H两行代码,调试时会显示CX=5?
找到问题了 那个一开始初始化了三个段 ,看了36楼的回复知道了
这个答案却是在意料中,确也在情理之外,谁知道王爽的目的既然是要我们自己数字节数。我以为会有其他的奇技淫巧可以访问这个长度呢,看来是我多心了。