鱼C论坛

 找回密码
 立即注册
查看: 1627|回复: 7

关于段地址与CS:IP的问题

[复制链接]
发表于 2013-10-27 19:44:48 | 显示全部楼层 |阅读模式

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

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

x
QQ截图20131027192549.png

由此图我个人分析  是不是CS就是段地址,而IP就是偏移地址呢?


QQ截图20131027192927.png

这个问题一直没看懂  为什么IP会自动找3个,而不是找2个,当然你可能会说 内存后面有个括号备注mov ax,0123h,如果是王爽老师便于讲课我还能理解,可如果是在实际的编程序时,这个IP是如何实现判断是找3个还是找2个,


QQ截图20131027193546.png


我记得很清楚一句话,IP的值会自动增加 已使CPU可以继续读取下一条指令,因为上次读入的指令长度为3,所以IP中的值加3,  那么上面这幅图,上次指令长度为3,为什么这里加的是2?何解?


望指教!谢谢




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

使用道具 举报

 楼主| 发表于 2013-10-27 19:48:00 | 显示全部楼层
额 第三个图 理解错了 ,作废,主要是第二个图 理解不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-27 20:54:56 | 显示全部楼层
我的理解是不同的Opcode对应不同的汇编代码,不同的opcode占不同的字节大小
B8 23 01 被CPU的译码器翻译为3个字节,执行的操作是把0123H放入ax中
具体可参照Opcodehttp://www.luocong.com/learningo ... OpCode%EF%BC%9F.htm
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-27 21:13:03 | 显示全部楼层

十分感谢版主的回帖,你的答案对我来讲又多了一层知识,当然如果你能帮我在解释下  IP为什么会自己识别是3个字节就更好了,比如为什么IP识别是B8 23 01  而不是B8 23 或者是B8 23 01 BB呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-27 21:30:38 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-10-27 21:32 编辑
amydog 发表于 2013-10-27 21:13
十分感谢版主的回帖,你的答案对我来讲又多了一层知识,当然如果你能帮我在解释下  IP为什么会自己识别是 ...

我觉得是CPU内部的指令集规定的,属于硬性的规定了。具体取几个字节,取到哪儿算结束,CPU可能是类似的查表形式,参照内部的指令集。为什么是B8 23 01你需要去参考下Opcode就明了了。还可以参考下Intel CPU 架构手册http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
里面给出了更为详尽的答案。
在CPU取指令的时候,每个指令对应不同的操作码opcode,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

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

使用道具 举报

发表于 2013-10-27 22:07:50 | 显示全部楼层
本帖最后由 青草 于 2013-10-27 22:15 编辑

这个我记的MOV这个指令 内存数据和寄存器操作好象都是3字节  而MOV对寄存器与寄存器操作好象都是2这节  MOV是二进制编程助记符 而你可以看出第二长图 第一句MOV中找到的三个字节 B8 23 01  这个B8的机器指令应该是对AX寄存器操作(传送数据)  后面23 01 是WORD数据  高字节01低字节23 排列后是0123  在加个H 就是0123H源地址数据传送到目标AX寄存器中   B8是CPU内部运算器运算后会找到对应的指令集中的指令(16位内存MOV取三字节其中两字节是内存地址 32位内存MOV EAX,**可能读的就是五这节了其中的四字节是内存地址)这里内存对寄存器传送数据必须是绝对内存地址!!!!!!!!而不是跳转中的位移!!!!

而第一个图中IP给出了是0000 这个IP是假设的  CPU加电时IP是指向主板只读内存中的数据  后来转到内存  真实的IP不好断定是几 只是程序运行时 有系统进行修改 还有遇到CALL之类的跳时修改  自己不必追究这么多 书上不是说了吗 以后的问题以后解决  看完书 只要用心 会懂的


声明:只是提供参考  并不做绝对答案 (对不对 还是自己去了解)上面可能有错别字我不改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-27 22:57:10 | 显示全部楼层
青草 发表于 2013-10-27 22:07
这个我记的MOV这个指令 内存数据和寄存器操作好象都是3字节  而MOV对寄存器与寄存器操作好象都是2这节  MOV ...

这位同学说的我有点开窍了,不过真伪还需要大家帮助验证下,(毕竟基础要打牢固点)

个人理顺:mov ax,0123h       ax是寄存器   0123h是数据     也就是说 寄存器和数据 IP指定的就是3B   

如果是      mov ax,bx      因为ax bx都是寄存器  所以ip指定的就是2B  

这个是建立在16位内存上   这样理解不知道是不是最终的答案?


十分感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-10-27 22:59:56 | 显示全部楼层
福禄娃娃 发表于 2013-10-27 21:30
我觉得是CPU内部的指令集规定的,属于硬性的规定了。具体取几个字节,取到哪儿算结束,CPU可能是类似的查 ...

版主非常敬业且非常专业,感谢鱼C为我们搭建一个学习的氛围,同时也感谢小甲鱼老师为大家找到了 可靠 务实 上进的各位版主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-7 12:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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