gpt4 book ai didi

c - 为什么这个 IA32 汇编代码有 3 个真正的指令?

转载 作者:太空狗 更新时间:2023-10-29 14:52:27 30 4
gpt4 key购买 nike

我编译了这个 C 函数:

int calc(int x, int y, int z) {
return x + 3*y + 19*z;
}

我在 calc.s 中得到了这个,我正在注释正在发生的事情:

        .file   "calc.c"
.text
.globl calc
.type calc, @function
calc:
pushl %ebp //Save paramaters
movl %esp, %ebp //Move stack pointer into %ebp
movl 12(%ebp), %eax //Move y into %eax
movl 16(%ebp), %ecx //Move z into %ecx
leal (%eax,%eax,2), %eax //%eax = 3*y
addl 8(%ebp), %eax //%eax = x+3y
leal (%ecx,%ecx,8), %edx // ?
leal (%ecx,%edx,2), %edx // ?
addl %edx, %eax //%eax = (x+3*y)+(19*z)
popl %ebp //Pop the previous pointer
ret
.size calc, .-calc
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits

我理解直到最后两条真实指令的所有内容。为什么 19*z 需要两条真正的指令,而 3*y 在一条指令中完成。

最佳答案

leal 是一种以低成本执行乘以小常数的方法,前提是该常数是 2 加 1 的幂。这个想法是没有偏移量的 leal 等同于“Reg1 = Reg2+Reg3*Scale”。如果 Reg2 和 Reg3 恰好匹配,则表示“Reg1=Reg2*(Scale+1)”。

leal 只支持最大 8 的比例因子,所以要乘以 19,你需要两个。

效果

leal   (%eax,%eax,2), %eax

是:

eax = eax + eax*2

也就是说,乘以三。

后两个 leal 一起执行乘以 19:

leal    (%ecx,%ecx,8), %edx     // edx = ecx+ecx*8
leal (%ecx,%edx,2), %edx // edx = ecx+edx*2 (but edx is already z*9)

关于c - 为什么这个 IA32 汇编代码有 3 个真正的指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511842/

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