;定義出所有處理器模式的值,為後面切換處理器做準備
cpu_user_mode equ (0x10)
cpu_fiq_mode equ (0x11)
cpu_irq_mode equ (0x12)
cpu_svc_mode equ (0x13)
cpu_abt_mode equ (0x17)
cpu_und_mode equ (0x1b)
cpu_sys_mode equ (0x1f)
;接下來設定一下堆疊的棧底和堆疊的大小
;系統模式
stack_sys_addr equ (0x33ff8000)
stack_sys_size equ (1024)
;stack_abt_addr equ (stack_sys_addr - stack_sys_size)
stack_abt_size equ (1024)
;未定義模式
stack_und_addr equ (stack_abt_addr - stack_abt_size)
stack_und_size equ (1024)
;快中斷模式
stack_fiq_addr equ (stack_und_addr - stack_und_size)
stack_fiq_size equ (1024)
;中斷模式
stack_irq_addr equ (stack_fiq_addr - stack_fiq_size)
stack_irq_size equ (1024 * 20) ;預設20k給中斷
;管理員模式
stack_svc_addr equ (stack_irq_addr - stack_irq_size)
stack_svc_size equ (1024 * 20)
export stack_init
area stack, code, readonly ;定義啟動**區域
code32
stack_init proc
;切換處理器,要先儲存cpsr,只要改變c控制域
mrs r6, cpsr
bic r6, #0x1f ;把最低五位清零,方便後面設定值
;切換到sys模式,設定sys和usr的棧底
orr r0, r6, #cpu_sys_mode
msr cpsr_c, r0
ldr sp, =stack_sys_addr ;設定堆疊指標
;切換到abt模式,設定abt的棧底
orr r0, r6, #cpu_abt_mode
msr cpsr_c, r0
ldr sp, =stack_abt_addr ;設定堆疊指標
;切換到und模式,設定und的棧底
orr r0, r6, #cpu_und_mode
msr cpsr_c, r0
ldr sp, =stack_und_addr ;設定堆疊指標
;切換到fiq模式,設定fiq的棧底
orr r0, r6, #cpu_fiq_mode
msr cpsr_c, r0
ldr sp, =stack_fiq_addr ;設定堆疊指標
;切換到irq模式,設定irq的棧底
orr r0, r6, #cpu_irq_mode
msr cpsr_c, r0
ldr sp, =stack_irq_addr ;設定堆疊指標
;切換到svc模式,設定svc的棧底
orr r0, r6, #cpu_svc_mode
msr cpsr_c, r0
ldr sp, =stack_svc_addr ;設定堆疊指標
bx lr ;返回
endp
end
彙編之堆疊
當我們看了暫存器的詳解後,及了解算術中的變數,下面我們來看一下,在8086cpu中一些計算法則規則的講解。先來看一下記憶體中字的儲存 傳送。字儲存 cpu中,用16位暫存器來儲存乙個字。高8位存放高位位元組,低8位存放低位位元組。由於記憶體單元是以位元組單位,則乙個字需要兩個連續的記憶體單元來存放。...
彙編之函式 堆疊傳參
函式就是一系列指令的集合,為了完成某個會重複使用的特定功能。比如 mov eax,1 mov ecx,1 就相當於乙個函式 指令的集合 1 使用jmp來執行函式 2 使用call來執行函式 以四條指令向普通暫存器儲存值為例 call執行前 call執行後 f8 可以看到call指令把當前指令的下一條...
組合語言資料傳送指令之堆疊操作指令
處理器通常用硬體支援堆疊 stack 資料結構,它是乙個按 先進後出 first in lastout,filo 訪問原則組織的儲存區域,也可以說是 後進先出 last in first out,lifo 訪問原則。堆疊具有兩種基本操作,對應兩條基本指令 資料壓進堆疊操作對應進棧指令push 資料彈...