1 固定定址(inherent addressing )
特定的單運算元指令,運算元隱含在操作碼中,在固定定址的指令中,運算元被隱含在指令中,不需要執行匯流排週期,執行速度快
例子:1.1 cbw命令,將al中的符號位擴充套件到ah中,形成16位的運算元。比如al中的符號位是1,則執行cbw命令後,ah則變成ff,如果符號位是0,則ah則變成00
1.2 push ax ,源運算元是暫存器ax,目的運算元為堆疊頂部,將ax暫存器中的內容壓入堆疊
1.3 cwde命令,是32位彙編指令,將ax中的符號位擴充套件到eax的高位。
2 立即數定址 (immediate addressing)
立即數定址中,運算元包含在指令中,作為指令的一部分。特點:執行速度快,主要給暫存器賦值。同樣不需要執行匯流排週期。
例子:2.1 mov ax,14 ;主要給暫存器賦值,不能直接給段暫存器賦值,如不能mov ds/es/ss/cs ,立即數,會報錯
3 暫存器定址(register addressing)
說白了,就是運算元在暫存器中,直接去暫存器中尋找運算元。
例子:3.1 mov ax,bx ;兩個運算元都是暫存器定址,
執行-debug
-r 檢視暫存器中的值
-a 編輯彙編命令
輸入mov ax,12
mov [1234],ax,
然後檢視1234處的指令
-d ds:1234 ;驗證此時的值
然後執行兩次 -p命令,
然後執行-d ds:1234命令,可以看到1234處的值變了
4 儲存器定址(momory addressing)
資訊,執行指令時,cpu先根據指令提供的位址資訊,計算出偏移位址,用位址產生器產生出直接訪問的記憶體位址,再從記憶體中取到運算元,執行規定的操作。
注意點:
1 可以採用段跨越字首的方式來改變系統指定的預設段,(有的人叫段超越),預設的是ds段
2 串處理指令必須用es段
3 棧操作指令必須用ss段
4 指令必須在cs中
4.1 直接定址方式(direct addressing)
例子:mov al,[2000] ;源運算元是直接定址,目的運算元是暫存器存執,指令執行結果是將ds段中的偏移位址為2000的位元組單元傳送到al中
mov ax,[2000] ; 唯一與上一條不同的是將字單元傳送到ax中
mov ax ,es:[2000] ;段超越
mov dword ptr [1234] ,eax ;將eax中的32位雙字資料傳送到記憶體中,目的運算元採用的儲存器存執,源運算元採用暫存器存執。
4.2 暫存器間接定址方式(register indirect addressing)
指運算元的偏移位址存放在制定的暫存器中,暫存器作為指標指向記憶體單元,而運算元在儲存器中,這樣的暫存器稱為間址暫存器
在8086cpu中,只能使用bx,bp,si ,di 四個暫存器來充當儲存器位址來進行定址。bx,bp作為基址暫存器,si,di變址暫存器
當bx,si,di作為間址暫存器時,預設段暫存器在ds中,bp作為間址暫存器時,預設段暫存器為ss。
當然可以採用段超越改變段位址。
4.3 暫存器相對定址方式(register relative addrssing)
與暫存器間接定址方式類似,但不同的是,指令中還需要指定乙個位移量,對於16位系統來說,位移量是8位或16位,對於32系統來說,位移量是
8位或32位的位移量,位移量是乙個帶符號的整數。
mov ax,10h[si] ;等值與mov ax,[si+10h]
4.4 基址變址定址方式(based indexed addressing)
運算元的偏移位址一部分在基址暫存器,一部分在變址暫存器,基址暫存器的內容加上變址暫存器的內容就是運算元的偏移位址,
例子:mov ax,[bx][si] 等價於mov ax,[bx+si]
4.5 相對基址變址定址方式(relative based indexed addressing)
帶位移量的基址變址定址方式稱為基址 變址定址方式。
例子:mov ax,100[bx][si] ;段位址再ds中
mov ax,100[bp][si] ; 段位址再ss中
4.6 比例變址定址方式(scaled indexed addressing)
只有在32位及以後的80x86系統中使用,暫不介紹
5 i/o位址定址(
分為直接埠定址和間接埠定址
5.1 direct i/o port addressing
用00h-ffh表示最低的0-255個8位的i/o埠位址,就可以直接進行i/o埠定址,則可以定址256個。
in al,80h;將80h埠的資料輸入到al暫存器中
in ax,80h;將80h埠的資料輸入到ax暫存器中。
out 80h,al;位元組輸出指令,將al暫存器的內容輸入到80h埠
5.2 indirect i/o port addressing
如果埠大於256個,則可以定址65536個埠,必須使用間接定址,先把0000h-ffffh埠號存放到dx中,然後將dx暫存器中的值
mov ax,200h
out dx,al ; jiang al輸出到dx所指向的埠中
mov dx ,200h
in ax ,dx;將dx所指向的埠的乙個字輸入到ax暫存器中。
6 與轉移位址有關的定址
轉移分為段內轉移和段間轉移,段內轉移只是改變ip,並不改變cs,段間轉移都改變。
段內轉移和段間轉移,都可以使用直接定址和間接定址
6.1 段內直接定址 (intra segment indirect addressing)
jmp label ;label 為轉移的位址符號,也稱標號,
具體例子如下:
jmp short s
add ax,1
s:inc ax
當執行到jmp short s 後,會跳轉到inc ax 執行。
6.2 段內間接定址(intra segment indirect addressing)
jmp bx ;bx內容傳送到ip暫存器中,作為段內偏移位址
jmp word ptr [bp] ;bp指向的記憶體單元的乙個字傳送到ip,作為偏移位址
jmp word ptr[bp +val] ;bp+val指向的記憶體單元的乙個字送給ip,作為偏移位址
z6.3 段間直接定址(inter segment direct addressing)
段間定址和段內直接定址類似,指令中直接給出轉移位址,與段內定址不同的是,段內直接定址時,指令中提供了轉移位址的段位址和偏移位址
將其中的段位址傳送給cs,偏移位址傳給ip. 完成程式控制間的段間轉移
6.4 段間間接定址(inter segment indirect addressing)
間接的獲取轉移的段位址和偏移位址,目的位址的段位址和偏移位址存放在記憶體中,這裡儲存單元的位址是由指令制定儲存器定址方式獲取的
指令的格式:
jmp dword ptr [si] ;定址方式為儲存器定址方式, dword ptr 為雙字操作符,說明轉移位址需取雙字為段間轉移位址,其中高字是段位址。轉入cs,低字轉入ip.
jmp dword ptr [addr] ;在32位系統中,使用儲存器定址方式獲取記憶體單元的48位指標,其中的低32位送eip暫存器,高16位從cs暫存器,就能取得轉移位址
組合語言之定址方式
如 mov ax,2a78 表示將乙個記憶體單元中的資料送入ax,這個記憶體單元的長度為2位元組 字單元 存放乙個字,偏移位址為2a78h,段位址 在ds中。如 mov al,10f3 表示將乙個記憶體單元中的資料送入al,這個記憶體單元的長度為1位元組 位元組單元 存放乙個位元組,偏移位址為10f...
組合語言之定址方式
目錄 定址方式 立即數定址方式 暫存器定址方式 儲存器定址方式 轉移位址定址 參照自 立即數 imm 可以是8位數值,也可以16位數值。立即數定址方式常用來給暫存器賦值 mov ax,1234h 運算元存放在cpu的內部暫存器中,通用暫存器 ax,bx,cx,dx,si,di,bp,sp 段暫存器 ...
組合語言之定址方式
1 固定定址 inherent addressing 特定的單運算元指令,運算元隱含在操作碼中,在固定定址的指令中,運算元被隱含在指令中,不需要執行匯流排週期,執行速度快 例子 1.1 cbw命令,將al中的符號位擴充套件到ah中,形成16位的運算元。比如al中的符號位是1,則執行cbw命令後,ah...