c - 在 32 位机器上实现 64 位算术 - 汇编代码

标签 c assembly 32bit-64bit 32-bit

以下代码计算 x 和 y 的乘积并将结果存储在内存中。数据类型 ll_t 定义为 相当于long long。

gcc 生成以下实现计算的汇编代码:

 typedef long long ll_t;

 void store_prod(ll_t *dest, int x, ll_t y)
 {
 *dest = x*y;
 }

目的地为 %ebp+8,x 为 %ebp+12,y 为 %ebp+16

1 movl  16(%ebp), %esi
2 movl  12(%ebp), %eax
3 movl  %eax, %edx
4 sarl  $31, %edx
5 movl  20(%ebp), %ecx
6 imull %eax, %ecx
7 movl  %edx, %ebx
8 imull %esi, %ebx
9 addl  %ebx, %ecx
10 mull %esi
11 leal (%ecx,%edx), %edx
12 movl 8(%ebp), %ecx
13 movl %eax, (%ecx)
14 movl %edx, 4(%ecx)

此代码使用三个乘法来实现实现 64 位算术所需的多精度算术 在 32 位机器上。描述用于计算乘积的算法,并注释汇编代码以显示如何计算 它实现了你的算法。

问题:第 5 行是做什么的?注册 ecx 的值是多少? 还有第 11 行是做什么的?

最佳答案

第 5 行:它将某个局部变量的值复制到 ECX。截至此 list ,该值未知,因为我们缺少部分原始函数代码。

第 11 行:相当于:EDX = EDX+ECX。 LEA指令用于计算内存值的EA并将该EA存储到目标寄存器中,因此,它可以用于快速进行加法和常量乘法。

关于c - 在 32 位机器上实现 64 位算术 - 汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32955419/

相关文章:

assembly - X86 余数的 IDIV 符号取决于 8/-3 和 -8/3 的被除数符号?

c++ - 在 64 位机器上编译 32 位 matlab 应用程序 (c++)

java - 在 64 位 Windows 上编译的 JAR 不能在 32 位上运行

python - Py2exe - 为 32 位和 64 位编译 exe

c++ - 为什么 isdigit() 如果为真则返回 2048?

c++ - 如何获取给定给dlopen的相对路径对应的绝对库文件名?

c++ - 多库 CMakeLists.txt

将 C 转换为 mips 程序集,未对齐的地址错误

C:删除句子中的空格;抛出异常:写访问冲突

macos - Mac OS X 中您最喜欢的反汇编工具是什么?