谷城县城乡建设局网站,博客网站主页代码html,上海推广seo,psd转wordpress文章目录 GNU汇编语法常用汇编指令处理器内部数据传输指令存储器访问指令压栈和出栈指令跳转指令算术指令逻辑运算指令实战 函数发生调用时#xff0c;需要进行线程保护#xff0c;简单来说#xff0c;就是先进行压栈操作#xff0c;将调用函数参数、返回值等存到R0-15寄存… 文章目录 GNU汇编语法常用汇编指令处理器内部数据传输指令存储器访问指令压栈和出栈指令跳转指令算术指令逻辑运算指令实战 函数发生调用时需要进行线程保护简单来说就是先进行压栈操作将调用函数参数、返回值等存到R0-15寄存器中在执行完毕后需要将数据内容从寄存器读出进行出栈操作而这一系列操作需要SP指针。芯片上电后SP指针堆栈指针寄存器还未初始化完毕无法执行C代码所以必须要用汇编设置好C语言环境。 GNU汇编语法
labelinstruction comment
# label标号表示地址位置
# instruction指令代表汇编指令或伪指令
# comment注释/*例子
add:MOVS R0, #0X12 设置 R00X12
/*.global _start 设置start函数为全局供加载器找到该函数之后再实现该函数即可指令不可大小写混用
常用汇编指令
处理器内部数据传输指令
**1MOV指令 ** 将数据从一个寄存器拷贝到另外的寄存器或者将立即数传递到寄存器中 MOV R0, R1 寄存器R0 R1 MOV R0, #0X12 R00X12 2MRS指令 读取特殊寄存器CPSR、SPSR中数据传递给通用寄存器 MRS R0, CPSP R0CPSR 3MSR指令 写特殊寄存器 MSR CPSR, R0 CPSRR0
存储器访问指令
访问IMX6UL存储器需要借助存储器访问指令先写入到R0-R12寄存器再写入到指定存储器RAM中的寄存器中。 1LDR、STR指令 LDR Rd, [Rn,#offset] 从寄存器Rnoffset位置读数据到寄存器Rd中 STR Rd,[Rn,#offset] 将Rd中的数据写入到存储器的Rnoffset位置
LDR R0, 0X0209C004 将寄存器地址 0X0209C004 加载到 R0 中即 R00X0209C004 LDR R1, 0X20000002 R1 保存要写入到寄存器的值即 R10X20000002 STR R1, [R0] 将 R1 中的值写入到 R0 中所保存的地址中即地址0X0209C004的值为0X20000002
LDR、STR 按32位数据操作 LDRB、STRB 按字节操作、 LDRH、STRH 按半字操作
压栈和出栈指令
在函数执行到一半时如果需要执行另外一个函数则需要保留当前处理器状态到寄存器在执行完毕后从寄存器中读取数据恢复现场其中涉及到压栈和出栈。
PUSH 将寄存器列表入栈 POP 从栈中恢复寄存器 等价于 STMFD SP LDMFD SP!
处理器堆栈向下增长栈由高地址向低地址增长起始地址为0x80000000向0x70000000增长 PUSH {R0~R3,R12} 将 R0~R3 和 R12 压栈 PUSH {LR} 将LR进行压栈 POP {LR} 先恢复 LR POP {R0~R3,R12} 在恢复 R0~R3,R12
跳转指令
1B指令 B ,跳转到 label如果跳转范围超过了/-2KB可以指定 B.W 使用 32 位版本的跳转指令 这样可以得到较大范围的跳转.
2BL指令 BL 在跳转到子程序前将PC寄存器值保存到LRR14寄存器执行完后重新将LR寄存器中的值取出继续从跳转之前的代码处运行。
算术指令
ADD 加法 ADC 带进位的加法 SUB 减法 SBC 带借位的减法 MUL 乘法 UDIV 无符号除法 SDIV 有符号除法
逻辑运算指令
AND 按位与 ORR 按位或 BIC 位清除 ORN 按位与非 EOR 按位异或
实战
github路径linux_bsp/board_driver/1.ledc