【ARM】ARM汇编程序设计(一)
生活随笔
收集整理的這篇文章主要介紹了
【ARM】ARM汇编程序设计(一)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
00. 目錄
文章目錄
- 00. 目錄
- 01. 第一個匯編程序
- 02. printf函數(shù)
- 03. 字符串
- 04. 進(jìn)制
- 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編譯執(zhí)行
# PC端 [root@itcast 1st]# arm-linux-gcc test.s -o test [root@itcast 1st]# # ARM板執(zhí)行 [root@itcast 1st]# ./test hello arm [root@itcast 1st]#程序改進(jìn)版本
.section .rodata.align 2 .LC0:.string "hello arm".section .text.align 2.global main main:push {lr}ldr r0, =.LC0bl putsmov r0, #0pop {pc}編譯執(zhí)行
[root@itcast 1st]# arm-linux-gcc test.s -o test [root@itcast 1st]# [root@itcast 1st]# ./test hello arm [root@itcast 1st]#02. printf函數(shù)
程序如下:
.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}執(zhí)行結(jié)果
[root@itcast 1st]# ./a.out val = 123 val = 11 22 33 val = 11 22 33 44 [root@itcast 1st]#友情提示
當(dāng)傳遞參數(shù)超過4個時候,需要使用棧傳遞參數(shù)。
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. 進(jìn)制
程序示例
.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}執(zhí)行結(jié)果
[root@itcast 1st]# ./a.out val = 10 val = 8 val = 16 val = 2 [root@itcast 1st]#友情提示
二進(jìn)制 0b10
八進(jìn)制 010
十進(jìn)制 10
十六進(jìn)制 0x10
05. mov指令
程序示例一: 立即數(shù)
.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}執(zhí)行結(jié)果:
[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}執(zhí)行結(jié)果:
[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}執(zhí)行結(jié)果:
[root@itcast 1st]# ./a.out val = 0xfe000001 [root@itcast 1st]#程序示例四:表達(dá)式
.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}程序示例五:優(yōu)化處理
.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}執(zhí)行結(jié)果:
[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}執(zhí)行結(jié)果:
[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}執(zhí)行結(jié)果:
[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. 附錄
總結(jié)
以上是生活随笔為你收集整理的【ARM】ARM汇编程序设计(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ARM】ARM其它指令
- 下一篇: 【Libevent】Ubuntu安装li