【问题标题】:implement 64-bit arithmetic on a 32-bit machine - assembly code在 32 位机器上实现 64 位算术 - 汇编代码
【发布时间】:2016-01-02 12:17:25
【问题描述】:

以下代码计算 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;
 }

dest 在 %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 行是做什么的?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 第 5 行正在复制 y 操作数的高位 dword。
  • 所以我添加了这个功能。但我仍然不确定在下一行(第 6 行)中乘以什么 eax (x)。
  • 这是一种愚蠢的方式,将 32 * 64 乘以符号扩展到 64 位并执行 64 * 64。
  • 我不明白为什么当操作数是 32 位和 64 位时,在 32 位机器上需要 3 次乘法。肯定需要 2 次乘法 (32b * 64b) 或 4 次乘法 (64b * 64b)?
  • @WeatherVane:如果您要进行 64 位乘以 64 位的乘法运算并且只保留 low 64 位的结果,那么您只需要三个 32-逐位 32 位乘法:第四次乘以每个操作数的高 32 位,第四次乘法的结果仅对 high 的 64 位有贡献128 位结果。
猜你喜欢
  • 2012-07-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 2015-06-20
  • 2017-10-20
  • 2011-01-30
  • 2012-10-22
相关资源
最近更新 更多