amydog 发表于 2013-10-27 19:44:48

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



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




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





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


望指教!谢谢




amydog 发表于 2013-10-27 19:48:00

额 第三个图 理解错了 ,作废,主要是第二个图 理解不了

福禄娃娃 发表于 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

amydog 发表于 2013-10-27 21:13:03

福禄娃娃 发表于 2013-10-27 20:54 static/image/common/back.gif
我的理解是不同的Opcode对应不同的汇编代码,不同的opcode占不同的字节大小
B8 23 01 被CPU的译码器翻译为 ...

十分感谢版主的回帖,你的答案对我来讲又多了一层知识,当然如果你能帮我在解释下IP为什么会自己识别是3个字节就更好了,比如为什么IP识别是B8 23 01而不是B8 23 或者是B8 23 01 BB呢

福禄娃娃 发表于 2013-10-27 21:30:38

本帖最后由 福禄娃娃 于 2013-10-27 21:32 编辑

amydog 发表于 2013-10-27 21:13 static/image/common/back.gif
十分感谢版主的回帖,你的答案对我来讲又多了一层知识,当然如果你能帮我在解释下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,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

青草 发表于 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之类的跳时修改自己不必追究这么多 书上不是说了吗 以后的问题以后解决看完书 只要用心 会懂的


声明:只是提供参考并不做绝对答案 (对不对 还是自己去了解)上面可能有错别字我不改了

amydog 发表于 2013-10-27 22:57:10

青草 发表于 2013-10-27 22:07 static/image/common/back.gif
这个我记的MOV这个指令 内存数据和寄存器操作好象都是3字节而MOV对寄存器与寄存器操作好象都是2这节MOV ...

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

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

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

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


十分感谢

amydog 发表于 2013-10-27 22:59:56

福禄娃娃 发表于 2013-10-27 21:30 static/image/common/back.gif
我觉得是CPU内部的指令集规定的,属于硬性的规定了。具体取几个字节,取到哪儿算结束,CPU可能是类似的查 ...

版主非常敬业且非常专业,感谢鱼C为我们搭建一个学习的氛围,同时也感谢小甲鱼老师为大家找到了 可靠 务实 上进的各位版主
页: [1]
查看完整版本: 关于段地址与CS:IP的问题