汇编语言之数据处理的2个基本问题
1、bx、si、di和bp
Bx、si和di這3個寄存器我們已經學過了,現在進行一下總結,并學一下bp。
1:在8086CPU中,只有這4個寄存器可以用在[…]中來進行內存單元的尋址。比如,下面的指令都是正確
的:
Mov ax, [bx]
Mov ax, [bx+si]
Mov ax, [bx+di]
Mov ax, [bp]
Mov ax, [bp+si]
Mov ax, [bp+di]
而下面的指令是錯誤的:
Mov ax, [ax]
Mov ax, [cx]
Mov ax, [dx]
Mov ax, [ds]
2:在[…]中,這4個寄存器可以單個出現,或只能以4種組合出現:bx和si、bx和di、bp和si、bp和di。
比如,下面的指令是正確的:
Mov ax, [bx]
Mov ax, [si]
Mov ax, [di]
Mov ax, [bp]
Mov ax, [bx+si]
Mov ax, [bx+di]
Mov ax, [bp+si]
Mov ax, [bp+di]
Mov ax, [bx+si+idata]
Mov ax, [bx+di+idata]
Mov ax, [bp+si+idata]
Mov ax, [bp+di+idata]
而下面的指令是錯誤的:
Mov ax, [bx+bp]
Mov ax, [si+di]
?
我們可以在訪問內存單元的指令中顯式地給出內存單元的段地址所在的段寄存器。
比如:mov ax, SS:[bx]??? ;段地址在SS中。
????? Mov ax, DS:[bp]??? ;段地址在DS中。
????? Mov ax, CS:[bp]??? ;段地址在CS中。
????? Mov ax, ES:[bp]??? ;段地址在ES中。
在上面的指令:mov ax, ES:[bp] 中,我們接觸到了一個新的段寄存器ES,ES叫附加段寄存器,它的功能與
DS基本相同。
如果在[…]中使用寄存器bp,而指令中沒有顯式地給出段地址,段地址就默認在SS中。比如,下面的指令:
Mov ax, [bp+200] 內存單元[bp+200]的段地址就在SS中。
BP被稱作基址指針寄存器,它可以作SP使用,除了BP可以作為間接尋址寄存器而SP不能外,其余功能基
本相同。
?
事實上,通用寄存器除了ax、bx、cx、dx這4個外,還包括sp、bp、si、di這4個16位寄存器,以及ah、
al、bh、bl、ch、cl、dh、dl這8個8位寄存器,通用寄存器一共有以上這16個。
2、機器指令處理的數據在什么地方
絕大部分機器指令都是進行數據處理的指令,處理大致可分為3類:讀取、寫入、運算。在機器指令這一層來
講,并不關心數據的值是多少,而關心指令執行前一刻,它將要處理的數據所在的位置。指令在執行前,所要處理
的數據可以在3個地方:CPU內部、內存、端口,比如下圖所列的指令:
?
3、匯編語言中的數據位置的表達
在匯編語言中如何表達數據位置?匯編語言中用3個概念來表達數據的位置,即立即數、寄存器、地址(偏移
地址和段地址)。
1. 立即數(idata)
對于直接包含在機器指令中的數據(執行前在CPU的指令緩沖器中),在匯編語言中稱為:立即數(idata)。
例:mov ax, 136aH??? ;指令要處理的數據就是立即數136aH。
Add ax, 2000H??? ;指令要處理的數據就是立即數2000H。
Sub ax, a2c7H??? ;指令要處理的數據就是立即數a2c7H。
2. 寄存器
指令要處理的數據在寄存器中,在匯編指令中給出相應的寄存器名。
例:mov ax, bx??? ;指令要處理的數據在bx中。
Mov ds, ax??? ;指令要處理的數據在ax中。
Push bx??? ;指令要處理的數據在bx中。
Mov DS:[123a], bx??? ;指令要處理的數據在bx中。
3. 段地址和偏移地址
指令要處理的數據在內存中,在匯編指令中可用[…]的格式給出偏移地址,段地址在某個段寄存器中。比如以下
的指令:
Mov ax, [107a]
Mov ax, [di]
Mov ax, [bx+8]
Mov ax, [bx+si]
Mov ax, [bx+si+8]
指令要處理的數據偏移地址在[…]中,段地址默認在DS中。
下面的指令:
Mov ax, [bp]
Mov ax, [bp+8]
Mov ax, [bp+si]
Mov ax, [bp+si+8]
指令要處理的數據偏移地址在[…]中,段地址默認在SS中。
存放段地址的寄存器也可以是顯性給出的,比如以下指令:
mov ax, DS:[bp]??? ;指令要處理的數據,段地址在DS中。
Mov ax, ES:[bx]??? ;指令要處理的數據,段地址在ES中。
Mov ax, SS:[bx+si]??? ;指令要處理的數據,段地址在SS中。
Mov ax, CS:[bx+si+8]??? ;指令要處理的數據,段地址在CS中。
?
4、尋址方式
對尋址方式進行一下總結,見下表:表中EA=偏移地址,SA=段地址,寄存器加上一個小括號,表示這個
寄存器中的數值,比如第二條含義:EA=(bx);SA=(ds),(bx)就表示bx中的數值,(ds)就表示ds中的數
值。
?
5、指令要處理的數據有多長
8086CPU的指令,可以處理兩種尺寸的數據:byte和word。所以在機器指令中要指明,指令進行的是字操
作還是字節操作,對于這個問題,匯編語言中用以下方式處理。
1. 通過寄存器名指明要處理的數據的尺寸。
例如,下面的指令中,寄存器指明了指令進行的是字操作,因為這些寄存器是16位的。
Mov ax, 123H
Mov bx, DS:[210a]
Add ax, 1000H
Sub bx, 2ffH
下面的指令中,寄存器指明了指令進行的是字節操作,因為這些寄存器是8位的。
Mov al, 12H
Mov bl, DS:[210a]
Add al, 10H
Sub bl, 2fH
2. 在沒有寄存器名存在的情況下,用操作符word prt或byte prt指明內存單元的長度,前者為字單元,后者
為字節單元。
例如,下面的指令中,用word ptr指明了指令訪問的內存單元是一個字單元。
Mov word ptr DS:[a017], 28H
Add word ptr [bx], 78H
下面的指令中,用byte prt指明了指令訪問的內存單元是一個字節單元。
Mov byte ptr DS:[1a7], 1aH
Add byte ptr [bx], 62H
在沒有寄存器參與的內存單元訪問指令中,用word ptr或byte ptr顯性地指明所要訪問的內存單元的長度是
很必要的,否則,CPU無法得知所要訪問的單元是字單元還是字節單元,從而造成出錯。
3. 其它方法。有些指令默認了訪問的是字單元還是字節單元,比如:push [123a]和pop[123c]就不用指明訪
問的是字單元還是字節單元,因為push和pop指令只進行字操作。
6、mul指令
Mul為乘法指令,使用mul做乘法的時候,注意以下兩點:
1. 兩個相乘的數:這兩個相乘的數,要么都是8位,要么都是16位,如果是8位,一個默認放在al中,另一
個放在8位寄存器或內存字節單元中;如果是16位,一個默認放在ax中,另一個放在16位寄存器或內存字單元
中。
2.結果:如果是8位乘法,結果默認放在ax中,如果是16位乘法,結果高位默認在dx中存放,低位在ax
中存放。
指令格式如下:
Mul 通用寄存器
Mul 內存單元
內存單元可以用不同的尋址方式給出,比如:
Mul byte ptr DS:[7102]??? ;8位乘法。
Mul word ptr [bx+si+8]??? ;16位乘法。
例1:計算100×10。
100和10都小于255,可以做8位乘法,代碼如下:
Mov al, 100
Mov bl, 10
Mul bl
結果:ax=al×bl=100×10=1000(3E8H)
例2:計算100×10000。
100小于255,可10000大于255,所以必須做16位乘法,代碼如下:
Mov ax, 100
Mov bx, 10000
Mul bx
結果:ax×bx=100×10000=1000000(F4240H)
Ax=4240H? dx=FH
7、div指令
Div是除法指令,使用div做除法的時候,應注意以下問題:
1. 除數:有8位和16位兩種,在一個寄存器或內存單元中。
2. 被除數:如果除數為8位,被除數則為16位,默認放在ax中;如果除數為16位,被除數則為32位,在
Dx和ax中存放,dx存放高16位,ax存放低16位。
3. 結果:如果除數為8位,則al存儲結果的商,ah存儲結果的余數;如果除數為16位,則ax存儲結果的
商,dx存儲結果的余數。
指令格式如下:
Div 通用寄存器
Div 內存單元
內存單元可以用不同的尋址方式給出,比如:
Div byte ptr DS:[21a5]??? ;除數為8位的除法。
Div word ptr [bx+si+8]??? ;除數為16位的除法。
例1:計算100001÷100。
被除數100001為32位,轉化成16進制為186a1H,低16位值86a1H放在ax中,高16位值1H放在
Dx中,除數100轉化為16進制64H后,放在一個16位寄存器中,代碼如下:
Mov dx, 1H
Mov ax, 86a1H
Mov bx, 64H
Div bx
結果:(dx×10000H+ax)÷bx=186a1H÷64H=3E8H余1。
Ax=3e8H(1000)? dx=1H
例2.計算1001÷100。
被除數1001可用ax存放,除數100可用8位寄存器存放,代碼如下:
Mov ax, 1001
Mov bl, 100
Div bl
結果:ax÷bl=1001÷100=10余1。
Al=10? ah=1
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的汇编语言之数据处理的2个基本问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言之寄存器(内存访问)
- 下一篇: 汇编语言之转移指令和原理