汇编寻址方式
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
?
指令的運行是須要時間的
? 一條指令的運行時間是取指令、取操作數、運行指令及傳送結果各個階段所需時間的總和。
? 不同的指令的運行時間區別可能會非常大。
? 同一種指令使用不同尋址方式時運行時間相差也可能會非常大。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
- 上一篇: m.2接口有几种(Etymology)
- 下一篇: windows任务管理器有哪些快捷键