ARM架构下在qemu模拟器中汇编实现:统计输入字符串长度并且判断是否回文
参考文章:
在Ubuntu中安装Qemu模拟ARM架构
objdump(Linux)反汇编命令使用指南
如何在x64的Ubuntu系统下安装64bit的交叉编译工具aarch64-linux-gnu-gcc
1. 开发环境
1.1 运行操作系统为 ubuntu 16.04
1.2 qemu模拟器安装部署
不建议使用源码安装,虽然版本较新,但依赖库很多,会出现各种问题。可通过软件包管理器apt-get install qemu。但是此种安装后,在/usr/bin/目录下只有qemu-system-i386之类的命令工具,并无arm相关的工具,此时需要安装qemu-system-arm,执行命令apt-get install qemu-system。也就是默认安装Qemu是不支持ARM架构的。同时也需要安装qemu-arm,此工具可以直接运行ARM架构的二进制文件,而不必模拟整个SOC。执行命令apt-get install qemu-user。至此,Qemu基本工具都已安装完成,如下图,我们主要是以模拟ARM架构的设备为主。
2. 程序源代码
2.1 实现功能的pa1.c语言代码
/** pa1.c源文件*/
#include <stdio.h>
#include <string.h>
#define N 100
int main()
{ char s[N];char flag = 'F';int i=0,j=0,k=0;char *str;printf("Input a String: \n");//输入一个字符串赋值给sscanf("%s",s);str = s;while(*str != '\0'){str++;k++;}printf("String length: %d\n",k);j = k -1;//j的初始值为s字符串最后一个位置// j=strlen(s)-1;// printf("String length: %d\n",j+1);//进行while判断i、j的位置和i、j位置的值的关系while(i<=j&&s[i]==s[j]){//每比较一次就i右移、j左移一位i++;j--;}//判断最终i和j的的位置//根据i、j的位置最终是会互相超越的,所以如果i<=j说明存在对应位置不等的情况就是不是回文串if (i<=j){flag = 'F';printf("String is a palindrome (T/F): %c\n", flag);// printf("不是回文字符串\n");}else{ flag = 'T';printf("String is a palindrome (T/F): %c\n", flag);// printf("是回文字符串\n");}return 0;
}
2.2 实现功能的pa1.s 汇编代码
.section .datainput_prompt : .asciz "Input a string: "
input_spec : .asciz "%[^\n]"
length_spec : .asciz "String length: %d\n"
palindrome_spec : .asciz "String is a palindrome (T/F): %c\n".section .text.global main.arch armv8-a.file "pa1.c".section .rodata.align 3
.LC0:.string "Input a String: ".align 3
.LC1:.string "%s".align 3
.LC2:.string "String length: %d\n".align 3
.LC3:.string "String is a palindrome (T/F): %c\n".text.align 2.global main.type main, %function
main:stp x29, x30, [sp, -160]!add x29, sp, 0adrp x0, __stack_chk_guardadd x0, x0, :lo12:__stack_chk_guardldr x1, [x0]str x1, [x29, 152]mov x1,0mov w0, 70strb w0, [x29, 27]str wzr, [x29, 28]str wzr, [x29, 32]str wzr, [x29, 36]adrp x0, .LC0add x0, x0, :lo12:.LC0bl putsadd x1, x29, 48adrp x0, .LC1add x0, x0, :lo12:.LC1bl __isoc99_scanfadd x0, x29, 48str x0, [x29, 40]b .L2
.L3:ldr x0, [x29, 40]add x0, x0, 1str x0, [x29, 40]ldr w0, [x29, 36]add w0, w0, 1str w0, [x29, 36]
.L2:ldr x0, [x29, 40]ldrb w0, [x0]cmp w0, 0bne .L3adrp x0, .LC2add x0, x0, :lo12:.LC2ldr w1, [x29, 36]bl printfldr w0, [x29, 36]sub w0, w0, #1str w0, [x29, 32]b .L4
.L6:ldr w0, [x29, 28]add w0, w0, 1str w0, [x29, 28]ldr w0, [x29, 32]sub w0, w0, #1str w0, [x29, 32]
.L4:ldr w1, [x29, 28]ldr w0, [x29, 32]cmp w1, w0bgt .L5ldrsw x0, [x29, 28]sub x1, x29, #3936add x0, x1, x0ldrb w1, [x0, 3984]ldrsw x0, [x29, 32]sub x2, x29, #3936add x0, x2, x0ldrb w0, [x0, 3984]cmp w1, w0beq .L6
.L5:ldr w1, [x29, 28]ldr w0, [x29, 32]cmp w1, w0bgt .L7mov w0, 70strb w0, [x29, 27]ldrb w1, [x29, 27]adrp x0, .LC3add x0, x0, :lo12:.LC3bl printfb .L8
.L7:mov w0, 84strb w0, [x29, 27]ldrb w1, [x29, 27]adrp x0, .LC3add x0, x0, :lo12:.LC3bl printf
.L8:mov w0, 0adrp x1, __stack_chk_guardadd x1, x1, :lo12:__stack_chk_guardldr x2, [x29, 152]ldr x1, [x1]eor x1, x2, x1cmp x1, 0beq .L10bl __stack_chk_fail
.L10:ldp x29, x30, [sp], 160retexit:mov x0, 0mov x8, 93svc 0ret
3 gcc命令编译源文件
3.1 显示pa1.c
的汇编代码
aarch64-linux-gnu-gcc -static -S -o pa1.s pa1.c
编译生成的 pa1.s 汇编代码如下:
.arch armv8-a.file "pa1.c".section .rodata.align 3
.LC0:.string "Input a String: ".align 3
.LC1:.string "%s".align 3
.LC2:.string "String length: %d\n".align 3
.LC3:.string "String is a palindrome (T/F): %c\n".text.align 2.global main.type main, %function
main:stp x29, x30, [sp, -160]!add x29, sp, 0adrp x0, __stack_chk_guardadd x0, x0, :lo12:__stack_chk_guardldr x1, [x0]str x1, [x29, 152]mov x1,0mov w0, 70strb w0, [x29, 27]str wzr, [x29, 28]str wzr, [x29, 32]str wzr, [x29, 36]adrp x0, .LC0add x0, x0, :lo12:.LC0bl putsadd x1, x29, 48adrp x0, .LC1add x0, x0, :lo12:.LC1bl __isoc99_scanfadd x0, x29, 48str x0, [x29, 40]b .L2
.L3:ldr x0, [x29, 40]add x0, x0, 1str x0, [x29, 40]ldr w0, [x29, 36]add w0, w0, 1str w0, [x29, 36]
.L2:ldr x0, [x29, 40]ldrb w0, [x0]cmp w0, 0bne .L3adrp x0, .LC2add x0, x0, :lo12:.LC2ldr w1, [x29, 36]bl printfldr w0, [x29, 36]sub w0, w0, #1str w0, [x29, 32]b .L4
.L6:ldr w0, [x29, 28]add w0, w0, 1str w0, [x29, 28]ldr w0, [x29, 32]sub w0, w0, #1str w0, [x29, 32]
.L4:ldr w1, [x29, 28]ldr w0, [x29, 32]cmp w1, w0bgt .L5ldrsw x0, [x29, 28]sub x1, x29, #3936add x0, x1, x0ldrb w1, [x0, 3984]ldrsw x0, [x29, 32]sub x2, x29, #3936add x0, x2, x0ldrb w0, [x0, 3984]cmp w1, w0beq .L6
.L5:ldr w1, [x29, 28]ldr w0, [x29, 32]cmp w1, w0bgt .L7mov w0, 70strb w0, [x29, 27]ldrb w1, [x29, 27]adrp x0, .LC3add x0, x0, :lo12:.LC3bl printfb .L8
.L7:mov w0, 84strb w0, [x29, 27]ldrb w1, [x29, 27]adrp x0, .LC3add x0, x0, :lo12:.LC3bl printf
.L8:mov w0, 0adrp x1, __stack_chk_guardadd x1, x1, :lo12:__stack_chk_guardldr x2, [x29, 152]ldr x1, [x1]eor x1, x2, x1cmp x1, 0beq .L10bl __stack_chk_fail
.L10:ldp x29, x30, [sp], 160ret.size main, .-main.ident "GCC: (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609".section .note.GNU-stack,"",@progbits
命令生成可执行文件 pa1
aarch64-linux-gnu-gcc -static -g -o pa1 pa1.s
可以看出是64-bit ARM aarch64 可执行文件,运行测试验证效果如下:
ARM架构下在qemu模拟器中汇编实现:统计输入字符串长度并且判断是否回文相关推荐
- vue 统计中英文字符串长度_JS判断字符串长度的5个方法(区分中文和英文)
目的:计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var len = 0; for (var i=0; ...
- 代码 or 指令,浅析ARM架构下的函数的调用过程
摘要:linux程序运行的状态以及如何推导调用栈. 1.背景知识 1.ARM64寄存器介绍: 2.STP指令详解(ARMV8手册): 我们先看一下指令格式(64bit),以及指令对于寄存机执行结果的影 ...
- 在Win10下用Qemu模拟器模拟或虛拟树莓派,包括4B
在Win10下用Qemu模拟器模拟或虛拟树莓派,包括4B 为什么要用Qemu模拟树莓派,因为模拟出来后,可以带着到处走,U盘一拷,有电脑的地方就可以调试.调试出了问题,想重新来过,只要把之前的副本复制 ...
- 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )
文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...
- Arm 架构下的中断
中断的处理分为三个部分: 1.中断检测: arm架构下,中断监测部分的代码是需要用户自己开发的,可以参考ambaIntrCtl.c,需要实现函数xxxIntLvlVecChk.xxxIntLvlVec ...
- 史上最全!!!ARM架构下的NVIDIA Xavier安装ROS-Melodic以及使用速腾激光雷达+A-loam获取点云图
** 一.ARM架构下的NVIDIA Xavier 切换国内的源 ** 这里不要换成AMD架构的PC平台的软件源,需要换成配套ARM使用的源. 首先备份下之前的 source.list sudo cp ...
- ARM架构下部署docker
ARM架构下部署docker 1 环境要求 2 安装与配置docker 2.1? 下载Docker静态包 2.2 移值docker静态包以及组件 2.3 配置docker.service文件 2.4 ...
- html输入字符长度佛下一句,js如何判断输入字符串长度
js判断输入字符串长度(汉字算两个字符,字母数字算一个) 文本输入时,由于数据库表字段长度限制会导致提交失败,因此想到了此方法验证. 废话不多说上代码: js判断输入字符串长度(汉字算两个字符,字母数 ...
- 统计输入字符串中大写字母、小写字母、阿拉伯数字个数和特殊符号的个数
package API; import java.util.*;/*** Author:jinpma* Date :2019/9/14*/ /* 1.名称:统计输入字符串中大写字母.小写字母.阿拉伯数 ...
最新文章
- c中结构体的4种定义
- BCH半月热点事件回顾(第二期)
- 【BZOJ4764】弹飞大爷 LCT
- Add-in Express for Office and .NET v7.3支持VS 2013预览
- ORACLE TDE 透明数据加密技术
- 【转载保存】hadoop学习之wordcount运行错误处理
- Tomcat 服务器介绍和使用
- Opatch java 路径_Windows平台下opatch apply报错:OUI-67073
- cuda安装和卸载(ubuntu)
- spring boot 2.1.4 hibernate 二级缓存 Caffeine实现
- error C1083 错误
- JavaScript获取当前时区 时间转换 (实用)
- 小卖部做成了我们没有做成的事
- 怎样通过其他下载工具下载某盘文件
- 冯诺依曼结构、哈佛结构、改进型哈佛结构
- 前端面试题总结【持续更新···】
- 学习Python前序----计算机要点
- js实现轮播图(简单滚动轮播)
- 幼儿园小班计算机教案,幼儿园小班安全教案7篇
- Unit mysqld.service entered failed state
热门文章
- PAT 7-2 Reversing Linked List
- 安卓可以换鸿蒙,鸿蒙2.0是安卓换皮?还真不是
- Monitorix:一款面向Linux、OpenBSD、NetBSD和FreeBSD之类的UNIX系统的网络监测工具
- nci60数据集_数据集 | 图网络一般适用的数据集整理
- 深入理解LINUX内核 笔记 第四章 中断和异常
- Excel教程实用技巧100条连载一
- Ios中的普通屏幕和retina屏幕的了解
- Spring MVC 3 Showcase
- 普通用户权限(sudo)安装CDH
- iis+php发送邮箱,DedeCMS用PHPMailer自定义表单发送到QQ邮箱