[英]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.