作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 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/
我有 C 代码和汇编代码。我不明白汇编代码的第 3 行和第 6 行。 C 代码: int arith(int x, int y, int z) { int t1 = x+y; int
我需要一些帮助来理解 GCC 为什么这样做 main: pushl %ebp movl %esp, %ebp andl $-16, %esp # ???
我是一名优秀的程序员,十分优秀!