参考文章:

在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模拟器中汇编实现:统计输入字符串长度并且判断是否回文相关推荐

  1. vue 统计中英文字符串长度_JS判断字符串长度的5个方法(区分中文和英文)

    目的:计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var len = 0; for (var i=0; ...

  2. 代码 or 指令,浅析ARM架构下的函数的调用过程

    摘要:linux程序运行的状态以及如何推导调用栈. 1.背景知识 1.ARM64寄存器介绍: 2.STP指令详解(ARMV8手册): 我们先看一下指令格式(64bit),以及指令对于寄存机执行结果的影 ...

  3. 在Win10下用Qemu模拟器模拟或虛拟树莓派,包括4B

    在Win10下用Qemu模拟器模拟或虛拟树莓派,包括4B 为什么要用Qemu模拟树莓派,因为模拟出来后,可以带着到处走,U盘一拷,有电脑的地方就可以调试.调试出了问题,想重新来过,只要把之前的副本复制 ...

  4. 【Android 逆向】函数拦截 ( ARM 架构下的插桩拦截 | 完整代码示例 )

    文章目录 一.ARM 架构下的插桩拦截 二.完整代码示例 一.ARM 架构下的插桩拦截 ARM 架构下的跳转指令 : 下面的二进制数都是十六进制数 ; 323232 位指令 ; 04 F0 1F E5 ...

  5. Arm 架构下的中断

    中断的处理分为三个部分: 1.中断检测: arm架构下,中断监测部分的代码是需要用户自己开发的,可以参考ambaIntrCtl.c,需要实现函数xxxIntLvlVecChk.xxxIntLvlVec ...

  6. 史上最全!!!ARM架构下的NVIDIA Xavier安装ROS-Melodic以及使用速腾激光雷达+A-loam获取点云图

    ** 一.ARM架构下的NVIDIA Xavier 切换国内的源 ** 这里不要换成AMD架构的PC平台的软件源,需要换成配套ARM使用的源. 首先备份下之前的 source.list sudo cp ...

  7. ARM架构下部署docker

    ARM架构下部署docker 1 环境要求 2 安装与配置docker 2.1? 下载Docker静态包 2.2 移值docker静态包以及组件 2.3 配置docker.service文件 2.4 ...

  8. html输入字符长度佛下一句,js如何判断输入字符串长度

    js判断输入字符串长度(汉字算两个字符,字母数字算一个) 文本输入时,由于数据库表字段长度限制会导致提交失败,因此想到了此方法验证. 废话不多说上代码: js判断输入字符串长度(汉字算两个字符,字母数 ...

  9. 统计输入字符串中大写字母、小写字母、阿拉伯数字个数和特殊符号的个数

    package API; import java.util.*;/*** Author:jinpma* Date :2019/9/14*/ /* 1.名称:统计输入字符串中大写字母.小写字母.阿拉伯数 ...

最新文章

  1. c中结构体的4种定义
  2. BCH半月热点事件回顾(第二期)
  3. 【BZOJ4764】弹飞大爷 LCT
  4. Add-in Express for Office and .NET v7.3支持VS 2013预览
  5. ORACLE TDE 透明数据加密技术
  6. 【转载保存】hadoop学习之wordcount运行错误处理
  7. Tomcat 服务器介绍和使用
  8. Opatch java 路径_Windows平台下opatch apply报错:OUI-67073
  9. cuda安装和卸载(ubuntu)
  10. spring boot 2.1.4 hibernate 二级缓存 Caffeine实现
  11. error C1083 错误
  12. JavaScript获取当前时区 时间转换 (实用)
  13. 小卖部做成了我们没有做成的事
  14. 怎样通过其他下载工具下载某盘文件
  15. 冯诺依曼结构、哈佛结构、改进型哈佛结构
  16. 前端面试题总结【持续更新···】
  17. 学习Python前序----计算机要点
  18. js实现轮播图(简单滚动轮播)
  19. 幼儿园小班计算机教案,幼儿园小班安全教案7篇
  20. Unit mysqld.service entered failed state

热门文章

  1. PAT 7-2 Reversing Linked List
  2. 安卓可以换鸿蒙,鸿蒙2.0是安卓换皮?还真不是
  3. Monitorix:一款面向Linux、OpenBSD、NetBSD和FreeBSD之类的UNIX系统的网络监测工具
  4. nci60数据集_数据集 | 图网络一般适用的数据集整理
  5. 深入理解LINUX内核 笔记 第四章 中断和异常
  6. Excel教程实用技巧100条连载一
  7. Ios中的普通屏幕和retina屏幕的了解
  8. Spring MVC 3 Showcase
  9. 普通用户权限(sudo)安装CDH
  10. iis+php发送邮箱,DedeCMS用PHPMailer自定义表单发送到QQ邮箱