簡體   English   中英

如何在32位架構的最低級別上實現64位類型和操作?

[英]How are the 64-bit types and operations implemented on the lowest level on a 32-bit architecture?

如何在最低即匯編級別上實現類似int64_t的類型? 我使用的是32位機器,但仍然可以使用int64_t。 我最初的假設是64位只是模擬的,因此與32位機器上的32位數據類型相比,這些類型的計算必須有相當大的開銷。

提前謝謝你的問候

你是對的,當你編譯32位架構的代碼時,你必須使用32位操作數模擬64位操作數和操作。

一個8字節的變量( uint64_t ,它只是一個long long的typedef)存儲在2個4字節的寄存器中。

對於添加(和減去),您必須首先添加較低的4個字節,然后在較高的4個字節上執行第二次帶有進位 (或帶有借 的減法)。 由於第二次添加也會添加第一次添加的進位,結果是正確的。 增加和減少的開銷並不多。

然而,對於乘法和除法,事情並非那么簡單。 通常調用例程來執行這些操作,並且開銷明顯更大。


讓我們來看看這個簡單的c代碼:

int main() {
  long long a = 0x0102030405060708;
  long long b = 0xA1A2A3A4A5A6A7A8;
  long long c = 0xB1B2B3B4B5B6B7B8;

  c = a + b;
  c = a - b;
  c = a * b;
  c = a / b;

  return 0;
}

分析MSVC生成的程序集,我們可以看到:


     2:   long long a = 0x0102030405060708;
012D13DE  mov         dword ptr [a],5060708h  
012D13E5  mov         dword ptr [ebp-8],1020304h  
     3:   long long b = 0xA1A2A3A4A5A6A7A8;
012D13EC  mov         dword ptr [b],0A5A6A7A8h  
012D13F3  mov         dword ptr [ebp-18h],0A1A2A3A4h  
     4:   long long c = 0xB1B2B3B4B5B6B7B8;
012D13FA  mov         dword ptr [c],0B5B6B7B8h  
012D1401  mov         dword ptr [ebp-28h],0B1B2B3B4h  

64位變量分為2個32位位置。


     6:   c = a + b;
012D1408  mov         eax,dword ptr [a]  
012D140B  add         eax,dword ptr [b]  
012D140E  mov         ecx,dword ptr [ebp-8]  
012D1411  adc         ecx,dword ptr [ebp-18h]  
012D1414  mov         dword ptr [c],eax  
012D1417  mov         dword ptr [ebp-28h],ecx  
     7:   c = a - b;
012D141A  mov         eax,dword ptr [a]  
012D141D  sub         eax,dword ptr [b]  
012D1420  mov         ecx,dword ptr [ebp-8]  
012D1423  sbb         ecx,dword ptr [ebp-18h]  
012D1426  mov         dword ptr [c],eax  
012D1429  mov         dword ptr [ebp-28h],ecx  

在較低的32位上使用add指令執行求和,然后使用adc (add with carry)執行較高的32位。 減法類似:第二個操作是sbb (借用減法)。


     8:   c = a * b;
012D142C  mov         eax,dword ptr [ebp-18h]  
012D142F  push        eax  
012D1430  mov         ecx,dword ptr [b]  
012D1433  push        ecx  
012D1434  mov         edx,dword ptr [ebp-8]  
012D1437  push        edx  
012D1438  mov         eax,dword ptr [a]  
012D143B  push        eax  
012D143C  call        __allmul (012D105Ah)  
012D1441  mov         dword ptr [c],eax  
012D1444  mov         dword ptr [ebp-28h],edx  
     9:   c = a / b;
012D1447  mov         eax,dword ptr [ebp-18h]  
012D144A  push        eax  
012D144B  mov         ecx,dword ptr [b]  
012D144E  push        ecx  
012D144F  mov         edx,dword ptr [ebp-8]  
012D1452  push        edx  
012D1453  mov         eax,dword ptr [a]  
012D1456  push        eax  
012D1457  call        __alldiv (012D1078h)  
012D145C  mov         dword ptr [c],eax  
012D145F  mov         dword ptr [ebp-28h],edx  

產品和部門通過調用特殊例程來執行。

暫無
暫無

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

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