彙編基礎學習27

2021-05-02 03:51:18 字數 2654 閱讀 1696

文章** http://www.mcany.cn/article/302.htm

博主 沒落的殘陽

這節來學習下有符號整數的乘法運算,imul指令。這個指令保留了乘積的符號位。imul指令,ia - 32指令集中有三種格式: 單運算元、雙運算元和三運算元。 在單運算元格式中,乘數和被乘數尺寸大小相同,乘積的大小是乘數/被乘數大小的兩倍。

單運算元格式: 單運算元格式把乘積儲存在累加器( ax, dx:ax, edx:eax)中。imul指令單運算元格式其實和我們昨天學習的mul指令格式基本一樣。

1.那麼接下來我們來看下imul單運算元的格式:

imul  8位暫存器/8位記憶體運算元

imul 16位暫存器/16位記憶體運算元

imul 32位暫存器/32位記憶體運算元

2.雙運算元數格式:

imul 16位暫存器/ 16位暫存器-16位記憶體運算元

imul 16位暫存器/ 8位立即數

imul 16位暫存器/ 16位立即數

從上面我們可以看出 雙運算元格式中,乘積儲存在第乙個運算元中,第乙個運算元必須是暫存器,第二個運算元可以是暫存器、記憶體運算元、或立即數。 上面雙運算元我是按照16位來給大家舉的一些例子。 它當然還可以是32位的。

imul 32位暫存器/ 32位暫存器-32位記憶體運算元

imul 32位暫存器/ 8位立即數

imul 32位暫存器/ 32位立即數

3.三運算元格式:

imul 16位暫存器/ 16位暫存器-16位記憶體運算元/ 8位立即數

imul 16位暫存器/ 16位暫存器-16位記憶體運算元/ 16位立即數

三運算元格式把乘積儲存在第乙個運算元,乙個16位暫存器可以被乙個8位或者16位的立即數乘。

imul 32位暫存器/ 32位暫存器 -32位記憶體運算元/ 8位立即數

imul 32位暫存器/ 32位暫存器 -32位記憶體運算元/ 32位立即數

如果有效位丟失,則溢位標誌和進製標誌置位。 使用三運算元格式時,一定要在執行完imul操作後檢查相關操作位。

好,光看理論估計你很迷糊,那麼我們就來看幾個例項:

1. 例如 mov al, -3

mov bl, 6

imul bl

此刻執行的時候(-3*6)的結果存放到ax暫存器中,由於上面我說了,在執行imul進行有符號整數的乘法運算時,保留了乘積的符號位,也就是說乘積的高半部分是低半部分的符號擴充套件。  符號擴充套件是什麼意思呢? 也就是說 如果我們的乘積是個負數則,高半部分都為1,如果乘積是個正數的話,高半部分都為0。很顯然我們(-3*6)是負數,所以此時高半部分肯定是1,不信大家來計算下。

-3的16進製表示形式是0fdh

好此刻我們將0fd轉換成補碼的形式,大家不知道還記得16進製制整數轉換補碼的方法嗎,用15減去各個進製位,最終結果+1。

此刻 fdh

15 - f = 0

15 - d = 2

+  1  = 03h

03*6h = 12h (注意10進製18 = 16進製制12h)

此刻我們將取12h的補碼則為我們最後的乘積

12h

15 - 1 = e

15 - 2 = d

+ 1 = eeh

由於eeh的最高符號位是1,所以此時高半部分將擴充套件為低半部分的符號位,所以此時高半部分為ff(也就是全是二進位制位1)。

最終的結果是ffeeh,此時由於已經被擴充套件了,所以此時的of = 0。(也就是說如果沒有擴充套件的話,of = 1)。

2.再來看個例子

mov al, 3h

mov bl, 6h

imul bl

大家口算就可以算的出來,很顯然3*6=18, 16進製制 = 12h, 此時由於結果為正,因為結果是12h,但是我們也並不能通過of 或者是 if來指示乘積的高半部分是否為0,也就是說我們的imul雖然能進行無符號整數運算,但是我們不能通過它影響的標誌位來進行判斷。。

3. 再來看個例子

mov al, 48

mov bl, 3

imul bl

很顯然我們的結果為正數,得到的積+144存放在ax中,由於ah不是al的符號擴充套件,因為溢位標誌位置位。 of =1

4. 那麼接下來我再來舉個2運算元的。

mov ax, -30h

mov bx, 10h

imul ax, bx

那麼-30 * 10 = -48 * 16 = -768

= -300h

然後我們求反碼

300

15 - 3 = c

15 - 0 = f

15 - 0 = f

+ 1 = d00

因為我們的結果是負數,因為我們的結果是存在ax暫存器中的,而由於上面說了有符號數值的乘積是帶符號位擴充套件的,高4位應該全是1填充,所以最終結果為fd00h

5.接下來我們來個3位運算元的。

mov ax, -30h

imul bx, ax, 2h

這三個運算元的是將結果存放在第乙個運算元中。

-30 * 2 = -60

這時候取反碼

15 - 6 = 9

15 - 0 = f

+1 = a0

乘積 = ffa0h,存放到bx中。

彙編學習筆記 27 PCIe

pci的拓撲結構和列舉過程 首先我們來看一下在x86系統中,pcie是什麼樣的乙個體系架構。下圖是乙個pcie的拓撲結構示例,pcie協議支援256個bus,每條bus最多支援32個device,每個device最多支援8個function,所以由bdf bus,device,function 構成...

彙編基礎學習5

文章 http www.mcany.cn article 280.htm 博主 沒落的殘陽 今天我給大家來講解下我們記憶體中資料的儲存以及訪問。這節課的基礎也是非常重要的。因為80386的資料位址線是32根,所以它一次可以傳送資料是4個位元組。所以我們記憶體單元是按照4個位元組來對齊的。用高階語言的...

彙編基礎學習7

博主 沒落的殘陽 這節來講解一下棧的延伸,堆疊 算是把昨天的整個理論基礎概念,給大家講解下。執行時棧 runtime stack 我們通常稱為 堆疊 這是由我們cpu硬體直接支援的,也是實現過程的呼叫和過程返回機制的基本組成部分。不知道大家是否知道rtl是什麼意思。如果學過程式的人都應該知道這個就是...