gpt4 book ai didi

c - 了解汇编代码行 andl 65535 %edx

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

我有 C 代码和汇编代码。我不明白汇编代码的第 3 行和第 6 行。

C 代码:

int arith(int x, int y, int z)
{
int t1 = x+y;
int t2 = z*48
int t3= t1& 0xFFFF
int t4 = t2 * t3
return t4;
}

汇编代码:

  x at % ebp+8, y at %ebp*12, z at %ebp+16
mol 16(%ebp), %eax
leal (%eax, %eax, 2) % eax
sall $4, %eax
movl 12(%ebp) %edx
addl 8(%ebp) %edx
andl $65535, %edx
imull %edx. $eax

在第 6 行,我不明白 65535 如何变成 0xFFFF,这样我们就有 t3 = t1 & 0xFFFF

不同的问题:考虑以下 C 函数原型(prototype),其中 num_t 是使用 typedef 声明的数据类型:

 void store_prod(num_t *dest, unsigned x, num_t y)
{*dest=x*yl}

Gcc 生成以下汇编代码来实现计算主体:

 dest at %ebp+8, x at ebp+12, y at %ebp+16
mov1 12($ebp), $eax
movl 20($ebp), $ecx
imull $eax, $ecx
mull 16(%ebp)
leal (%ecx,%edx), %edx
movl 8(%ebp), %ecx
movl %eax, (%ecx)
movl %edx, 4(%ecx)

line movl 20(%ebp), %ecx 20(%ebp)中有值,它是如何抓取y_t的?行 leal (%ecx, %edx), %edx; edx里什么都没有?那么添加到 %ecx 并存储在 %edx 中的内容是什么?

最佳答案

我们要计算

t2=z*48

为此,我们首先执行 z=z*3,然后将 z 左移 4(乘以 16 ==左移 4)

第 3 行计算

z=z*3 (z+2z)

第 4 行左移 4。

编译器通常会生成加法和移位的组合来执行乘法,因为乘法的成本更高
至于第 6 行 65535 是十进制的 0xFFFF。

关于c - 了解汇编代码行 andl 65535 %edx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26349136/

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