为什么以下c函数与asm代码相同

时间:2011-12-11 14:21:53

标签: c assembly

有人可以解释为什么以下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

2 个答案:

答案 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))。