Intel 彙編
立即尋址方式
MOV AH, 80H (直接給寄存器指派)
寄存器尋址方式(源或者目的有一個是寄存器)
源操作數是寄存器尋址方式
如: ADD VARD, EAX ADD VARW, AX MOV VARB, BH等。
其中: VARD、VARW和VARB是雙字,字和位元組類型的記憶體變量。
目的操作數是寄存器尋址方式
如: ADD BH, 78h ADD AX, 1234h MOV EBX, 12345678H等。
源和目的操作數都是寄存器尋址方式
如: MOV EAX, EBX MOV AX, BX MOV DH, BL等。
直接尋址方式(位址值在括号裡)
MOV BX, [1234H] (預設使用DS).
MOV ES:[1000H], AX
寄存器間接尋址方式(寄存器在括号裡)
MOV BX, [DI]
操作數的有效位址用SI、DI、BX和BP等四個寄存器之一來指定,稱這種尋址方式為寄存器間接尋址方式。
若有效位址用SI、DI和BX來指定,則其預設的段寄存器為DS;若有效位址用BP來指定,則其預設的段寄存器為SS(即:堆棧段)。
寄存器相對尋址方式(一個寄存器和一個立即數在括号裡,并且還要計算)
MOV BX, [SI+100H]
基址加變址尋址方式(兩個寄存器在括号裡,并且還要計算)
MOV BX, [BX+SI]
相對基址加變址尋址方式(兩個寄存器在括号裡和一個立即數在括号裡,并且還要計算)
MOV AX, [BX+SI+200H]
AT&T 彙編
立即尋址
movl $2, %ebx
它的意思就是把2這個數字寫入%eax寄存器,$2就是立即尋址,其實就是立即數。
寄存器尋址
其實上面的例子也包括了寄存器尋址,顧名思義%ebx就是寄存器尋址,代表對這個寄存器本身的寫入或讀出。
直接尋址
movl ADDRESS, %eax
ADDRESS其實就相當于”位址或偏移”裡的位址,反正就是一個數字。
寄存器間接尋址
movl (%eax), %ebx
(%eax)就是間接尋址了,意思就是通路eax寄存器裡的數值所代表的位址。相當于通用公式裡的基址或偏移量寄存器。
索引尋址(變址尋址)
movl 0xFFFF0000(,%eax,4), %ebx
0xFFFF0000(,%eax,4)就是索引尋址,意思是從0xFFFF0000位址開始,加上%eax * 4作為索引的最終位址。
基址尋址
movl 4(%eax), %ebx
4(%eax)就是基址尋址,意思是以eax寄存器裡的數值作為基址,加上4得到最終位址。
注意
在 AT&T 彙編格式中,絕對轉移和調用指令(jump/call)的操作數前要加上’*’作為字首,而在 Intel 格式中則不需要。
參考
http://www.cnblogs.com/hdk1993/p/4820353.html Intel格式和AT&T格式彙編差別
http://www.cnblogs.com/findumars/archive/2013/09/05/3302457.html 彙編的8種尋址方式,以及2個預設段寄存器
http://blog.csdn.net/zr_lang/article/details/39962261 AT&T彙編語言及其尋址方式簡述