【ARM】ARM汇编程序设计(一)
00. 目录
文章目录
- 00. 目录
- 01. 第一个汇编程序
- 02. printf函数
- 03. 字符串
- 04. 进制
- 05. mov指令
- 06. mvn指令
- 07. add指令
- 08. sub指令
- 09. rsb指令
- 10. and指令
- 11. bic指令
- 12. orr指令
- 13. eor指令
- 14. mul指令
- 15. 附录
01. 第一个汇编程序
源程序
.section .rodata.align 2
.LC0:.string "hello arm".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0bl putsmov r0, #0pop {lr}bx lr
编译执行
# PC端
[root@itcast 1st]# arm-linux-gcc test.s -o test
[root@itcast 1st]# # ARM板执行
[root@itcast 1st]# ./test
hello arm
[root@itcast 1st]#
程序改进版本
.section .rodata.align 2
.LC0:.string "hello arm".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0bl putsmov r0, #0pop {pc}
编译执行
[root@itcast 1st]# arm-linux-gcc test.s -o test
[root@itcast 1st]# [root@itcast 1st]# ./test
hello arm
[root@itcast 1st]#
02. printf函数
程序如下:
.section .rodata.align 2
.LC0:.string "val = %d\n".LC1:.string "val = %d %d %d\n".LC2:.string "val = %d %d %d %d\n".section .text.align 2.global main
main:push {lr}@printf("val = %d\n", 123);ldr r0, =.LC0mov r1, #123bl printf@printf("val = %d %d %d\n", 11, 22, 33);ldr r0, =.LC1mov r1, #11mov r2, #22mov r3, #33bl printf@printf("val = %d %d %d %d\n", 11, 22, 33, 44);ldr r0, =.LC2mov r1, #11mov r2, #22mov r3, #33mov r4, #44push {r4}bl printfpop {r4}mov r0, #0pop {pc}
执行结果
[root@itcast 1st]# ./a.out
val = 123
val = 11 22 33
val = 11 22 33 44
[root@itcast 1st]#
友情提示
当传递参数超过4个时候,需要使用栈传递参数。
03. 字符串
程序示例:
.section .rodata.align 2
.LC0:.string "hello arm\n".LC1:.ascii "hello arm\n\0".LC2:.asciz "hello arm\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0bl printfldr r0, =.LC1bl printfldr r0, =.LC2bl printfmov r0, #0pop {pc}
友情提示
.string 会在字符串后面自动添加\0
.asciz 会在字符串后面自动添加\0
.ascii 不会在字符串后面自动添加\0
04. 进制
程序示例
.section .rodata.align 2
.LC0:.string "val = %d\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r1, #10bl printfldr r0, =.LC0mov r1, #010bl printfldr r0, =.LC0mov r1, #0x10bl printfldr r0, =.LC0mov r1, #0b10bl printfmov r0, #0pop {pc}
执行结果
[root@itcast 1st]# ./a.out
val = 10
val = 8
val = 16
val = 2
[root@itcast 1st]#
友情提示
二进制 0b10
八进制 010
十进制 10
十六进制 0x10
05. mov指令
程序示例一: 立即数
.section .rodata.align 2
.LC0:.string "val = %d\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0@@mov r1, #0x123@mov r1, #0x7f8@mov r1, #0xc80000003@mov r1, #0xc80000007@mov r1, #0x10000008mov r1, #0xffbl printfmov r0, #0pop {pc}
执行结果:
[root@itcast 1st]# ./a.out
val = 255
[root@itcast 1st]#
程序示例二:移位操作
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #0x100mov r1, r2, LSL #4bl printfmov r0, #0pop {pc}
执行结果:
[root@itcast 1st]# ./a.out
val = 0x1000
[root@itcast 1st]#
程序示例三: 移位操作
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #0xff000000@mov r1, r2, LSR #31@mov r1, r2, ASR #31mov r1, r2, ROR #31bl printfmov r0, #0pop {pc}
执行结果:
[root@itcast 1st]# ./a.out
val = 0xfe000001
[root@itcast 1st]#
程序示例四:表达式
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r1, #(100/4 + 3 * 2 + 1)bl printfmov r0, #0pop {pc}
程序示例五:优化处理
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r1, #0xffffffffbl printfmov r0, #0pop {pc}
执行结果:
[root@itcast 1st]# ./a.out
val = 0xffffffff
[root@itcast 1st]#
06. mvn指令
程序示例
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mvn r1, #0xffffff00bl printfmov r0, #0pop {pc}
执行结果:
[root@itcast 1st]# ./a.out
val = 0xff
[root@itcast 1st]#
07. add指令
程序示例:
.section .rodata.align 2
.LC0:.string "val = %d\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #1mov r3, #2mov r1, r2@r1 = r2 + r3@add r1, r2, r3@r1 = r2 + 8@add r1, r2, #8@r1 = r1 + 1@add r1, r1, #1@r1 = r1 + 1@add r1, #1@r1 = r2 + r3 << 2add r1, r2, r3, LSL #2bl printfmov r0, #0pop {pc}
执行结果:
[root@itcast 1st]# ./a.out
val = 9
[root@itcast 1st]#
08. sub指令
程序示例:
.section .rodata.align 2
.LC0:.string "val = %d\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #1mov r3, #2mov r1, r2@r1 = r3 - r2@sub r1, r3, r2@r1 =r2 - r3@sub r1, r2, r3@r1 = r3 - 1sub r1, r3, #1bl printfmov r0, #0pop {pc}
09. rsb指令
程序示例
.section .rodata.align 2
.LC0:.string "val = %d\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #1mov r3, #2mov r1, r2@r1 = r3 - r2@rsb r1, r2, r3@r1 = 10 - r2rsb r1, r2, #10bl printfmov r0, #0pop {pc}
10. and指令
程序示例:
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #0xffmov r3, #0x3@r1 = r2 & r3and r1, r2, r3bl printfmov r0, #0pop {pc}
11. bic指令
程序示例
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #0xffmov r3, #0x3@r1 = r2 & ~r3bic r1, r2, r3bl printfmov r0, #0pop {pc}
12. orr指令
程序示例:
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #0xf0mov r3, #0x3@r1 = r2 | r3orr r1, r2, r3bl printfmov r0, #0pop {pc}
13. eor指令
程序示例
.section .rodata.align 2
.LC0:.string "val = %p\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #0xffmov r3, #0x3@r1 = r2 ^ r3eor r1, r2, r3bl printfmov r0, #0pop {pc}
14. mul指令
程序示例
.section .rodata.align 2
.LC0:.string "val = %d\n".section .text.align 2.global main
main:push {lr}ldr r0, =.LC0mov r2, #3mov r3, #8mov r1, #1@r1 = r2 * r3@mul r1, r2, r3@r1 = r1 * r2mul r1, r1, r2bl printfmov r0, #0pop {pc}
15. 附录
【ARM】ARM汇编程序设计(一)相关推荐
- linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计
嵌入式Linux ARM汇编(四)--ARM汇编程序设计 汇编程序有顺序.循环.分支.子程序四种结构形式. 一.顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf ...
- ARM汇编程序设计实例
10.5 ARM汇编程序设计举例 在本节中通过一些例子来说明ARM中伪操作及指令的基本用法. 10.5.1 条件跳转及循环 1.ALU状态标志 所有ARM指令都可以条件执行.大部分ARM指令集和T ...
- ARM汇编与ARM GNU汇编 区别
一.想学汇编,at&t汇编与ARM汇编的区别? 问:想学汇编语言,因为现在用的是linux系统(ubuntu 11.04),so 有一本<汇编语言程序设计>马朝晖译,可惜淘宝.当当 ...
- ARM官方汇编与ARM GNU汇编中的伪操作
以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 (1)嵌入式Linux ARM汇编 (2)GNU ARM 汇编基础 - wanli1024 - 博客园 (3)GNU ARM 汇编简介 ...
- 【干货来袭】arm程序汇编指令总结,让你更高效的学习!
现在学嵌入式的人也是越来越多了,那当然arm程序也是必须要学的,在这里有很多人对arm程序汇编指令都或多或少的不了解,可以说不熟悉,今天就以arm程序来看,让你对arm程序汇编指令有更深入的学习. 首 ...
- ARM标准汇编与GNU汇编
前段时间看arm的汇编,发现很多有一个小点,但是借来的书上的语法却没有,问同学也不知道,于是在网上查了一番才发现我书上看到的是arm的标准汇编,而有小点的gnu的汇编,于是将收集到的资料整理后放到这里 ...
- ARM GUN汇编标准
汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等.这些初始化工作完成后就可以跳转到C代码main函数中执行. 首先得明白,汇编标准和ARM的汇编指令是分开的,因 ...
- SIMD优化之ARM纯汇编开发
ARM纯汇编开发 注:这篇文章是两年前写的,现在更新到CSDN.当时认知不足,其中可能有不少错误,敬请行家指正. 为什么要用纯汇编 开发效率高 这里可能让很多人大跌眼镜了,纯汇编开发效率高? 首先,这 ...
- ARM GCC汇编伪指令
转载,原文地址:http://blog.chinaunix.net/uid-20626696-id-199009.html word expression就是在当前位置放一个word型的值,这个值就是 ...
- 汇编程序设计与计算机体系结构软件工程师教程笔记:总结
<汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...
最新文章
- 浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式 pth中的路径加载使用
- cfnet用于嵌入式_做嵌入式驱动的,你一定要挺住!
- 性能测试应该怎么做?
- python导入词云包失败:ImportError:cannot import name ‘WordCloud’
- 使用promise解决回调地狱_使用Promise 解决回调地狱
- boost::flyweight模块实现自定义工厂模式的示例
- Netty 简单样例分析(io传输的框架)
- 解决tsvncache.exe引起电脑慢的问题
- jquery对json的各种遍历
- Tomcat应用中post方式传参数长度限制
- 二、python基础
- UpdateProgress控件
- QQ空间那年今日 人人过往的今天
- 区块链 交易怎么验证是否被篡改 SPV验证
- Contacts Provider使用
- Mac中无法运行旧版本印象笔记:版本太旧 你的本地印象笔记数据是由新版印象笔记管理
- 服务器怎么开账号,大芒果服务器怎么创建GM账号?
- 【聚沙成塔系列】之《UML九种图
- STM32H750移植STemWin,驱动ST7789
- 不同标准下的ESD HBM模型 2021-05-29