广州官方新闻,快优吧seo优化,公众号网站开发用什么模板,wordpress文字居中汇编初始化栈指针#xff0c;interrupt,svc preserve8 ;preserve8 和 restore8 通常用于保护寄存器的状态;以确保在函数调用前后某些寄存器的值保持不变area reset,code,readonlycode32entryb startldr pc,do_undefined;这些地址不能随便写#xff0c;0x0,0x4,0x8....这些… 汇编初始化栈指针interrupt,svc preserve8 ;preserve8 和 restore8 通常用于保护寄存器的状态;以确保在函数调用前后某些寄存器的值保持不变area reset,code,readonlycode32entryb startldr pc,do_undefined;这些地址不能随便写0x0,0x4,0x8....这些地址代表异常向量表;代码不能随便写在这个地址处发生异常时系统会自动到这个地址会执行这个函数ldr pc,do_sw_intldr pc,do_pre_abortldr pc,do_dat_abortnop空指令ldr pc,do_irqldr pc,do_fiqdo_undefinedb do_undefined
do_sw_intimport swi_int_handlerstmfd sp!,{r0-r12,lr} ;不仅把swi的lr入栈是把所有模式的lr都入栈 把user的lr也入栈相当于lr指向执行67行bl sw_int_handlerldmfd sp!,{r0-r12,pc}^ ;恢复的时候把所有模式出栈只不过此时把user的lr给pc
do_pre_abortb do_pre_abort
do_dat_abortb do_dat_abort
do_irqimport irq_handlersub lr,lr,#4stmfd sp!,{r0-r12,lr}bl irq_handlerldmfd sp!,{r0-r12,pc}^
do_fiqb do_fiq;bx lr ;跳到寄存器中的地址start ldr sp,0x40001000 ;立即数之外的数也可以用mrs r0,cpsr ;m域interupt模式设置bic r0,r0,#0x1forr r0,r0,#0x12bic r0,r0,#(17)msr cpsr_c,r0ldr r0,0x40001000 ;设置栈指针sub r0,r0,#1024mov sp,r0mrs r0,cpsr ;m域user模式设置bic r0,r0,#0x1forr r0,r0,#0x10msr cpsr_c,r0ldr r0,0x40001000sub r0,r0,#2048mov sp,r0import mainb mainasm_fnexport asm_fnswi #7bx lr;stmfd sp!,{r0-r12,lr} ;storage many full d; bl addfun ;跳到标签地址并把当前pc值给lr;mov r0,#1;mov r1,#2;mov r2,#3;bl max;ldmfd sp!,{r0-r12,lr}
finishedb finishedend
#includestdio.h
extern max(int a,int b,int c);
extern void undefined_handler(void);
extern void swi_int_handler(void);
extern void pre_abort_handler(void);
extern void dat_abort__handler(void);
extern void irq_handler(void);
extern void fiq_handler(void);
extern void asm_fn(void);max(int a,int b,int c)
{int dab?a:b;int ece?c:e;return e;
}void undefined_handler(void)
{
}
void swi_int_handler(void)
{
}
void pre_abort_handler(void)
{
}
void dat_abort_handler(void)
{
}
void irq_handler(void)
{
}
void fiq_handler(void)
{
}
int main(void)
{asm_fn();//从这边调汇编的函数自动把pc放到lr里面while(1);}mvn,不是立即数按位取反装
ldr是伪指令实际由好几个指令组合在一起加等号可以直接装入寄存器
mov移入代码内部提高代码密度ldr实际上是把数据放到代码区里面占4个字节
软中断 vs. 硬件中断1. 触发机制•软中断通过 swi 指令触发。•硬件中断通过外部事件触发。2. 返回机制•软中断通常通过修改 PC 来返回到调用点。•硬件中断通过 bx lr 指令返回到中断前的位置。3. 上下文保存和恢复•软中断通常不需要显式保存和恢复寄存器状态。•硬件中断需要显式保存和恢复寄存器状态。恢复位置的区别1. 软中断•在软中断中返回地址通常保存在 LR 中但操作系统会直接修改 PC 来返回到调用点因此不需要调整 LR。•相当于直接返回到下一条指令。2. 硬件中断•在硬件中断中返回地址也被保存在 LR 中但为了返回到中断发生前的指令位置通常需要将 LR 减去 4因为 LR 中保存的是中断发生后的下一条指令地址。•相当于返回到中断发生时的指令位置。总结•软中断SWI•通常用于调用系统调用。•通过修改 PC 来返回到调用点相当于直接返回到下一条指令。•硬件中断•用于处理外部事件。•通过 bx lr 指令返回到中断前的位置通常需要调整 LR 来确保返回到中断发生时的指令位置
在中断处理期间lr链接寄存器Link Register通常是 r14中保存的是中断发生后的下一条指令的地址。这一地址在整个中断处理期间保持不变直到中断处理程序结束并返回到中断发生前的位置。详细解释1. 中断发生时•当中断发生时处理器会保存当前程序计数器PC的值到 lr 中。•当前 PC 的值实际上是中断发生后下一条指令的地址。2. 中断处理程序•在进入中断处理程序时通常会保存当前寄存器的状态包括 lr到堆栈中以防止中断处理程序覆盖这些寄存器的值。•在处理完中断后再从堆栈中恢复寄存器的状态并通过 lr 中保存的地址返回到中断发生前的位置。
在ARM架构中lr链接寄存器通常用于保存返回地址。当发生中断或异常时处理器会自动保存当前 PC 的值到 lr 中以便在处理完中断或异常后能够返回到中断或异常发生前的位置。具体来说•中断发生时lr 中保存的是中断发生后的下一条指令的地址。•中断处理期间lr 中保存的地址不会改变始终是中断发生后的下一条指令的地址。•中断处理程序结束时通过 ldmfd sp!,{r0-r12,pc}^ 指令恢复寄存器状态并将 pc 设置为 lr 中保存的地址从而返回到中断发生前的位置。
中断模式和User模式的切换1. 中断发生时•当中断发生时处理器会自动进入中断模式如IRQ模式并将当前的CPSR保存到SPSR中。•这时lr 中保存的是中断发生后的下一条指令的地址。2. 中断处理期间•在中断处理期间lr 中保存的地址不会改变始终是中断发生后的下一条指令的地址。•处理器处于中断模式如IRQ模式。3. 中断处理结束时•在中断处理结束后通过恢复寄存器状态并返回到中断发生前的位置处理器会恢复到原来的模式如User模式。
模式切换1. 进入中断模式•当中断发生时处理器会自动进入中断模式如IRQ模式并将当前的CPSR保存到SPSR中。•这时CPSR中的模式位会被设置为中断模式。2. 恢复到原来的模式•在中断处理结束后通过恢复寄存器状态并返回到中断发生前的位置处理器会恢复到原来的模式如User模式。•这是通过恢复SPSR中的状态来实现的。
在ARM架构中当发生中断或异常时处理器会自动保存当前的程序状态寄存器CPSR到备份程序状态寄存器SPSR中。具体来说SPSR中保存的信息取决于处理器当前的模式。SPSR 的作用SPSRSaved Program Status Register用于在进入中断或异常处理时保存当前的CPSR状态。当退出中断或异常处理时可以通过恢复SPSR中的状态来回到原来的工作模式。SPSR 在不同模式下的别名在ARM架构的不同模式下SPSR有不同的别名•用户模式User Mode无SPSR因为用户模式下不发生模式切换。•管理模式Supervisor ModeSPSR_SVC•中止模式Abort ModeSPSR_ABT•未定义模式Undefined ModeSPSR_UND•IRQ模式IRQ ModeSPSR_IRQ•FIQ模式FIQ ModeSPSR_FIQ中断处理过程中的模式切换1. 进入中断模式•当中断发生时处理器会自动进入中断模式如IRQ模式并将当前的CPSR保存到对应的SPSR中如SPSR_IRQ。•这时CPSR中的模式位会被设置为中断模式。2. 中断处理期间•在中断处理期间处理器处于中断模式如IRQ模式。3. 恢复到原来的模式•在中断处理结束后通过恢复SPSR中的状态来恢复到原来的模式如User模式
SPSR 在 IRQ 模式下的状态当进入IRQ模式时SPSR中保存的是IRQ发生前的CPSR状态。具体来说•模式位指示当前的工作模式通常是User模式。•中断禁止位指示是否禁止IRQ和FIQ中断。•条件码指示当前运算的条件码如进位标志、零标志等