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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编寻址方式

發布時間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编寻址方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

80x86的尋址方式

?計算機是通過運行指令序列來解決這個問題的,因此每種計算機都有一組指令系統提供給用戶使用。這組指令集就稱為計算機的指令系統。

?計算機中的指令由操作碼字段和操作數字段兩部分組成。

?指令的操作碼字段在機器里面的表示比較簡單,僅僅需對每一種操作指定確定的二進制代碼就能夠了。

?指令的操作數字段情況較為復雜。

?確定指令中用于說明操作數所在地址的方法稱為尋址方法

?8086/8088有七種主要的尋址方式。

1.馬上尋址方式

?操作數就包括在指令中,它作為指令的一部分,跟在操作后存放在代碼段。這樣的操作數就稱為馬上數。

?馬上數能夠是8位的。也能夠是16位的。

?假設是16位馬上數,按“高高低低”原則進行讀取。

?比如:MOV AX,1234H

?再如:MOV AL, 5? 則運行指令后(AL)=05H

??????????? MOV BX,2064H? 則運行指令后,(BX)=3064H

?

2.寄存器尋址方式

? 操作數在CPU內部的寄存器中,指令指定寄存器號。

? 對于16位操作數,寄存器能夠是:

??AX,BX,CX,DX,SI,DI,SP,BP

??對于8位操作數。寄存器能夠是:

??AL,AH,BL,BH,CL,CH,DL,DH

??這樣的尋址方式因為操作數就在寄存器中,不須要訪問存儲器來取得操作數,因而能夠取得較高的運算速度。

? 比如:MOV AX, BX

??如指令運行前(AX)=3064H,(BX)=1234H。則指令運行后,

??(AX)=1234H,? (BX)保持不變

? 又如:??MOV SI,? AX

??? ?MOV AL, DH

??都是寄存器尋址的的樣例。



3.直接尋址方式

?操作數在寄存器中。指令直接包括有操作數的有效地址(偏移地址)。

操作數一般存放在數據段

?所以,操作數低地址由DS加上指令中直接給出的16位偏移得到。

?比如:假設(DS)=2000H ,MOV AX,[8054H]



在匯編語言指令中,能夠用符號地址取代數值地址

?如:MOV AX, VALUE

?此時,VALUE為存放操作數單元的符號地址。

?如寫成:MOV AX, [VALUE]也是能夠的,兩者等價。

?如VALUE在附加段中。則應指定段超越前綴例如以下:

?MOV AX ,?ES?: VALUE

?或MOVAX ,?ES:[VALUE]

?直接尋址方式經常使用語處理單個存儲器變量的情況。它能夠實如今64K字節的段內尋址操作數。直接尋址的操作數一般是程序使用的變量

?注意:馬上尋址和直接尋址書寫表示方法上是不同的,直接尋址的地址要放在方括號里。在源程序中,往往用變量名表示。

4.寄存器間接尋址方式

?操作數在存儲器中,操作數有效地址在SI、DI、BX、BP這四個寄存器之中的一個中。

?在普通情況下,假設有效地址在SI、DI和BX中,則以DS寄存器之內容位段值。

?假設有效地址在BP中。則以SS段寄存器之內容位段值。

?比如:假設(DS)=5000H 。(SI)=1234H

??????????? MOV AX, [SI]

指令中也可指定段超越前綴來取得其他段中的數據。

?如。MOV AX , ES : [BX]

?引用的段寄存器是ES

??請熟悉以下的表達形式:

?MOV [SI] , AX ; 目的操作數間接尋址

?MOV [BP] , CX ;目的操作數引用的段寄存器是SS

?MOV SI , AX; 目的操作數寄存器尋址



5.寄存器相對尋址方式

?操作數在存儲器中,操作數的有效地址是一個基址寄存器(BX、BP)或變址寄存器(SI、DI)內容加上指令中給定的8位或16位位移量之和。

?即:

?在普通情況下。假設SI、DI或BX之內容作為有效地址的一部分。那么引用的段寄存器是DS;假設BP之內容作為有效地址的一部分,那么引用的段寄存器是SS

?在指令中給定的8位或16位位移量採用補碼形式表示。在計算有效地址時,如位移量是8位。則被帶符號擴展成16位。

比如:假設(DS)=5000H,(DI)=3678H

??????????? MOV AX, [DI+1234H]

??則,物理地址=50000+3678+1223=5489BH

??如果該字存儲單元的內容例如以下。則(AX)=55AAH

請熟悉以下的寫作形式:

??MOV BX , [BP-4]

??源操作數間接相對尋址。引用的段寄存器是SS。

??MOV ES : [BX + 5] , AL

??目的操作數採用寄存器相對尋址,引用的段寄存器是ES。

? 指令MOV AX , [SI + 3]與MOV AX ,3[SI]是等價的。

6.基址加變址尋址方式

? 操作數在存儲器中,操作數的有效地址是由:

? 基址寄存器之中的一個的內容與變址寄存器之中的一個的內容相加。

?即:

在普通情況下,假設BP之內容作為有效地址的一部分,那么引用的段寄存器是SS;否者以DS之內容為段值。

比如:假設(DS)=2100H,(BX)=0158H,(DI)=10A5H

??????????? MOV AX, [BX][DI]

??如果該字存儲單元的內容例如以下,則(AX)=1234H



以下兩種表示方法是等價的:

?MOV AX , [BX + DI]

?MOV AX , [DI][BX]?

?以下指令中,目的操作數採用基址加變址尋址,引用的段寄存器是DS。

?MOV DS :[BP + SI], AL

?以下指令中,源操作數採用基址加變址尋址。引用的段寄存器ES。

?MOV AX , ES :[BX + SI]

??這樣的尋址方式適用于處理數據或表格。用基址寄存器存放數組首地址,而用變址寄存器來定位數組中的各元素

或反之。

?因為兩個寄存器都可改變,所以能更加靈活地訪問數組或表格中的元素。

7.相對基址加變址尋址方式

?操作數在存儲器中,操作數的有效地址是由:

?基址寄存器之中的一個的內容與變址寄存器之中的一個的內容

?及指令中給定的8位或16位位移量相加得到。

?即:

?

?在普通情況下,假設BP之內容作為有效地址的一部分。那么引用的段寄存器是SS;否者以DS之內容為段值。

?在指令中給定的8位或16位位移量採用補碼形式表示。

在計算機有效地址時。假設位移量是8位。那么被帶符號擴展成16位。

當所取得的有效地址超過FFFFH是,就取64K的模。

比如:假設(DS)=5000H。(BX)=1223H。(DI)=54H

?(51275)=54H,(51276)=76H

??????????? MOV AX, [BX + DI -2]

?那么。存取的物理存儲單元是多少呢?

?物理地址 = 50000 + 1223 + 0054 + FFFFE

???????????????= 51275H

?在運行該指令后。(AX) =7654H。注意解算過程中的符號擴展

?相對基址加變址這樣的尋址方式的表示方法多種多樣,以下四種表示方法均是等價的:

?MOV AX , [BX + DI + 1234H]

?MOVAX , 1234H[BX][DI]

?MOVAX , 1234H[BX + DI]

?MOVAX , 1234H[DI][BX]

練習:

1.現有(DS)=2000H,(BX)=0100H, (SI)=0002H

? (20100)=12H,(20101)=34H, (20102)=56H

? (20103)=78H,(21200)=2AH, (21201)=4CH

? (21202)=B7H,(21203)=65H

??試說明下列各條指令運行完后AX寄存器的內容。

? ?(1) MOV AX , 1200H?

? ?(2) MOV AX , BX

? ?(3) MOV AX , [1200H]

? ?(4) MOV AX , [BX]

? ?(5) MOV AX , 1100[BX]

? ?(6) MOV AX , [BX][SI]

? ?(7) MOV AX , 1100[BX][SI]

?

1.答案(我自己寫,看文章的朋友最好,自己如今記事本中練習一下。光看答案沒有什么意思,而且,我的理解不一定對)

?(1) MOV AX , 1200H?

? ? 這里是馬上數尋址。 AX=1200H

?

(2) MOV AX , BX

? ? 這里是寄存器尋址,AX=BX=0100H

?

?(3) MOV AX , [1200H]

? ? 這里是直接尋址,須要考慮段的值,段要左移動一位

AX=[DS+1200H]=[20000+1200H]=2AH

?

(4) MOV AX , [BX]

這是寄存器間接尋址 ,須要考慮段

AX=[DS+BX]=[20000+0100H]=12H

?(5) MOV AX , 1100[BX]

這是寄存器相對尋址方式。要考慮段

AX=[DS+BX+1100H]=[20000+0100H+1100H]=2AH

?(6) MOV AX , [BX][SI]

這是基址+變址尋址方式,要考慮段

AX=[DS+BX+SI]=[20000+0100H+0002H]=56H

(7) MOV AX , 1100[BX][SI]

這是相對基址+變址尋址,要考慮段

AX=[DS+BX+SI+1100H]=[20000H+0100H+0002H+1100H]

=[21202H]=B7H

2.如果(DS)=2000H,(ES)=2100H, (SS)=1500H,

? (SI)=00A0H,(BX)=0100H,(BP)=0010H,

??數據段中變量名VAL的偏移地址值為0050H,

? 試指出下列源操作數字段的尋址方式是什么?其物理地址值是多少?

? ?(1) MOV AX , 0ABH

? ?(2) MOV AX , BX

? ?(3) MOV AX , [100H]

? ?(4) MOV AX , VAL

? ?(5) MOV AX , [BX]

? ?(6) MOV AX , ES : [BX]

? ?(7) MOV AX , [BP]

??(8) MOV AX , [SI]

2 答案,同上,自己寫,看官,還是自己再筆記本上練習,然后我們對比,以為。我寫的不一定對。

??(1) MOV AX , 0ABH

這是馬上數尋址,AX=0ABH

?

? ?(2) MOV AX , BX

這是寄存器尋址,AX=BX=0100H

?

? ?(3) MOV AX , [100H]

這是直接尋址,AX=[DS+100H]=[20100H]

?

? ?(4) MOV AX , VAL

? ? 這是直接尋址,AX=[DS+VAL]=[20000+0050H]

? ?(5) MOV AX , [BX]

? ?這里是寄存器相對尋址。AX=[DS+BX]=[20000H+0100H]=[20100H]

? ?(6) MOV AX , ES : [BX]

? ? 這是寄存器相對尋址 AX=[ES+BX]=[21000H+0100H]=[21100H]

? ?(7) MOV AX , [BP]

這是寄存器相對尋址 AX=[SS+BP]=[15000H+0010H]=

[15010H]

??(8) MOV AX , [SI]

?? ? ?這里是寄存器相對尋址 AX=[DS+SI]=[20000H+00A0H]=[200A0H]

?(9) MOV AX , [BX + 10]

這里是寄存器相對尋址

AX=[DS+BX+10H]=[20000H+0100H+10H]=[20110H]

? ?(10) MOV AX , VAL[BX]

這里是寄存器相對尋址

AX=[DS+BX+VAL]=[20000H+0100H+0050H]=[20150H]

? ?(11) MOV AX , [BX][SI]

這里是基址+變址尋址

AX=[DS+BX+SI]=[20000H+0100H+0010H]=[20110H]

? ?(12) MOV AX , VAL [BX][SI]

這里是相對基址+變址尋址

AX=[DS+BX+SI+VAL]=[20000H+0100H+0010H+0050H]

=[20160H]

除了這7中主要的尋址方式外。8086/8088還提供了4種基于轉移地址的尋址方式(第一個為段內,第二個為段間):

?

(DS)=2000H,(CS)=6000H,(SS)=8000H,(ES)=A000H

? ?(BX)=1256H,位移量TABLE=20A1H,(232F7H)=3280H

? (1)JMP BX

??運行后。(IP)=1256H,

??下一條指令的物理地址是:6000(0) +1256 = 61256H

? (2)JMP TABLE[BX]

??運行后,(IP)=(2000(0) + (BX) +?位移量)

? =(20000 + 1256 + 20A1)

? =(232F7)

? =3280H

??下一條指令的物理地址是:6000(0)+3280=63280H

?

匯編語言程序經翻譯轉換為機器語言程序,并且相互之間存在映射關系。

? 例:ADD CL , BH

??機器語言為:00000010?? 11001111

??從左到右開始,各位的意義是:

??000000:OP(操作)

??1:reg為目的操作數

??0:字節操作

??11:寄存器方式

??001:reg?,?CL

? 111:r/m?,?BH

?

指令的運行是須要時間的

? 一條指令的運行時間是取指令、取操作數、運行指令及傳送結果各個階段所需時間的總和。

? 不同的指令的運行時間區別可能會非常大。

? 同一種指令使用不同尋址方式時運行時間相差也可能會非常大。





?



?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?



?

?

?

總結

以上是生活随笔為你收集整理的汇编寻址方式的全部內容,希望文章能夠幫你解決所遇到的問題。

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