汇编之偏移地址几种常用写法
----------------------------匯編學(xué)習(xí)筆記------------------------
------8086處理器---------------
//[bx+20]表示的是一個(gè)內(nèi)存單元
指令mov ax,[bx+20]也可以寫成如下格式(常用):
mov ax,[20+bx]
mov ax,20[bx]
mov ax,[bx].20
Dx,Di,Si的段地址默認(rèn)是DS,如果沒有指明(Dx,DI,Si)屬于哪個(gè)段的偏移地址,默認(rèn)是DS的偏移地址!
--------------------
[bx+si]表示一個(gè)內(nèi)存單元,它的偏移地址為(bx)+(si)(即bx中的數(shù)值加上si中的數(shù)值)。
我們看下指令mov ax,[bx+si]的含義:
將一個(gè)內(nèi)存單元的內(nèi)容送入ax,這個(gè)內(nèi)存單元的長(zhǎng)度為2字節(jié)(字單元),存放一個(gè)字,偏移地址為bx中的數(shù)值加上si中的數(shù)值,段地址在ds中。
指令mov ax,[bx+si]的數(shù)學(xué)化的描述為:
(ax)=( (ds)*16+(bx)+(si) )
該指令也可以寫成如下格式(常用):
mov ax,[bx][si]
-------------001---開始---------------
(1)在8086CPU 中,只有這4個(gè)寄存器(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]
錯(cuò)誤的指令
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]
(2)在“[…]” 中,這4個(gè)寄存器(bx、bp、si、di)可以單個(gè)出現(xiàn),或只能以四種組合出現(xiàn):
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]
錯(cuò)誤的指令
mov ax,[bx+bp]
mov ax,[si+di]
(3)只要在[…]中使用寄存器bp,而指令中沒有顯性的給出段地址,段地址就默認(rèn)在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結(jié)束---------------------
--------------002開始-----------
8086CPU的指令,可以處理兩種尺寸的數(shù)據(jù),byte和word。所以在機(jī)器指令中要指明,指令進(jìn)行的是字操作還是字節(jié)操作。
對(duì)于這個(gè)問(wèn)題,匯編語(yǔ)言中用以下方法處理。
(1)通過(guò)寄存器名指明要處理的數(shù)據(jù)的尺寸。
(2)在沒有寄存器名存在的情況下,用操作符X ptr指明內(nèi)存單元的長(zhǎng)度,X在匯編指令中可以為word或byte。
(3)其他方法
下面的指令中,寄存器指明了指令進(jìn)行的是字操作:
mov ax,1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000
下面的指令中,寄存器指明了指令進(jìn)行的是字節(jié)操作:
mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0],al
inc al
add al,100
下面的指令中,用word ptr指明了指令訪問(wèn)的內(nèi)存單元是一個(gè)字單元:
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
下面的指令中,用byte ptr指明了指令訪問(wèn)的內(nèi)存單元是一個(gè)字節(jié)單元:
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
在沒有寄存器參與的內(nèi)存單元訪問(wèn)指令中,用word ptr或byte ptr顯性地指明所要訪問(wèn)的內(nèi)存單元的長(zhǎng)度是很必要的。
否則,CPU無(wú)法得知所要訪問(wèn)的單元是字單元,還是字節(jié)單元。
--------------002結(jié)束-----------------
--------------------003開始--------dup-----
dup示例
db 3 dup (‘a(chǎn)bc’,’ABC’)
定義了18個(gè)字節(jié),它們是
‘a(chǎn)bcABCabcABCabcABC’,
相當(dāng)于db ‘a(chǎn)bcABCabcABCabcABC’
可見,dup的使用格式如下:
db 重復(fù)的次數(shù) dup (重復(fù)的字節(jié)型數(shù)據(jù))
dw 重復(fù)的次數(shù) dup (重復(fù)的字型數(shù)據(jù))
dd 重復(fù)的次數(shù) dup (重復(fù)的雙字?jǐn)?shù)據(jù))
dup是一個(gè)十分有用的操作符
比如我們要定義一個(gè)容量為 200 個(gè)字節(jié)的棧段,如果不用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結(jié)束--------dup--
總結(jié)
以上是生活随笔為你收集整理的汇编之偏移地址几种常用写法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 64位内核开发第十讲,IRQL中断级别了
- 下一篇: 喝茶叶有什么好处(经常喝茶的人,有这几个