特殊的算術操作指令詳解

2021-07-11 08:49:11 字數 1853 閱讀 1269

上一講,我們說了常見的算術與邏輯運算指令,其中比較有特點的是leal指令,本次我們在介紹幾個較特殊的操作指令,這些指令可以讓只有32位的暫存器儲存64位的資料是不是很吊?

我們來看一下這些指令的大致介紹,如果又仔細看過上一講的內容,可能會發現這裡的指令有些眼熟,但是他們的作用卻截然不同.以下是書中的一張概圖:

第乙個指令很眼熟吧,他就是我們上一章說的imull乘法指令的雙字形式.不過可以看出,這裡的imull指令已經完全變了了個人,他將結果存入兩個暫存器.接下來,我們來看看這些指令.

這兩個指令一看就是雙胞胎,他們乙個負責有符號位全64位乘法,乙個負責無符號位全64位乘法.imull這個指令好像是負責乘法的指令,而且在之前的乘法並沒有區分有符號和無符號,現在怎麼又成了雙胞胎了呢?

我們再上一張當中出現的指令時imull指令,當他操作雙字的時候,也就是imull指令.不過不同的是,他的一般形式是imull s d,這裡有兩個運算元,它將計算s和d的乘積並截斷為雙字,然後儲存在d當中.由於在截斷時,無符號以及有符號的二進位制序列是一樣的,因此此處的乘法指令並不區分有符號和無符號.

本次我們討論imull指令,則與上面的普通乘法指令稍有不同,他只有乙個運算元,也就是說,他的一般形式為imull s,而另外乙個運算元預設為%eax暫存器.最終的結果,會將高32位存入%edx暫存器,而低32位存入%eax暫存器.

試想一下,如果我們只取%eax暫存器當中的32位結果,那其實這裡計算的結果就是s*%eax,此時imull s的作用與imull s d的作用是一樣的,,只是目的運算元被固定為%eax罷了.

接下來我們看乙個案例,我們去看指令imull $0x3的結果,我們假設此時%eax暫存器的值為0x82345600.也就是我們需要你計算0x3*0x82345600的值,這裡我直接給出了兩者相乘的十六進製制表示,為0xffff fffe 869d 0200.這個結果也是64位的,因此我們暫存器的前後狀態為:

可以看出來,%eax儲存著低32位的結果,單說這32位的話,他的有符號數值為-2036530688,正是我們直接計算0x3*0x82345600位截斷後的有符號值,顯然這個結果一出了.如果組合上高32位,則結果為-6331497984,將它加上或者取模(2的32次方)將得到我們32位的結果.這裡的有符號乘法採取的是先符號位擴充套件被乘數,然後兩者相乘,將結果再階段為64位所得.

對於mull的單運算元指令來說,就很簡單了,它採用的是無符號乘法,因此就和我們平時的十進位制乘法類似可,只是同樣的,他也會將結果的高32位存入%edx,將低32位存入%eax

這個指令相對來說很簡單,就是簡單的將%eax暫存器的值符號擴充套件32位到%edx暫存器,也就是說,如果%eax暫存器的二進位制序列的最高位為0,則cltd指令就把%edx置為32個0,相反,如果%eax暫存器的二進位制序列最高位為1,則cltd指令將會自從填充%edx暫存器為32個1.

這兩個指令玉前面的imull和mull類似,它也將計算結果粗放在兩個暫存器當中,其中餘數存放在%edx暫存器,商存放在%eax暫存器.如果你能了解前面說的imull和mull,那麼這裡的idivl和divl理解起來就會很簡單.

舉個例子,考慮指令idivl $0x3的結果,我們結社此時%eax暫存器的值為0x82345600.也就是數我們需要計算0x82345600/0x3的值,在這裡我直接給出兩數相除的16進製表示,商為0xd6117200.餘數為0x0.因此我們暫存器的前後狀態如下所示:

可以看出,在idivl這個指令執行的過程中,其實對被除數進行了符號擴充套件,類似於cltd指令,,或者有時也會將%eax移動到%edx,然後對%edx進行算術右移31位的運算.這兩種方式的結果是一樣的,都是將%eax符號擴充套件32位並儲存在%edx當中.

本次我們介紹了一下介個特殊的算術運算指令,其實這些指令的運算規則都是建立在二進位制算術規則的基礎上的,二進位制算數規則就是這些指令的執行方式規定.

linux 算術指令和檔案指令的判斷

檔案比較運算子 e filename 如果 filename存在,則為真 e var log syslog d filename 如果 filename為目錄,則為真 d tmp mydir f filename 如果 filename為常規檔案,則為真 f usr bin grep l filen...

詳解git基本操作和指令

基本操作 常用命令 git status版本狀態檢視 紅色 說明檔案位於工作區 綠色 說明檔案位於暫存區 沒有體現,說明位於版本區 git add a新增所有新檔案到暫存區 或者git add git add 使用git restore可以丟棄工作區的改動 git commit m 注釋 提交修改並...

32位組合語言學習筆記 5 特殊的算術操作

imull s edx eax eax s edx 表示64 位的高32 位,eax 表示低32 位 有符號 64位乘法。mull s edx eax eax s 無符號 64位乘法。cltd eax 暫存器中的數,按照符號位擴充套件到 edx,轉為 8個位元組。idivl s edx edx ea...