匯編語言之尋址方式(超詳細~)
1 固定尋址(inherent addressing )
特定的單操作數(shù)指令,操作數(shù)隱含在操作碼中,在固定尋址的指令中,操作數(shù)被隱含在指令中,不需要執(zhí)行總線周期,執(zhí)行速度快
例子:
CBW命令,將AL中的符號位擴展到AH中,形成16位的操作數(shù)。比如AL中的符號位是1,則執(zhí)行CBW命令后,AH則變成FF,如果符號位是0,則AH則變成00
PUSH AX ,源操作數(shù)是寄存器AX,目的操作數(shù)為堆棧頂部,將AX寄存器中的內(nèi)容壓入堆棧
CWDE命令,是32位匯編指令,將AX中的符號位擴展到EAX的高位。
2 ?立即數(shù)尋址 (immediate addressing)
立即數(shù)尋址中,操作數(shù)包含在指令中,作為指令的一部分。特點:執(zhí)行速度快,主要給寄存器賦值。同樣不需要執(zhí)行總線周期。
例子:
mov ax,14 ;主要給寄存器賦值,不能直接給段寄存器賦值,如不能mov ds/es/ss/cs ,立即數(shù),會報錯
3 寄存器尋址(register addressing)
說白了,就是操作數(shù)在寄存器中,直接去寄存器中尋找操作數(shù)。
例子:
mov ax,bx ;兩個操作數(shù)都是寄存器尋址,
mov [1234h],ax ; 將AX寄存器中的值給地址1234處,當然段地址在DS中,可以用debug做實驗驗證下,如下:
運行-debug -r 查看寄存器中的值 -a 編輯匯編命令 輸入mov ax,12 mov [1234],ax, 然后查看1234處的指令 -d ds:1234 ?;驗證此時的值 然后運行兩次 -p命令, 然后執(zhí)行-d ds:1234命令,可以看到1234處的值變了
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??


4 ?存儲器尋址(momory addressing)
就是操作數(shù)存放在存儲器中,用存儲器尋址的指令,操作數(shù)一定在數(shù)據(jù)段、堆棧段、附加段中的主存儲器中,指令中一定包含有存儲器單元的地址或產(chǎn)生存儲器單元地址的
信息,執(zhí)行指令時,CPU先根據(jù)指令提供的地址信息,計算出偏移地址,用地址產(chǎn)生器產(chǎn)生出直接訪問的內(nèi)存地址,再從內(nèi)存中取到操作數(shù),執(zhí)行規(guī)定的操作。
注意點:
可以采用段跨越前綴的方式來改變系統(tǒng)指定的默認段,(有的人叫段超越),默認的是DS段
串處理指令必須用ES段
棧操作指令必須用SS段
指令必須在CS中
儲存器的地址是 段基地址偏移4位+偏移地址 ,由于偏移地址是16位的,所以2的16次方是64K,所以每個段的最大長度為64K 。存儲器尋址方式如下:
4.1 直接尋址方式(direct addressing)
例子:
mov al,[2000] ;源操作數(shù)是直接尋址,目的操作數(shù)是寄存器存執(zhí),指令執(zhí)行結(jié)果是將DS段中的偏移地址為2000的字節(jié)單元傳送到AL中
mov ax,[2000] ; 唯一與上一條不同的是將字單元傳送到AX中
mov ax ,es:[2000] ;段超越
mov dword ptr [1234] ,eax ;將EAX中的32位雙字數(shù)據(jù)傳送到內(nèi)存中,目的操作數(shù)采用的存儲器存執(zhí),源操作數(shù)采用寄存器存執(zhí)。
4.2 寄存器間接尋址方式(register indirect addressing)
指操作數(shù)的偏移地址存放在制定的寄存器中,寄存器作為指針指向內(nèi)存單元,而操作數(shù)在存儲器中,這樣的寄存器稱為間址寄存器
在8086CPU中,只能使用BX,BP,SI ,DI 四個寄存器來充當存儲器地址來進行尋址。BX,BP作為基址寄存器,SI,DI變址寄存器
當BX,SI,DI作為間址寄存器時,默認段寄存器在DS中,BP作為間址寄存器時,默認段寄存器為SS。
當然可以采用段超越改變段地址。
4.3 寄存器相對尋址方式(register relative addrssing)
與寄存器間接尋址方式類似,但不同的是,指令中還需要指定一個位移量,對于16位系統(tǒng)來說,位移量是8位或16位,對于32系統(tǒng)來說,位移量是
8位或32位的位移量,位移量是一個帶符號的整數(shù)。
mov ax,10h[si] ?;等值與mov ax,[si+10h]
4.4 基址變址尋址方式(based indexed addressing)
操作數(shù)的偏移地址一部分在基址寄存器,一部分在變址寄存器,基址寄存器的內(nèi)容加上變址寄存器的內(nèi)容就是操作數(shù)的偏移地址,
例子:
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系統(tǒng)中使用,暫不介紹
5 I/O地址尋址(
分為直接端口尋址和間接端口尋址
5.1 direct i/o port addressing
用00h-ffh表示最低的0-255個8位的I/O端口地址,就可以直接進行I/O端口尋址,則可以尋址256個。
in al,80h;將80h端口的數(shù)據(jù)輸入到AL寄存器中
in ax,80h;將80H端口的數(shù)據(jù)輸入到AX寄存器中。
out 80h,AL;字節(jié)輸出指令,將AL寄存器的內(nèi)容輸入到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寄存器中。
與轉(zhuǎn)移地址有關(guān)的尋址
此類主要說的是轉(zhuǎn)移指令,轉(zhuǎn)移指令可以改變指令的執(zhí)行順序,進行跳轉(zhuǎn),簡言之,就是改變CS和IP的值,從而改變下一條要執(zhí)行的指令的物理地址
轉(zhuǎn)移分為段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移,段內(nèi)轉(zhuǎn)移只是改變IP,并不改變CS,段間轉(zhuǎn)移都改變。
段內(nèi)轉(zhuǎn)移和段間轉(zhuǎn)移,都可以使用直接尋址和間接尋址
6.1 段內(nèi)直接尋址 (intra segment indirect addressing)
jmp label ;label 為轉(zhuǎn)移的地址符號,也稱標號,
具體例子如下:
jmp short s add ax,1 s:inc ax 當執(zhí)行到jmp short s 后,會跳轉(zhuǎn)到inc ax 執(zhí)行。
6.2 段內(nèi)間接尋址(intra segment indirect addressing)
轉(zhuǎn)移的偏移地址是一個寄存器或時一個存儲單元的內(nèi)容,舉例:
jmp bx ;BX內(nèi)容傳送到IP寄存器中,作為段內(nèi)偏移地址 jmp word ptr [bp] ;BP指向的內(nèi)存單元的一個字傳送到IP,作為偏移地址 jmp word ptr[bp +val] ;BP+VAL指向的內(nèi)存單元的一個字送給IP,作為偏移地址
6.3 ?段間直接尋址(inter segment direct addressing)
段間尋址和段內(nèi)直接尋址類似,指令中直接給出轉(zhuǎn)移地址,與段內(nèi)尋址不同的是,段內(nèi)直接尋址時,指令中提供了轉(zhuǎn)移地址的段地址和偏移地址 將其中的段地址傳送給CS,偏移地址傳給IP. 完成程序控制間的段間轉(zhuǎn)移 例子:jmp far ptr nseg ;在符號地址nseg之前加上表示段內(nèi)轉(zhuǎn)移的操作符far ptr
6.4 段間間接尋址(inter segment indirect addressing)
間接的獲取轉(zhuǎn)移的段地址和偏移地址,目的地址的段地址和偏移地址存放在內(nèi)存中,這里存儲單元的地址是由指令制定存儲器尋址方式獲取的
指令的格式:
jmp dword ptr [si] ;尋址方式為存儲器尋址方式, dword ptr ?為雙字操作符,說明轉(zhuǎn)移地址需取雙字為段間轉(zhuǎn)移地址,其中高字是段地址。轉(zhuǎn)入CS,低字轉(zhuǎn)入IP. jmp dword ptr [addr] ? ?;在32位系統(tǒng)中,使用存儲器尋址方式獲取內(nèi)存單元的48位指針,其中的低32位送EIP寄存器,高16位從CS寄存器,就能取得轉(zhuǎn)移地址
