文章**
博主 沒落的殘陽
這節來學習下有符號整數除法指令 idiv,此指令進行有符號的除法運算,使用的運算元格式與div指令格式相同。 在進行8位除法之前,被除數(ax)必須進行符號擴充套件,餘數的符號和被除數總是相同。
那麼符號擴充套件顧名思義其實就是將它的符號位進行擴充套件,那麼符號擴充套件有無相關的指令呢? 當然有, 那就是cbw cwd cdq 指令。
首先看cbw指令,cbw指令是將(位元組擴充套件至字)。我們從它後面的兩個字尾就可以看的出來。b =byte - w = word 。 這個指令將擴充套件al的符號位至ah中。
接著cwd指令, 是將字符號擴充套件至雙字。w = word , d = dword 。 這樣我們就不需要去記。 看下就ok了。 這個指令將擴充套件ax的符號位至dx中。
cdq指令 將雙字符號擴充套件至8位元組, 指的是擴充套件eax的符號位至edx暫存器中。
1.舉個例子 10進製 -66。
-66 = -42h ;十六進製制
去反碼後 = 0beh
mov al, -66
cbw
那麼此刻al = 0beh ,此刻執行cbw, 剛剛說了cbw是將位元組擴充套件至字。 這個指令將al的符號為擴充套件至ah中。
大家猜測下cbw指令執行完, ax等於多少。。
我想大家不約而同會說等於ffbeh 。 就是將我們的al符號位擴充套件至ah暫存器中。
2.
同樣cwd也是一樣的。只是cwd是將ax的符號位擴充套件至dx中。
舉例 mov ax, 0ffebh
cwd
此刻cwd質量將我們ax暫存器的符號位擴充套件至dx暫存器中,所以此刻執行完後。 dx = ffffh ax= ffbeh
我就不舉例cdq指令,很簡單,大家自己想一下,就是將eax的符號位擴充套件至edx暫存器中。
介紹了上面的符號擴充套件我們現在來學習idiv有符號除法指令,我們在進行有符號整數除法指令運算時候,一定要記得被除數進行符號擴充套件。餘數的符號和被除數的符號相同。
1.舉個例子
mov al, -66
cbw
mov bl, 5
idiv bl
很明顯執行第一句指令的時候al = 0ebh, 此刻執行cbw擴充套件指令,此刻我們的ax = 0ffebh,然後此刻我們進行給bl傳送立即數5,然後通過idiv 指令進行除法,大家是否還記得div指令操作8位除數的時候,商和除數儲存在那裡呢? 呵呵 商儲存在al中,餘數儲存在ah中。
那麼大家想象最後執行完後 al =? ah = ?
注意商和餘數是正數還是負數,由於我們除后,我們的商還是負數 ,注意看上面說的,不管怎麼樣我們的餘數的符號位和被除數的符號位是相同的,所以此時餘數也是負數。
我們來計算下, al = -13 = -0dh ,ah = -01h
我們求反碼。
-0d
15 - 0 = f
15 - d = 2
+1 = f3h
很明顯al = f3h
-01
15 - 0 = f
15 - 1 = e
+1 ah = ff
最終我們可以計算出來ah = 0ffh
al = 0f3h
2. mov ax, -6000
cwd
mov bx, 300
idiv bx
-6000 = -1770h
我們求反碼
15 - 1 = e
15 - 7 = 8
15 - 7 = 8
15 - 0 = f
+1 = e890h
此刻ax = e890h
執行cwd指令後,我們的字擴充套件雙字,ax = e890h dx = ffffh
然後執行mov bx, 300
300轉換16進製制
bx = 012ch
此刻我們在通過idiv指令進行除法運算。 16位我們的商是存在ax暫存器,餘數在dx暫存器中。
我們計算下:
ax = -20
= -14h
我們取反碼
15 - 1 = e
15 - 4 = b
eb + 1 = ech
那麼我們的ax =? 等於00ec? 當然不是了, 因為我們要保留符號位的,所以此刻ax = ffech 。
餘數由於是0,所以dx= 0000h 。
呵呵 不難把
學習筆記29 Linux基礎
1 進入資料夾heyi目錄 cd heyi 2 檢視該目錄下內容 ls 3 安裝git apt install git 4 當報錯 dpkg was interrupted 請手動配 dpkg,命令列 sudo dpkg configure a 5 通過視窗進入 usr local computer...
彙編基礎學習5
文章 http www.mcany.cn article 280.htm 博主 沒落的殘陽 今天我給大家來講解下我們記憶體中資料的儲存以及訪問。這節課的基礎也是非常重要的。因為80386的資料位址線是32根,所以它一次可以傳送資料是4個位元組。所以我們記憶體單元是按照4個位元組來對齊的。用高階語言的...
彙編基礎學習7
博主 沒落的殘陽 這節來講解一下棧的延伸,堆疊 算是把昨天的整個理論基礎概念,給大家講解下。執行時棧 runtime stack 我們通常稱為 堆疊 這是由我們cpu硬體直接支援的,也是實現過程的呼叫和過程返回機制的基本組成部分。不知道大家是否知道rtl是什麼意思。如果學過程式的人都應該知道這個就是...