gpt4 book ai didi

c - 为什么下面的c函数和asm代码一样

转载 作者:行者123 更新时间:2023-12-01 11:54:30 25 4
gpt4 key购买 nike

谁能解释一下为什么下面的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com