谁能解释一下为什么下面的 c 代码等同于 asm 代码?
void arith1(){
a=(b*10)+(5/(-e));
}
为什么我们要将 b 的值放在 ecx 寄存器中。
ASM代码:
mov ecx, DWORD PTR _b
imul ecx, 10 ; $1 = b * 10
mov esi, DWORD PTR _e
neg esi ; $2 = -e
mov eax, 5
cdq
idiv esi ; $3 = 5 / -e
add ecx, eax ; $4 = $1 + $3
mov DWORD PTR _a, ecx ; a = $4
最佳答案
mov ecx, DWORD PTR _b
imul ecx, 10 ; edx:eax = b * 10
mov esi, DWORD PTR _e
neg esi ; esi = -e
mov eax, 5
cdq ; edx:eax = 5
idiv esi ; eax = 5 / -e
add ecx, eax ; ecx = b * 10 + 5 / -e
mov DWORD PTR _a, ecx ; store result to a
唯一不直观的部分是 imul 和 idiv 指令组合了 edx 和 eax 寄存器以形成 64 位值。 imul 指令后高 32 位被丢弃,C 不执行溢出检查。需要 cdq 指令(将 double 转换为四精度)在除法之前将 32 位值转换为 64 位值。
关于c - 为什么下面的c函数和asm代码一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8464646/