【ARM】ARM彙編程序設計(一)

00. 目錄

01. 第一個彙編程序

源程序

    .section .rodata
    .align 2
.LC0:
    .string "hello arm"

    .section .text
    .align 2
    .global main
main:
    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 main
main:
    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 main
main:
    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 = 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, =.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 main
main:
    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 = 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, #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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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 main
main:
    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. 附錄

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章