彙編學習記錄2

2021-07-24 09:55:22 字數 1302 閱讀 8570

組合語言的思路

函式的工作原理

1、常用指令

為了照顧到沒學過匯程式設計序的同志們,這裡簡單介紹一下常見的幾種彙編指令。

a、add:加法指令,第乙個是目標運算元,第二個是源運算元,格式為:目標運算元 = 目標運算元 + 源運算元;

b、sub:減法指令,格式同 add;

c、call:呼叫函式,一般函式的引數放在暫存器中;

d、ret:跳轉會呼叫函式的地方。對應於call,返回到對應的call呼叫的下一條指令,若有返回值,則放入eax中;

e、push:把乙個32位的運算元壓入堆疊中,這個操作在32位機中會使得esp被減4(位元組),esp通常是指向棧頂的(這裡要指出的是:學過微控制器的同學請注意微控制器種的堆疊與windows下的堆疊是不同的,請參考相應資料),這裡頂部是位址小的區域,那麼,壓入堆疊的資料越多,esp也就越來越小;

f、pop:與push相反,esp每次加4(位元組),乙個資料出棧。pop的引數一般是乙個暫存器,棧頂的資料被彈出到這個暫存器中;

一般不會把sub、add這樣的算術指令,以及call、ret這樣的跳轉指令歸入堆疊相關指令中。但是實際上在函式引數傳遞過程中,sub和add最常用來操作堆疊;call和ret對堆疊也有影響。

g、mov:資料傳送。第乙個引數是目的運算元,第二個引數是源運算元,就是把源運算元拷貝到目的乙份。

h、xor:異或指令,這本身是乙個邏輯運算指令,但在彙編指令中通常會見到它被用來實現清零功能。

用 xor eax,eax這種操作來實現 mov eax,0,可以使速度更快,占用位元組數更少。

i、lea:取得第二個引數位址後放入到前面的暫存器(第乙個引數)中。

然而lea也同樣可以實現mov的操作,例如:

lea edi,[ebx-0ch]

方括號表示儲存單元,也就是提取方括號中的資料所指向的內容,

然而lea提取內容的位址,這樣就實現了把(ebx-0ch)放入到了edi中,但是mov指令是不支援第二個運算元是乙個暫存器減去乙個數值的。

j、stos:序列儲存指令,它實現把eax中的資料放入到edi所指的位址中,同時edi後移4個位元組,這裡的stos實際上對應的是stosd,其他的還有stosb,stosw分別對應1,2個位元組。

k、jmp:無條件跳轉指令,對應於大量的條件跳轉指令。

l、jg:條件跳轉,大於時成立,進行跳轉,通常條件跳轉之前會有一條比較指令(用於設定標誌位)。

m、jl:小於時跳轉。

n、jge:大於等於時跳轉。

o、cmp:比較大小指令,結果用來設定標誌位。

p ,rep 根據ecx暫存器的值進行重複迴圈操作

彙編學習記錄

加粗樣式今天看到了驅動開發教程裡的中斷這一章了,結果課本直接先來一段組合語言,然而我早已把彙編忘得一乾二淨了,無奈只能重新再學一下了 cpsr是記錄當前的工作模式的狀態暫存器,在超級使用者模式下,可以用如下指令改變當前使用者模式 mov r3 0xd3 不能直接用立即數直接對cpsr暫存器賦值,必須...

組合語言學習與記錄(2)

答 首先先看之前記錄的 乙個cpu有n根位址匯流排,我們就可以說這個cpu的位址匯流排寬度為n,那麼這個cpu就可以尋找2的n次方個儲存單元.我們知道乙個儲存單元可以儲存乙個位元組 byte 8kb 8192byte 就變成2的n次方 8192 n 13.答 我們知道儲存單元的單位是位元組,所以應為...

彙編學習 2

1.輸入乙個無符號數,統計 0 的個數 unsigned int a int count printf 輸入乙個無符號整數 scanf u a asm2.輸入兩個字元 a7a6 a1a0和b7b6 b1b0 合併為16位無符號整數 a7b7a6b6 a1b1a0b0 char a,b unsigne...