簡體   English   中英

在 32 位機器上實現 64 位算法 - 匯編代碼

[英]implement 64-bit arithmetic on a 32-bit machine - assembly code

以下代碼計算 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)

此代碼使用三個乘法來實現在 32 位機器上實現 64 位算術所需的多精度算術。 描述用於計算乘積的算法,並注釋匯編代碼以顯示它如何實現您的算法。

問題:第 5 行有什么作用? 注冊ecx有什么價值? 還有第 11 行是做什么的?

第 5 行:它將一些局部變量的值復制到 ECX。 該值在此列表中是未知的,因為我們缺少原始函數代碼的一部分。

第 11 行:相當於:EDX = EDX+ECX。 LEA 指令用於計算內存值的 EA 並將該 EA 存儲到目標寄存器中,因此可用於快速進行加法和常數乘法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM