每个 asm 指令的大小是多少?

13
每个汇编指令的大小是多少?每个指令需要多少字节?8个字节吗?4个字节用于操作码,4个字节用于参数?例如,在mov中有一个操作码和2个参数时会发生什么?它们在内存中是否具有固定大小或者它们是可变的?EIP是否与此有关,如果它的值始终增加1,完全独立于它所传递的指令类型?
我之所以问这个问题是因为当我阅读http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames时,我偶然发现调用指令相当于推送(push)和跳转(jmp)指令。
call MYFUNCTION
mov my_var, eax

与...相同

push [eip + 2];
jmp MYFUNCTION;
mov my_var, eax

当我们将[eip + 2]推送到栈上时,我们指向的值是什么?是紧挨着"jmp MYFUNCTION"的那一行,mov my_var eax, right吗?

ps:MSVC++在第一行上标记错误,因为它说eip未定义。对于eax、esp、ebp等,它可以正常工作。我做错了什么?


这个问题与C++无关,因此标签已被移除。 - Kirill V. Lyadvinsky
应该是 push eip + 2,而不是 push [eip + 2]。 - Daniel Brückner
必须是“push eip + 2”,但这是无效的 - 理论上,调用等效于此,但您无法进行此简单的转换。 - Daniel Brückner
我知道是 push eip + 2,但我的意思是 push eip 和 push eip + 2 都不起作用。如果我理解你的意思,你的意思是我们不能将 eip 推入堆栈?从我所看到的情况来看,我们甚至无法将其值复制到 eax 中。这是什么原因? - devoured elysium
1
你可以(参见http://coding.derkeiler.com/Archive/Assembler/comp.lang.asm.x86/2009-03/msg00135.html以获取示例),但我不知道为什么设计决策没有mov EAX,EIP指令或类似的东西。 - Daniel Brückner
2
当您定义读取IP的指令时,您必须确切地定义每个指令在执行时IP的值将是什么(第一个操作码字节?下一条指令的第一个字节?在更复杂的指令中间某个位置?),然后准备好永久使用该定义以保持未来的兼容性。请记住,由于流水线技术,实际 IP在这方面并没有明确定义。因此,明智的架构师会避免在指令集中使用此类功能,除非出于特定目的(例如调用和PC相对寻址)。 - greggo
2个回答

18

1
如果每个指令的长度都不同,那么我们或者计算机如何在内存中知道哪些是指令,哪些是参数呢?如果每个指令的大小都相同,计算机会知道每4个字节对应一个新的指令。但是如果它们的大小不同,这就不成立了。在每个指令的末尾(或开头!)是否有任何特殊的字节或其他东西呢?谢谢。 - devoured elysium
9
当然。第一个字节包含足够的信息来确定是否需要读取第二个字节,而第二个字节则允许确定指令是否有第三个字节等等。只需查看指令代码表即可。 - Daniel Brückner
3
在@devoured elysium中,存在特殊的字节码(操作码)来指示扩展指令。 - Nick Dandoulakis
3
顺便提一下,IA-64实际上是指Itanium处理器;你可能在想x86-64/x64/amd64/em64t扩展的IA-32处理器架构。IA-64是一种固定指令宽度的架构(每组指令有128位),并且非常庞大。 - bobince
谢谢,我总是写IA-64而不是Intel 64。已经修正。 - Daniel Brückner

2
机器码的大小取决于处理器的架构。
例如,在IA-32上,指令的大小从1到6个字节(或更多)不等。

当您说在不同的计算机上指令大小从1到6个字节不等,或者在同一台计算机上,有些指令比其他指令更大时,您是指什么? - devoured elysium
1
当然可以在同一台计算机上执行。是的,一条指令可以由多个字节组成。 - Nick Dandoulakis
3
我不确定你所指的“1到6或更多”是什么意思,但x86指令可能超过6个字节。 - Eli Bendersky
@EliBendersky,是的,我们说的是一样的。我认为平均指令长度不超过6个字节,如果我没记错的话。 - Nick Dandoulakis
3
错误。在IA-32架构中,指令的最大大小为15个字节。https://dev59.com/AWUq5IYBdhLWcg3wNtuB#18972014 - phuclv
1
平均长度在整数代码中通常小于4,但在SSE或特别是AVX512代码中可能会更长(新指令具有更长的编码)。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接