「作為一名合格的程式設計師,組合語言的知識是必不可少的。」
1、intel彙編與at&t格式的彙編不同之處也知道也寫,今天看到一條以前沒見過的:
(變數)符號的位址以「$」開頭,注意是變數的位址。
movl $var,%ebx
區別:movl var,%ebx
2、函式呼叫過程中,關於引數壓棧,和返回後執行指令的位址。
偽碼:.globl fun
.type fun,@function
fun:
pushl %ebp
movl %esp,%ebp
subl $4,%esp
movl 8(%ebp),%eax
movl %eax,-4(%ebp)
movl $3,8(%ebp)
mov $4,12(%ebp)
.globl main
.type main,@function
main:
movl $100,(%esp)
movl $200,4(%esp)
call fun
movl $0,%eax
上面**中,由於4(%ebp)中放置的是從fun函式返回後執行的第1條指令的位址(該位址由「call fun」自動壓棧),所以在fun函式中取兩個引數時的位址時是
movl $3,8(%ebp)
mov $4,12(%ebp)。
3、在函式呼叫過程中,為什麼不直接使用esp定址棧裡面的資料,而要先儲存ebp,在用ebp存放esp,在通過ebp來定址?
其實直接用esp定址也是可以的,只是gcc預設輸出的彙編**是用ebp定址,而用esp勾畫整個函式的棧空間。這樣**比較清晰。如果要追求高效,如在編譯linux核心時,其內部函式就是直接用esp定址的。可以用編譯選項指示gcc直接用esp定址:
$gcc -fomit -frame -poin
組合語言 1
程式語言 組合語言 assembly language 是一種用於電子計算機 微處理器 微控制器或其他可程式設計器件的低階語言,亦稱為符號語言。在組合語言中,用助記符 mnemonics 代替機器指令的操作碼,用位址符號 symbol 或標號 label 代替指令或運算元的位址。在不同的裝置中,組合...
大話組合語言 1
哎喲,哥們兒,還搗鼓彙編呢?那東西沒用,兄弟用vb 釣 乙個api就夠你忙活個十天半月的,還不一定搞出來。此君之言倒也不虛,那吾等還有無必要研他一究呢?廢話,當然有啦!要不然你寫這篇文章幹嘛。別急,別急,讓我把這個中原委慢慢道來 一 所有電腦語言寫出的程式執行時在記憶體中都以機器碼方式儲存,機器碼可...
《組合語言》筆記(1)
說好的學彙編開始了。筆記走起 本書的環境都是8086,8086有14個16位暫存器,有20位位址匯流排,定址能力1mb。16位資料匯流排。組合語言主要是一系列彙編指令,彙編指令就是將機器碼變成了人便於記憶的指令,與01相比,mov,loop更直觀。除了彙編指令,組合語言還包括了偽指令 沒有對應的機器...