彙編基礎學習29

2021-06-16 03:00:52 字數 2241 閱讀 7477

文章**

博主 沒落的殘陽

這節來學習下有符號整數除法指令 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是什麼意思。如果學過程式的人都應該知道這個就是...