組合語言早已脫離了主流程式語言的行列,可以說現在基本上沒有人想用它來完成什麼大的專案,但是作為乙個程式設計師懂得組合語言是一種修養一種底蘊。看不懂彙編的程式設計師就像不會畫雞蛋的達文西,像不會寫楷書的王羲之,像不懂tcp/ip的黑客……
本文為後文做鋪墊,適合已經有一點彙編基礎的人快速瀏覽閱讀,如果沒有這個基礎請自行學習。組合語言論風格來分主要是兩類,一類是intel彙編,一類是at&t彙編,分別被windows和linux作為主流風格。因為我部落格以推薦linux系統為主,所以以後多以linux彙編為主要描述語言。
簡單說一下at&t彙編,"#"井號開頭的是注釋行,"."點開始的指令一般都是偽指令,"$"美元符號修飾立即數,"%"修飾暫存器。例如:
.section .data
表示資料段的開始
movl $1, %eax
表示把數字1寫入eax暫存器。
movl 0xffff0000, %ebx
表示把0xffff0000位址處的32位數寫入ebx暫存器。
定址方式:
位址或偏移 (%基址或偏移量暫存器, %索引暫存器, 比例因子)
最終位址 = 位址或偏移 + %基址或偏移量暫存器 + %索引暫存器 * 比例因子
這一串東西基本上都是可選的,沒寫的項基本上算以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得到最終位址。也可以匹配到上面的通用公式,而且這個是很常用的定址方式。
反正不管怎麼變,萬變不離其宗。
組合語言定址方式
組合語言的定址方式 彙編有7種定址方式 mov 是組合語言用得最多的語句 他的使用方法 是 mov 目的位址,源位址 下面便通過mov來介紹組合語言的幾種定址方式 1.立即定址 mov ax,1234h 2.暫存器定址 mov si,ax 源運算元和目的運算元 同時為暫存器 3.直接定址 mov a...
組合語言 AT T組合語言
這兩天的pwn題環境都是在linux中,採用的組合語言是 at t 格式。之前學習的是intel格式的8086彙編,今天學習了下at t組合語言。基於x86 架構的處理器所使用的彙編指令一般有兩種格式 操作intel格式at t格式 暫存器命名 push eax pushl eax 常數 立即運算元...
AT T組合語言
at t彙編和8086組合語言雖然兩者很相似,但是還是不能根據8086的語法規則來讀at t彙編的吧,所以還是要看看at t彙編的語法規則,因為在讀核心 時,跟硬體打交道的部分 是用at t彙編編寫的,所以不可避免的會遇到at t彙編,下面先來看看at t彙編的語法規則吧。一 大小寫 intel格式...