【问题标题】:What is the size of each asm instruction? [duplicate]每个 asm 指令的大小是多少? [复制]
【发布时间】:2009-09-09 13:58:07
【问题描述】:

每个 asm 指令的大小是多少?每条指令占用多少字节? 8个字节?四个用于操作码,四个用于参数?例如,当您在 mov 中有一个操作码和两个参数时会发生什么?它们的内存大小是固定的还是变化的? EIP和这个有什么关系吗,它的值总是加一,完全独立于它通过什么样的指令?

我在阅读 http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames 时问这个问题,我偶然发现 call 指令似乎等同于 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,对吧?

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

【问题讨论】:

  • 本题与c++无关,故去掉tag。
  • 应该是push eip + 2,而不是push [eip + 2]。
  • 必须是"push eip + 2",但是这个是无效的——call理论上是等价的,但是你不能做这个简单的转换。
  • 你可以(见coding.derkeiler.com/Archive/Assembler/comp.lang.asm.x86/…的例子)但我不知道设计决策的原因是没有mov EAX、EIP指令或类似的东西。
  • 当您定义读取 IP 的指令时,您必须准确定义执行每条指令时 IP 的值(第一个操作码字节?下一条指令的第一个字节?什么?在两者之间,在更复杂的指令中?)然后准备永远使用该定义,以实现未来的兼容性。请记住,由于流水线,实际 IP 在这方面没有很好地定义。出于这个原因,明智的架构师会避开指令集中的此类功能,除非用于特定目的(例如调用和 PC 相对寻址)。

标签: assembly x86


【解决方案1】:

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

您可以从 Intel 下载 IA-32 and Intel 64 manuals - 它们几乎包含您可以了解的有关架构的所有信息。您可以在以下位置找到操作码映射和指令集格式 Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2B: Instruction Set Reference, N-Z 第 623 至 768 页。

【讨论】:

  • 如果每条指令都有不同的长度,我们,甚至计算机,如何在内存中知道什么是指令,什么是参数?如果每条指令的大小相同,计算机就会知道,比如说,每 4 个字节对应一条新指令。但是,如果它们的大小不同,那就不对了。在每条指令的末尾(或开头!)是否有任何特殊字节或其他东西?谢谢
  • 绝对。第一个字节包含足够的信息来确定是否必须读取第二个字节,第二个字节允许确定指令是否具有第三个字节,依此类推。看看指令代码表就行了。
  • @devoured elysium,是表示扩展指令的特殊字节(操作码)。
  • 顺便说一句,IA-64 实际上是安腾;您可能会想到 IA-32 的 x86-64/x64/amd64/em64t 扩展。 IE-64 是一种固定指令宽度架构(每组指令 128 位的大喇叭)。
  • 谢谢,我总是写 IA-64 而不是 Intel 64。修复它。
【解决方案2】:

机器代码大小取决于处理器的架构。

例如,在IA-32 上,指令大小从 1 到 6 个字节(或更多)不等。

【讨论】:

  • 当您说指令大小在不同计算机上或同一台计算机上从 1 到 6 字节不等时,有些指令比其他指令大?
  • 当然是在同一台电脑上。是的,一条指令可以由许多字节组成。
  • 我不确定您所说的“1 到 6 或更多”是什么意思,但是 x86 指令可以长于 6 个字节
  • 错误。在 IA-32 上,指令的最大大小为 15 个字节 stackoverflow.com/a/18972014/995714
  • 整数代码中的平均长度通常小于 4,但在 SSE 或特别是 AVX512 代码中可能更长(新指令具有更长的编码)。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 2010-12-30
  • 2011-10-08
  • 2018-03-13
  • 2015-07-02
  • 2014-11-19
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多