【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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2024年04月29日 17时35分14秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【H264/AVC 句法和语义详解】(五):Exp-Golomb指数哥伦布编码(理论篇)
2019-04-30
【H264/AVC 句法和语义详解】(八):序列参数集SPS句法和语义
2019-04-30
【H.264/AVC 句法和语义详解】(九):图像参数集PPS句法和语义
2019-04-30
【H.264/AVC 句法和语义详解】(十):最简单的H264编解码器
2019-04-30
【H.264/AVC 句法和语义详解】(十一):Slice_Header的句法和语义
2019-04-30
【H.264/AVC 句法和语义详解】(十二):H264中的帧场编码模式详解
2019-04-30
【从零实现一个H.264码流解析器】(一):从码流中找到NALU
2019-04-30
PHP XML转数组
2019-04-30
PHP CURL请求
2019-04-30
关于那些加密解密的PHP方法--Star.hou
2019-04-30
elasticsearch PHP安装、使用
2019-04-30
Laravel命令行创建控制器、模型、脚本
2019-04-30
Python&NotePad++开发环境
2019-04-30
Paypal Webhook API创建
2019-04-30
laravel之中间件三步走--star.hou
2019-04-30
PHP Windows环境安装Solr扩展
2019-04-30
Paypal Express Checkout快速结账API心得--Star.Hou
2019-04-30
支付网关设计感悟(一)Star.Hou
2019-04-30