我试图在C中复制x86 mov指令,例如mov%ecx,-0x4(%ebp),并且对如何操作感到困惑 . 我有一个寄存器的int数组和一个int位移 . 如何将%ecx的值移动到比%ebp中存储的值小的内存地址4?
我有:
int* destAddress=(int*)(displacement + registers[destination]); *destAddress=registers[source];
我收到警告:从不同大小的整数转换为指针 .
mov %ecx,-0x4(%ebp)
或者,在Intel语法中:
mov DWORD PTR [ebp-4], ecx
将 ECX 中的值存储到内存位置 [ebp-4] .
ECX
[ebp-4]
EBP 是"base pointer",通常用于(在未经优化的代码中)访问堆栈上的数据 . 基于负偏移量,该指令几乎肯定会将 ECX 的值存储到第一个DWORD大小的局部变量中 .
EBP
如果你想将它翻译成C,那将是:
int local = value;
假设 value 映射到 ECX 寄存器, local 是在堆栈上分配的局部变量 . 真的,就是这样 .
value
local
[除了C编译器通常会将这样的局部变量放在寄存器中,所以这实际上会转换为更像mov edx,ecx的东西 . 它会溢出到堆栈的唯一时间是它是否用完寄存器(这在寄存器不足的x86 ISA中并不少见) . 或者,您可以通过使变量volatile:force int local = value;来强制它溢出 . 但是在实际代码中没有充分的理由这样做 . ]
当然,正如您在汇编语言指令中看到的那样,在引擎盖下有指针解除引用,但它没有在C表示中显示 .
如果你想在那里得到一些指针表示法,比如你在堆栈上分配了一个值数组,并想要初始化它的第一个成员:
int array[4]; array[0] = value; // set first element of array to 'value' (== ECX)
位移( -4 )将不会出现在C代码中 . C编译器处理它 .
-4
1 回答
或者,在Intel语法中:
将
ECX
中的值存储到内存位置[ebp-4]
.EBP
是"base pointer",通常用于(在未经优化的代码中)访问堆栈上的数据 . 基于负偏移量,该指令几乎肯定会将ECX
的值存储到第一个DWORD大小的局部变量中 .如果你想将它翻译成C,那将是:
假设
value
映射到ECX
寄存器,local
是在堆栈上分配的局部变量 . 真的,就是这样 .[除了C编译器通常会将这样的局部变量放在寄存器中,所以这实际上会转换为更像mov edx,ecx的东西 . 它会溢出到堆栈的唯一时间是它是否用完寄存器(这在寄存器不足的x86 ISA中并不少见) . 或者,您可以通过使变量volatile:force int local = value;来强制它溢出 . 但是在实际代码中没有充分的理由这样做 . ]
当然,正如您在汇编语言指令中看到的那样,在引擎盖下有指针解除引用,但它没有在C表示中显示 .
如果你想在那里得到一些指针表示法,比如你在堆栈上分配了一个值数组,并想要初始化它的第一个成员:
位移(
-4
)将不会出现在C代码中 . C编译器处理它 .