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

dev*_*ium 11 x86 assembly

每个asm指令的大小是多少?每条指令占用多少字节?8个字节?四个用于操作码,四个用于参数?例如,当你在mov中有一个操作码和2个参数时会发生什么?它们在内存中是否具有固定大小或它们是否有所不同?EIP是否与此有关,它的值总是加1,完全独立于它所经过的指令类型?

我问这个当我正在阅读http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames时,我偶然发现,看起来调用指令相当于push和jmp指令.

call MYFUNCTION
mov my_var, eax
Run Code Online (Sandbox Code Playgroud)

和...一样

push [eip + 2];
jmp MYFUNCTION;
mov my_var, eax
Run Code Online (Sandbox Code Playgroud)

当我们在堆栈上推动[eip + 2]时,我们指向的值是什么?到"jmp MYFUNCTION"旁边的行,移动my_var eax,对吧?

ps:MSVC++在第一行标记错误,因为它表示eip未定义.它适用于eax,esp,ebp等.我做错了什么?

Dan*_*ner 17

机器指令的大小取决于处理器体系结构 - 有一些具有固定大小指令的体系结构,但您显然是指IA-32和Intel 64,它们的指令长度变化很大.指令指针当然总是按处理指令的长度递增.

您可以从英特尔下载IA-32和Intel 64手册 - 它们包含您可以了解的有关架构的几乎所有内容.您可以在英特尔®64和IA-32架构软件开发人员手册第2B卷:指令集参考中找到操作码映射和指令集格式, 第623至768页.

  • 是绝对.第一个字节包含足够的信息以确定是否必须读取第二个字节,第二个字节允许确定指令是否具有第三个字节,依此类推.只需看一下指令代码表. (8认同)
  • @devoured elysium,是*特殊*字节(操作码),表示扩展指令. (3认同)
  • 顺便提一下,IA-64实际上是Itanium; 你可能会想到IA-32的x86-64/x64/amd64/em64t扩展.IE-64是一种固定的指令宽度架构(并且每组指令按照128位的大喇叭率). (2认同)