王爽彙編9 10

2021-09-11 07:09:10 字數 2062 閱讀 2450

轉移指令:

可以修改ip,或同時修改cs和ip的指令統稱為轉移指令。

8086cpu的轉移行為有以下幾類:

1. 只修改ip時,稱為段內轉移,比如: jmp ax。

2. 同時修改cs和ip時,稱為段間轉移,比如:jmp 1000:0.

由於轉移指令對ip的修改範圍不同,段內轉移又分為:短轉移和近轉移。

短轉移ip的修改範圍為-128~127。

近轉移ip的修改範圍為-32768~32767。

操作符offset在組合語言中是由編譯器處理的符號,它的功能是取得標號的偏移位址。

assume cs: codesg

codesg segment

start: mov ax, offset start ; 相當於mov ax, 0

s: mov ax, offset s; 相當於mov ax, 3,因為上一條指令長度是3個位元組

codesg ends

end start

短轉移:

jmp short 標號

對應的機器碼是eb 乙個位元組的ip偏移量

近轉移:

jmp near ptr 標號

對應的機器碼是e9 兩個位元組的ip偏移量

遠轉移,又稱段間轉移:

jmp far ptr 標號

jmp 暫存器

jmp word ptr 記憶體單元位址(段內轉移)

jmp dword ptr 記憶體單元位址(段間轉移)

jcxz 類似於:

if((cx)==0) jmp short 標號。

loop 類似於:

(cx)--;

if ((cx)!=0) jmp short 標號

jcxz和loop中都是短轉移。

記憶體位址空間中,b8000h~bffffh共32kb的空間,為80x25彩色字元模式的顯示緩衝區。

乙個字元在顯示緩衝區佔兩個位元組(低位元組代表ascii,高位元組代表顯示屬性)。一頁大概佔4kb,顯示緩衝區可以存放8頁,預設顯示第0頁。

call和ret指令都是轉移指令,它們都修改ip,或同時修改cs和ip。它們經常被共同用來實現子程式的設計。

ret指令相當於pop ip

retf指令相當於pop ip, pop cs

cpu執行call指令時,進行兩步操作:

1. 將當前的ip或cs和ip壓入棧中。

2. 轉移。

call指令不能實現短轉移(不能使用乙個位元組來標識ip偏移量)。

call 標號 含義是:

push ip

jmp near ptr 標號

call far ptr 標號 含義是:

push cs

push ip

jmp far ptr 標號

「call far ptr 標號」對應的機器碼中包含cs和ip的位址,可以推斷出,在可執行檔案的描述資訊中包含cs的資訊。

組合語言中經常用的end start,可以推斷出,在可執行檔案的描述資訊中包含ip的資訊。

call reg 含義是:

push ip

jmp reg

call命令的總結:

call命令從偏移量中計算出新ip:call 標號

call命令從暫存器中計算出新ip: call reg

call命令從記憶體中計算出新ip: call 記憶體位址

我們可以寫乙個具有一定功能的程式段,我們稱其為子程式,在需要的時候,用call指令轉去執行。可是執行完子程式後,如何讓cpu接著call指令向下執行?call指令轉去執行子程式之前,call指令後面的指令的位址將儲存在棧中,所以可在子程式的後面使用ret指令,用棧中的資料設定ip的值,從而轉到call指令後面的**處繼續執行。

mul指令:

1. 兩個相乘的數,要麼都是8位,要麼都是16位。如果是8位,乙個預設放在al中,另乙個放在8位reg或記憶體位元組單元中;如果是16位,乙個預設在ax中,另乙個放在16位reg或記憶體字單元中。

2. 結果:如果是8位乘法,結果預設放在ax中;如果是16位乘法,結果高位預設在dx中存放,低位在ax中存放。

格式如下:

mul reg

mul 記憶體單元

王爽彙編5 6

bx 表示乙個記憶體單元,它的偏移位址在bx中。只有bx可以這樣寫,ax,cx,dx不可以。在masm中,mov al,0 會解釋為mov al,0,為了要表達從記憶體中讀取資料,則要寫成mov al,ds 0 cpu執行loop指令的時候,要進行兩步操作 1.cx cx 1 2.判斷cx中的值,不...

王爽彙編7 8

1.在8086cpu中,只有4個暫存器可以用在 中來進行記憶體單元的定址 bx,si,di,bp。2.在 中,這4個暫存器可以單個出現,或只能以4種組合出現 bx和si,bx和di,bp和si,bp和di。3.只要在 中使用暫存器bp,而指令中沒有顯性地給出段位址,段位址就預設在ss中。在沒有暫存器...

王爽 彙編實驗5

5 5 assume cs code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends code segment start mova...