tnblog
首页
视频
资源
登录

GNU ARM 汇编伪指令

1269人阅读 2024/6/27 10:09 总访问:3467445 评论:0 收藏:0 手机
分类: 嵌入式

GNU ARM 汇编伪指令

GNU ARM 汇编伪指令

汇编指令 描述
.section 定义内存段
.text 将定义符开始的代码编译到代码段
.data 数据段
.if .else .endif 条件编译
.end 文件结束
.byte 0x11,'a',0 定义char类型数组(.byte对应的1字节)
.word 0x12,0x445566 定义int型类型(.word 对应4字节)
.string "abcd\0" 定义字符串
.align 4 4字节对齐
ldr r0,=0xE0028008 载入大常数0xE0028008到r0中
.equ GPG3CON,0xE03001C0 定义宏
.global _start 声明__start为全局符号


示例代码:

批量操作指令


ldmia r0!,{r3 - r10} r0里的地址指向的内容批量,load到r3~r10寄存器中,!表示r0里地址自动加4
stmia r0!,{r3 - r10} 把r3~r10寄存器中内容,store到r0里地址执行空间中,r0里地址会自动加4
接下来我们通过一个示例进行示范。

  1. .text
  2. b main
  3. nop
  4. nop
  5. nop
  6. nop
  7. nop
  8. nop
  9. nop
  10. main:
  11. ldr r12,=srcBuf
  12. ldr r13,=dstBuf
  13. @ ldmia r12!,{r0,r1,r3}
  14. ldmia r12!,{r0 - r11}
  15. stmia r13!,{r0 - r11}
  16. main_end:
  17. b main_end
  18. .data
  19. .align 4
  20. srcBuf:
  21. .string "abcdefghijklmnopqrstuvwxyz\0"
  22. dstBuf:
  23. .space 12*4
  24. .end


当我们执行到ldmia r12!,{r0 - r11}之前,我们可以通过r12保存的字符串地址在内存中查看一下数据的情况。


我们可以转成Ascii码查看一下。


然后执行下一条指令,将值赋值到r0到r11之间的寄存器中,查看一下我们的寄存器。


再执行下一条指令,将值赋值到r13指定的内存地址中,并查看一下r13指定的内存地址。

堆栈操作指令


stmfd sp!,{r0-r12,lr}将寄存器r0~r12 lr中的值存入栈中,常用于中断保护现场,!表示会自动偏移。
ldmfd sp!,{r0-r12,pc}将栈中值逐个弹出到寄存器r0~r12 pc中,常用于恢复保护现场,^表示会恢复spsr到cpsr。

软中断指令


swi 0x02产生软中断,调用操作系统编号为02的系统例程。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术