天天看點

彙編語言的尋址方式Intel 彙編AT&T 彙編注意參考

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彙編語言及其尋址方式簡述

繼續閱讀