【ARM】ARM汇编程序设计(一)
发布日期:2021-06-29 20:47:50 浏览次数:2 分类:技术文章

本文共 6603 字,大约阅读时间需要 22 分钟。

00. 目录

文章目录

01. 第一个汇编程序

源程序

.section .rodata    .align 2.LC0:    .string "hello arm"    .section .text    .align 2    .global mainmain:    push {lr}        ldr r0, =.LC0    bl puts    mov r0, #0    pop {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 mainmain:    push {lr}    ldr r0, =.LC0    bl puts    mov r0, #0    pop {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 mainmain:    push {lr}    @printf("val = %d\n", 123);    ldr r0, =.LC0    mov r1, #123    bl printf    @printf("val = %d %d %d\n", 11, 22, 33);    ldr r0, =.LC1    mov r1, #11    mov r2, #22    mov r3, #33    bl printf    @printf("val = %d %d %d %d\n", 11, 22, 33, 44);    ldr r0, =.LC2    mov r1, #11    mov r2, #22    mov r3, #33    mov r4, #44    push {r4}    bl printf    pop {r4}    mov r0, #0    pop {pc}

执行结果

[root@itcast 1st]# ./a.out  val = 123val = 11 22 33val = 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 mainmain:    push {lr}    ldr r0, =.LC0    bl printf    ldr r0, =.LC1    bl printf    ldr r0, =.LC2    bl printf    mov r0, #0    pop {pc}

友情提示

.string 会在字符串后面自动添加\0

.asciz 会在字符串后面自动添加\0

.ascii 不会在字符串后面自动添加\0

04. 进制

程序示例

.section .rodata    .align 2.LC0:    .string "val = %d\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r1, #10    bl printf    ldr r0, =.LC0    mov r1, #010    bl printf    ldr r0, =.LC0    mov r1, #0x10    bl printf    ldr r0, =.LC0    mov r1, #0b10    bl printf    mov r0, #0    pop {pc}

执行结果

[root@itcast 1st]# ./a.out  val = 10val = 8val = 16val = 2[root@itcast 1st]#

友情提示

二进制 0b10

八进制 010

十进制 10

十六进制 0x10

05. mov指令

程序示例一: 立即数

.section .rodata    .align 2.LC0:    .string "val = %d\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    @    @mov r1, #0x123    @mov r1, #0x7f8    @mov r1, #0xc80000003    @mov r1, #0xc80000007    @mov r1, #0x10000008    mov r1, #0xff    bl printf        mov r0, #0    pop {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 mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #0x100    mov r1, r2, LSL #4    bl printf        mov r0, #0    pop {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 mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #0xff000000    @mov r1, r2, LSR #31    @mov r1, r2, ASR #31    mov r1, r2, ROR #31    bl printf        mov r0, #0    pop {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 mainmain:    push {lr}    ldr r0, =.LC0    mov r1, #(100/4 + 3 * 2 + 1)    bl printf        mov r0, #0    pop {pc}

程序示例五:优化处理

.section .rodata    .align 2.LC0:    .string "val = %p\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r1, #0xffffffff    bl printf        mov r0, #0    pop {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 mainmain:    push {lr}    ldr r0, =.LC0    mvn  r1, #0xffffff00    bl printf        mov r0, #0    pop {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 mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #1    mov r3, #2    mov 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 << 2    add r1, r2, r3, LSL #2    bl printf        mov r0, #0    pop {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 mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #1    mov r3, #2    mov r1, r2    @r1 = r3 - r2    @sub r1, r3, r2    @r1 =r2 - r3    @sub r1, r2, r3    @r1 = r3 - 1    sub r1, r3, #1    bl printf        mov r0, #0    pop {pc}

09. rsb指令

程序示例

.section .rodata    .align 2.LC0:    .string "val = %d\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #1    mov r3, #2    mov r1, r2    @r1 = r3 - r2    @rsb r1, r2, r3    @r1 = 10 - r2    rsb r1, r2, #10    bl printf        mov r0, #0    pop {pc}

10. and指令

程序示例:

.section .rodata    .align 2.LC0:    .string "val = %p\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #0xff    mov r3, #0x3    @r1 = r2 & r3    and r1, r2, r3    bl printf        mov r0, #0    pop {pc}

11. bic指令

程序示例

.section .rodata    .align 2.LC0:    .string "val = %p\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #0xff    mov r3, #0x3    @r1 = r2 & ~r3    bic r1, r2, r3    bl printf        mov r0, #0    pop {pc}

12. orr指令

程序示例:

.section .rodata    .align 2.LC0:    .string "val = %p\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #0xf0    mov r3, #0x3    @r1 = r2 | r3    orr r1, r2, r3    bl printf        mov r0, #0    pop {pc}

13. eor指令

程序示例

.section .rodata    .align 2.LC0:    .string "val = %p\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #0xff    mov r3, #0x3    @r1 = r2 ^ r3    eor r1, r2, r3    bl printf        mov r0, #0    pop {pc}

14. mul指令

程序示例

.section .rodata    .align 2.LC0:    .string "val = %d\n"    .section .text    .align 2    .global mainmain:    push {lr}    ldr r0, =.LC0    mov r2, #3    mov r3, #8    mov r1, #1    @r1 = r2 * r3    @mul r1, r2, r3    @r1 = r1 * r2    mul r1, r1, r2    bl printf        mov r0, #0    pop {pc}

15. 附录

转载地址:https://dengjin.blog.csdn.net/article/details/106860896 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【ARM】ARM汇编程序设计(二)
下一篇:【ARM】ARM其它指令

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月29日 17时35分14秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章