#求一族數中最大值的匯程式設計序
#找到最大值後,並把它作為程式的退出狀態
.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...