匯編語言論風格來分主要是兩類,一類是Intel匯編,一類是AT&T匯編,分別被Windows和Linux作為主流風格。因為我博客以推薦Linux系統為主,所以以后多以Linux匯編為主要描述語言。
簡單說一下AT&T匯編,"#"井號開頭的是注釋行,"."點開始的指令一般都是偽指令,"$"美元符號修飾立即數,"%"修飾寄存器。例如:
尋址方式(Addrsing mode),就是指數據的組織方式,固定格式為:地址或偏移 (%基址或偏移量寄存器, %索引寄存器, 比例因子)
則 最終地址 = 地址或偏移 + %基址或偏移量寄存器 + %索引寄存器 * 比例因子
這一串東西基本上都是可選的,沒寫的項基本上算以0代替,不同的組合就成了不同的尋址方式,如下:
1) 直接尋址
movl ADDRESS, %eax
ADDRESS其實就相當於"地址或偏移"里的地址,反正就是一個數字。
2)寄存器尋址
其實上面的例子也包括了寄存器尋址,顧名思義%eax就是寄存器尋址,代表對這個寄存器本身的寫入或讀出。
3)立即尋址
movl $2, %ebx
我一直覺得立即尋址算不算尋址,反正它的意思就是把2這個數字寫入%eax寄存器,$2就是立即尋址,其實就是立即數。
4)間接尋址
movl (%eax), %ebx
(%eax)就是間接尋址了,意思就是訪問eax寄存器里的數值所代表的地址。相當於通用公式里的%基址或偏移量寄存器。
5)索引尋址(變址尋址)
movl 0xFFFF0000(,%eax,4), %ebx
0xFFFF0000(,%eax,4)就是索引尋址,意思是從0xFFFF0000地址開始,加上%eax * 4作為索引的最終地址。請自行匹配上面的通用公式。
6)基址尋址
movl 4(%eax), %ebx
4(%eax)就是基址尋址,意思是以eax寄存器里的數值作為基址,加上4得到最終地址。也可以匹配到上面的通用公式,而且這個是很常用的尋址方式。
https://www.cnblogs.com/orlion/p/5765339.html
http://blog.csdn.net/column/details/linuxcode.html
http://blog.csdn.net/jnu_simba/article/details/11747901