簡體   English   中英

匯編指令中乘法的低位和高位是什么

[英]What is the Lower and the higher part of multiplication in assembly instructions

我正在閱讀此鏈接 ,簡而言之,有人可以向一周前開始學習匯編x86和64bit的人解釋當前C ++編譯器的問題。

不幸的是,當前的編譯器沒有優化@ craigster0的漂亮可移植版本,因此,如果您想利用64位CPU,則不能將其用作對沒有#ifdef的目標的備用。 (我看不到優化它的通用方法;您需要一個128位類型或一個固有類型。)

為了澄清起見,我在研究匯編的好處時,我在多篇文章中遇到人們說,在編譯64位乘法時,當前的編譯器未進行優化,因為它們使用最低的部分,因此不會執行完整的64位乘法。這意味着。 因此,在我讀過的一本書中,獲得較高部分的含義是什么,在64位架構中,只有最低的32位用於RFlags,這些相關的內容我感到困惑嗎?

大多數CPU將允許您從兩個操作數開始,每個操作數的大小與一個寄存器的大小相同,然后將它們相乘即可得到填充兩個寄存器的結果。

例如,在x86上,如果將兩個32位數字相乘,則將在EDX中獲得結果的高32位,而在EAX中獲得結果的低32位。 如果將兩個64位數字相乘,則會得到RDX和RAX的結果。

在其他處理器上,使用了其他寄存器,但是應用了相同的基本思想:一個寄存器乘以一個寄存器得出的結果填充了兩個寄存器。

C和C ++並沒有提供利用該功能的簡便方法。 當您對小於int類型進行操作時,輸入操作數將轉換為int ,然后將int相乘,結果為int。 如果輸入大於int,則將它們乘以相同的類型,結果是相同的類型。 沒有采取任何措施來考慮結果是輸入類型的兩倍大,並且實際上地球上的每個處理器將產生的結果是每個輸入單獨的結果的兩倍。

當然,有一些處理方法。 最簡單的是我們在小學學習的基本因素:將每個數字分解為上下半部分。 然后,我們可以將這些片段分別相乘:(a + b)*(c + d)= ac + ad + bc + bd。 由於這些乘法中的每一個僅具有一半的非零位,因此我們可以將每個算術作為半尺寸運算來產生全尺寸結果(加上加法運算后得到的一位)。 例如,如果我們想在64位處理器上進行64位乘法以獲得128位結果,則可以將每個64位輸入分解為32位。 然后,每個乘法將產生64位結果。 然后,我們將片段加在一起(並進行適當的移位),以得到最終的128位結果。

但是,正如Peter指出的那樣,當我們這樣做時,編譯器不夠聰明,無法意識到我們要完成的工作,並將乘法和加法序列轉換為單個乘法,從而產生的結果是每個輸入的兩倍。 取而代之的是,它將表達式直接直接轉換為一系列的乘法和加法運算,因此它所花費的時間大約是單次乘法的四倍。

暫無
暫無

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

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