日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

汇编之偏移地址几种常用写法

發布時間:2024/8/26 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 汇编之偏移地址几种常用写法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

----------------------------匯編學習筆記------------------------

------8086處理器---------------

//[bx+20]表示的是一個內存單元

指令mov ax,[bx+20]也可以寫成如下格式(常用):
mov ax,[20+bx]
mov ax,20[bx]
mov ax,[bx].20

Dx,Di,Si的段地址默認是DS,如果沒有指明(Dx,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--

總結

以上是生活随笔為你收集整理的汇编之偏移地址几种常用写法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。