----------------------------匯編學習筆記------------------------
------8086處理器---------------
//[bx+20]表示的是一個內存單元
指令mov ax,[bx+20]也可以寫成如下格式(常用):
mov ax,[20+bx]
mov ax,20[bx]
mov ax,[bx].20
Bx,Di,Si的段地址默認是DS,如果沒有指明(Bx,DI,Si)屬於哪個段的偏移地址,默認是DS的偏移地址!
--------------------
[bx+si]表示一個內存單元,它的偏移地址為(bx)+(si)(即bx中的數值加上si中的數值)。
我們看下指令mov ax,[bx+si]的含義:
將一個內存單元的內容送入ax,這個內存單元的長度為2字節(字單元),存放一個字,偏移地址為bx中的數值加上si中的數值,段地址在ds中。
指令mov ax,[bx+si]的數學化的描述為:
(ax)=( (ds)*16+(bx)+(si) )
該指令也可以寫成如下格式(常用):
mov ax,[bx][si]
-------------001---開始---------------
(1)在8086CPU 中,只有這4個寄存器(bx、bp、si、di)可以用在“[…]” 中
正確的指令
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]
錯誤的指令
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]
(2)在“[…]” 中,這4個寄存器(bx、bp、si、di)可以單個出現,或只能以四種組合出現:
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]
(3)只要在[…]中使用寄存器bp,而指令中沒有顯性的給出段地址,段地址就默認在ss中。比如:
mov ax,[bp] 含義: (ax)=((ss)*16+(bp))
mov ax,[bp+idata] 含義:(ax)=((ss)*16+(bp)+idata)
mov ax,[bp+si] 含義:(ax)=((ss)*16+(bp)+(si))
mov ax,[bp+si+idata] 含義:(ax)=((ss)*16+(bp)+(si)+idata)
------------001結束---------------------
--------------002開始-----------
8086CPU的指令,可以處理兩種尺寸的數據,byte和word。所以在機器指令中要指明,指令進行的是字操作還是字節操作。
對於這個問題,匯編語言中用以下方法處理。
(1)通過寄存器名指明要處理的數據的尺寸。
(2)在沒有寄存器名存在的情況下,用操作符X ptr指明內存單元的長度,X在匯編指令中可以為word或byte。
(3)其他方法
下面的指令中,寄存器指明了指令進行的是字操作:
mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000
下面的指令中,寄存器指明了指令進行的是字節操作:
mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100
下面的指令中,用word ptr指明了指令訪問的內存單元是一個字單元:
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
下面的指令中,用byte ptr指明了指令訪問的內存單元是一個字節單元:
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
在沒有寄存器參與的內存單元訪問指令中,用word ptr或byte ptr顯性地指明所要訪問的內存單元的長度是很必要的。
否則,CPU無法得知所要訪問的單元是字單元,還是字節單元。
--------------002結束-----------------
--------------------003開始--------dup-----
dup示例
db 3 dup (‘abc’,’ABC’)
定義了18個字節,它們是
‘abcABCabcABCabcABC’,
相當於db ‘abcABCabcABCabcABC’
可見,dup的使用格式如下:
db 重復的次數 dup (重復的字節型數據)
dw 重復的次數 dup (重復的字型數據)
dd 重復的次數 dup (重復的雙字數據)
dup是一個十分有用的操作符
比如我們要定義一個容量為 200 個字節的棧段,如果不用dup,則必須用這樣的格式:
stack segment
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
------------------003結束--------dup--