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汇编程序设计(一)相关推荐

  1. linux 嵌入式汇编 adc,嵌入式Linux ARM汇编(四)——ARM汇编程序设计

    嵌入式Linux ARM汇编(四)--ARM汇编程序设计 汇编程序有顺序.循环.分支.子程序四种结构形式. 一.顺序结构 程序实例: AREA Buf,DATA,READWRITE;定义数据段Buf ...

  2. ARM汇编程序设计实例

    10.5  ARM汇编程序设计举例 在本节中通过一些例子来说明ARM中伪操作及指令的基本用法. 10.5.1  条件跳转及循环 1.ALU状态标志 所有ARM指令都可以条件执行.大部分ARM指令集和T ...

  3. ARM汇编与ARM GNU汇编 区别

    一.想学汇编,at&t汇编与ARM汇编的区别? 问:想学汇编语言,因为现在用的是linux系统(ubuntu 11.04),so 有一本<汇编语言程序设计>马朝晖译,可惜淘宝.当当 ...

  4. ARM官方汇编与ARM GNU汇编中的伪操作

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 (1)嵌入式Linux ARM汇编 (2)GNU ARM 汇编基础 - wanli1024 - 博客园 (3)GNU ARM 汇编简介 ...

  5. 【干货来袭】arm程序汇编指令总结,让你更高效的学习!

    现在学嵌入式的人也是越来越多了,那当然arm程序也是必须要学的,在这里有很多人对arm程序汇编指令都或多或少的不了解,可以说不熟悉,今天就以arm程序来看,让你对arm程序汇编指令有更深入的学习. 首 ...

  6. ARM标准汇编与GNU汇编

    前段时间看arm的汇编,发现很多有一个小点,但是借来的书上的语法却没有,问同学也不知道,于是在网上查了一番才发现我书上看到的是arm的标准汇编,而有小点的gnu的汇编,于是将收集到的资料整理后放到这里 ...

  7. ARM GUN汇编标准

    汇编源程序一般用于系统最基本的初始化:初始化堆栈指针.设置页表.操作 ARM的协处理器等.这些初始化工作完成后就可以跳转到C代码main函数中执行. 首先得明白,汇编标准和ARM的汇编指令是分开的,因 ...

  8. SIMD优化之ARM纯汇编开发

    ARM纯汇编开发 注:这篇文章是两年前写的,现在更新到CSDN.当时认知不足,其中可能有不少错误,敬请行家指正. 为什么要用纯汇编 开发效率高 这里可能让很多人大跌眼镜了,纯汇编开发效率高? 首先,这 ...

  9. ARM GCC汇编伪指令

    转载,原文地址:http://blog.chinaunix.net/uid-20626696-id-199009.html word expression就是在当前位置放一个word型的值,这个值就是 ...

  10. 汇编程序设计与计算机体系结构软件工程师教程笔记:总结

    <汇编程序设计与计算机体系结构: 软件工程师教程>这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译.中文版是2019年出版的.个人感觉这本书真不错,书中介绍了 ...

最新文章

  1. 浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式 pth中的路径加载使用
  2. cfnet用于嵌入式_做嵌入式驱动的,你一定要挺住!
  3. 性能测试应该怎么做?
  4. python导入词云包失败:ImportError:cannot import name ‘WordCloud’
  5. 使用promise解决回调地狱_使用Promise 解决回调地狱
  6. boost::flyweight模块实现自定义工厂模式的示例
  7. Netty 简单样例分析(io传输的框架)
  8. 解决tsvncache.exe引起电脑慢的问题
  9. jquery对json的各种遍历
  10. Tomcat应用中post方式传参数长度限制
  11. 二、python基础
  12. UpdateProgress控件
  13. QQ空间那年今日 人人过往的今天
  14. 区块链 交易怎么验证是否被篡改 SPV验证
  15. Contacts Provider使用
  16. Mac中无法运行旧版本印象笔记:版本太旧 你的本地印象笔记数据是由新版印象笔记管理
  17. 服务器怎么开账号,大芒果服务器怎么创建GM账号?
  18. 【聚沙成塔系列】之《UML九种图
  19. STM32H750移植STemWin,驱动ST7789
  20. 不同标准下的ESD HBM模型 2021-05-29

热门文章

  1. Windows ICS 服务无法启动问题解决
  2. 基于八叉树快速分类的Shear-Warp交互式体绘制算法
  3. 每日程序C语言47-找到年龄最大的人并输出
  4. python回归方程系数计算_线性回归中的正规方程将θ系数返回为“NaN”
  5. 3-5 获取命令行参数
  6. vue 实现的评分小星星组件,包括半星
  7. go语言之行--golang核武器goroutine调度原理、channel详解
  8. 关于ESXI能虚拟出多少个虚拟机和CPU的关系
  9. Spring中ApplicationContextAware的用法
  10. 一种监控全部账户登陆及操作命令的方法