欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【ARM】ARM汇编程序设计(一)

发布时间:2024/4/24 编程问答 52 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【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汇编程序设计(一)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。