組合語言基礎之三 變數的訪問和流程控制指令

2021-09-05 21:56:23 字數 2340 閱讀 2148

訪問變數

與其他等級的程式語言一樣,組合語言能夠用許多方式來訪問變數。變數有三種基本的儲存方式。

1. 全域性變數/靜態變數- 在程式資料區(program data section)分配

2. 區域性變數/引數- 在棧上分配

3. 堆變數- 在堆上分配

全域性,靜態變數

全域性變數儲存在乙個固定的位址上(至少對於程式來說,他們是固定的)。訪問這些變數的最通常的方式是在指令中明確指出那個固定的位址。

mov    eax,[1234134h]        ; loads eax with value stored at location 12341234h

inc      dword ptr test2!_ncount ; increments dword variable ncount

注意,在symbolic資訊可用的時候,debugger會去使用它。

區域性變數,引數

區域性變數和引數存在於棧上,並且是通過ebp(有時候是esp)來訪問的。優化過的**通常會清除掉對棧基指標(frame pointer)的依賴,在這樣的情況下esp暫存器被用來訪問區域性變數,而ebp可以被用來做乙個額外的通用暫存器來使用。當你使用乙個標準棧基指標的時候,指令看起來應該是這樣的。

mov   eax,[ebp+8]   ; load eax with argument

mov   eax,[ebp-4]    ; load eax with local variable

有乙個記憶的小竅門,當ebp沒有作為通用暫存器使用的時候,也就是絕大多數時候,當位移是正的時候,訪問的是引數。當位移是負的時候,訪問的是區域性變數。

注意,典型的第乙個傳遞給函式的引數是ebp+8

堆變數

堆變數存在於堆上,他們是通過指標來訪問的。典型情況下需要不只一條指令來訪問堆變數。

mov   esi, test2!_m_pfilelist     ; load the pointer

mov   eax, [esi+4]                         ; read second dword (pszname) in heap

另乙個需要注意的是,大多數編譯器會將經常訪問的變數放到暫存器中,以便於提高訪問速度。尤其是精簡指令計算機。

執行流控制

控制流命令要不就是有條件的(條件滿足的時候),要不就是無條件的。這些語句支援函式呼叫,if-then-else,switch case等高階的語言成分。

無條件跳轉指令

1. jmp命令

這個命令簡單的設定eip暫存器為下一條指令的位址。沒有任何資料會被儲存到棧上,並且不會設定任何標誌位。jmp被用在固定的指令分支上。大多數的if-then-else語句族至少需要一條jmp指令。

2. call命令

對於jmp和call指令來說,運算元可以是固定的位址,暫存器的值,或者乙個指向分支位址的指標。

3. ret命令

ret指令將當前棧上的值賦給eip暫存器。該命令用來為傳遞給棧的引數修復棧指標。

4. int命令

當int命令的運算元是乙個中斷號的時候,該指令會引發乙個軟體中斷。這個與call指令差不多,不同之處是eflags暫存器被壓入棧中。還有,如果是在user mode中被呼叫,在切換到kernel mode時也會發生將eflag暫存器壓棧的操作。中斷函式結束的時候,隨著reti指令的執行,eflags暫存器和eip都會從棧中恢復。

條件跳轉指令

1, loop adress

loop指令被用來實現高階語言中的迴圈。直到ecx(計數器)的值為0的時候,它才會走向分支位址。如果ecx不是0,那麼ecx會被減一,然後繼續迴圈操作。

xor     eax,eax    ; clear eax register

mov    ecx, 5        ; load loop count

start:

add     eax,1         ; add one to eax

loop  start

2. jnx,je等等

根據條件來跳轉的指令會去判斷所指定的條件是否為真,若果是就執行跳轉。比如,jnz(jump not zero),運算元中指定的位址直到zero標誌位被設定為1的時候才會被轉過去。這些指令主要被用在if語句塊中。

xor    eax,eax   ; clear eax

mov    ecx,5

start:

add    eax,1       ; add one to eax

dec    ecx          ; decrement loop counter

jnz     start

組合語言變數三屬性詳解

1 段屬性 變數的段屬性也就是變數所在段的段位址。變數定義必須寫在乙個段的起止標誌之間。在程式被調入記憶體時,每個段被作業系統安排乙個確定的段位址,在編寫程式時可以用段的名字指出某處要使用段位址,面這個段中的所有變數都統一地以這個段位址作為邏輯位址中的段位址部分。如果在編寫程式時需要使用某個變數的段...

組合語言的基礎

硬體組成 暫存器,儲存器位址和輸入輸出位址。ia 32處理器中被稱之為累加器通用暫存器是eax。ia 32處理器中esp是堆疊指標暫存器。ia 32處理器支援8個32位通用暫存器。eax accumulator 累加器 ebx base address 基址暫存器 ecx counter 計數器 e...

組合語言基礎知識(三)

1.and指令,可以設定操作物件的相應位為0 與操作 2.or指令,可以設定操作物件的相應位位1 或操作 3.si和di是8086cpu中和bx功能相近的暫存器,si和di不能夠分成兩個8位暫存器來使用。4.在程式設計的時候因為暫存器的數量有限,我們應該把臨時變數放到記憶體中 棧 這和高階語言中的l...