有人可以解释为什么以下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
答案 0 :(得分:3)
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转换为quad)将32位值转换为64位值。
答案 1 :(得分:2)
mov ecx, DWORD PTR _b
将变量b移动到ecx寄存器
imul ecx, 10 ; $1 = b * 10
将ecx寄存器乘以10.(b * 10)
mov esi, DWORD PTR _e
将变量e移动到esi寄存器中。
neg esi ; $2 = -e
否定esi寄存器。 (-e)
mov eax, 5
将5移入eax寄存器。
cdq
将eax转换为四字(我想,不知道它需要什么)。
idiv esi ; $3 = 5 / -e
用esi(5 / -e)划分eax
add ecx, eax ; $4 = $1 + $3
将eax添加到ecx(b * 10) + (5 / -e)。
mov DWORD PTR _a, ecx ; a = $4
将ecx移动到变量a(a = (b * 10)+(5 / -e))。