
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里地址自动加4stmia r0!,{r3 - r10}
把r3~r10寄存器中内容,store到r0里地址执行空间中,r0里地址会自动加4
接下来我们通过一个示例进行示范。
.text
b main
nop
nop
nop
nop
nop
nop
nop
main:
ldr r12,=srcBuf
ldr r13,=dstBuf
@ ldmia r12!,{r0,r1,r3}
ldmia r12!,{r0 - r11}
stmia r13!,{r0 - r11}
main_end:
b main_end
.data
.align 4
srcBuf:
.string "abcdefghijklmnopqrstuvwxyz\0"
dstBuf:
.space 12*4
.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
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术