AT T組合語言及其定址方式簡述

2021-06-26 05:57:18 字數 1296 閱讀 6363

組合語言早已脫離了主流程式語言的行列,可以說現在基本上沒有人想用它來完成什麼大的專案,但是作為乙個程式設計師懂得組合語言是一種修養一種底蘊。看不懂彙編的程式設計師就像不會畫雞蛋的達文西,像不會寫楷書的王羲之,像不懂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格式...