雜記之Linux組合語言(AT T語法)(二)

2021-06-10 16:45:18 字數 1594 閱讀 4191

#求一族數中最大值的匯程式設計序

#找到最大值後,並把它作為程式的退出狀態

.section    .data

data_items:       #these are the data items

.long 3,67,34,222,45,75,54,34,0

#.long 指示宣告一族數,每個數占32 位,相當於c語言的陣列

#這個陣列開頭定義了乙個符號data_items,彙編器會把陣列的首位址作為data_items符號所代表的位址

#data_items型別於c語言的陣列名

#data_items這個符號沒有globl宣告,因為它只有在這個匯程式設計序內部使用,鏈結器不需要用到這個名字

#技巧:data_items陣列最後乙個數是0,我們在乙個迴圈中依次比較每個數,碰到0迴圈中止

.section    .text         # 不是code

.globl     _start

_start:

movl  $0,%edi                                     #初識化edi,指向陣列的第0個元素

movl  data_items(,%edi,4),%eax       

#比較intel寫法:data_items[edi+4]

# 這條指令把陣列的第0個傳送到eax暫存器中

#data_items是陣列的首位址,edi的值是陣列的下標,4表示陣列的每個元素佔4個位元組

#那麼陣列中第edi個元素的位址應該是data_item+edix4

movl   %eax,%ebx            #剛開始時,將陣列的第0個元素作為最大值

start_loop:

cmpl   $0,%eax              #cmpl指令將兩個運算元相減,不儲存結果,改變eflags暫存器的標誌位

je        start_loop                                       #檢測是否到陣列末尾

incl     %edi

movl   data_items(,%edi,4),%eax        #將陣列的下乙個元素傳送到eax中

cmpl   %ebx,%eax

jle       start_loop                                      

#然後跳轉到迴圈開頭比較下乙個數

loop_exit:

#這樣,結果存在%ebx中作為程式的退出狀態

movl   $1,%eax

int        $0x80                                            

#系統呼叫,退出程式

#除了.long之外,常用的資料宣告還有.byte(8位) .ascii例如.ascii"hello world",取值為相應的ascii碼。注意和c 語言不同的是這樣宣告的字串末尾沒有『\n』字元的。

大多數的系統呼叫完成之後,會返回使用者空間繼續執行後面的指令,而_exit系統呼叫比較特殊,它會終止當前程序,而不是返回使用者空間繼續執行。

筆記摘自《linux c 程式設計 一站式學習》.宋勁杉  編著

組合語言 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格式...

AT T組合語言筆記

1。在gcc產生的彙編中,0x80498d4表示立即數,而0x80498d4表示記憶體位址0x80498d4對應的內容。對於lable,比如value,則 value表示value的位址,value表示value的值。設函式func的位址 func 0x8048828 這兩種呼叫都是一樣的 1 ca...