IP是如何知道要偏移多少位的呢?
本帖最后由 jslose 于 2011-6-1 00:47 编辑http://bbs.fishc.com/forum.php?mod=attachment&aid=ODI0fDViNGZmZDBjfDEzMDY4NTU3NDN8MTA0ODcwfDIyMDk%3D&noupdate=yes
比如这个图中的MOV指令,可以是2个字节,也可以是3个字节。
也就是说是如何知道哪几个字节是一条指令。 呃,这个问题还真不好说,修修改改好几回
简单说,助记符是规定好的,哪种情况下用什么助记符都是规定好的
比如mov ax,0123h 16位的立即数传给16位ax寄存器,助记符就是B8,助记符后面还有2个字节的立即数,所以IP偏移3
mov ax,bx 16位的寄存器传给16位ax寄存器,助记符就是89,助记符后面还有一个16位寄存器的助记符,所以IP偏移2
你可能也注意到了,同样时mov ax,但它们的助记符却不相同,原因是它们的第二个操作数一个是立即数,一个是寄存器
mov指令在不同情况下的助记符就有几十种,什么情况下用什么助记符都是规定的,所以它绝不可能搞错的
这个不是我们关注的重点,我们只要知道它在编译时会自动无误的生成就可以了,指令占用2字节还是3字节,对我们学习汇编是没有影响的 你要知道汇编语言是计算机机器码的助记符,每一个汇编指令都有一个固定的机器码和它一一对应来保证硬件可以实现它的功能,所以是2字节还是3字节是在CPU内部事先规定好的,因为在你看起来MOV ax,0123H
和MOV ax,bx好像都是MOV指令,但其实不是的,CPU会把这2条指令当作完全不同的指令来处理,所以你不必担心CPU会分不清楚2字节或者3字节的问题,因为第一个字节中的代码里已经隐式规定了这个事情 winddyj 发表于 2011-6-1 01:19 static/image/common/back.gif
呃,这个问题还真不好说,修修改改好几回
简单说,助记符是规定好的,哪种情况下用什么助记符都是规定好的
比 ...
比如mov ax,0123h 16位的立即数传给16位ax寄存器,助记符就是B8,助记符后面还有2个字节的立即数,所以IP偏移3
mov ax,bx 16位的寄存器传给16位ax寄存器,助记符就是89,助记符后面还有一个16位寄存器的助记符,所以IP偏移2
这里的IP偏移3助记符是1 助记符后面的2个字节是指01 23这2个吗
ax助记符1 bx助记符1 这样IP就偏移2
是这样的吗? 再生缘 发表于 2011-6-1 10:07 static/image/common/back.gif
比如mov ax,0123h 16位的立即数传给16位ax寄存器,助记符就是B8,助记符后面还有2个字节的立即数,所以IP偏移 ...
没有错,看样子你已经明白了
页:
[1]