有没有办法在32位寄存器指令中立即保持字大小

use*_*989 4 x86 assembly reverse-engineering nasm

假设以下x86-32指令:

add ebx,1
Run Code Online (Sandbox Code Playgroud)

有(至少)两种方法来组装这个操作码:

81 c3 01 00 00 00
Run Code Online (Sandbox Code Playgroud)

要么

83 c3 01
Run Code Online (Sandbox Code Playgroud)

第一个保持1作为4字节dword,第二个保持1作为字节

是否有一个指令将1保持为2个字节?如果没有原因?

小智 12

你偶然发现了x86指令集的怪癖.英特尔在主干下包含一组指令83,其第一个操作数是类型Ev,第二个操作数是一个立即字节,被解释为与Ev操作数相同的大小.因此83 c3 01,它01被解释为32位值; 对于66 83 c3 01,01被解释为16位值(目标是16位ax寄存器).push在词干下编码的助记符在6A其单个操作数的大小方面表现相同.

对你的问题更广泛的答案是否定的,没有编码将16位常量解释为32位常量.

来源:我写了一个反汇编程序.

  • 您可能想要解释"Ev"的含义(如果OP不知道它意味着通用寄存器或有效地址). (2认同)