开启arm汇编学习。

环境介绍:使用的是TI TDA4平台。该平台是基于ARMV8架构,64bit的CPU。

先上一段C代码:

#include <stdio.h>int main(void)
{char ch1 = 10;char ch2 = 11;ch2 = ch1;unsigned short sh1 = 20;unsigned short sh2 = 22;sh1 = sh2;int num1 = 30;int num2 = 33;num1 = num2;long long lnum1 = 40;long long lnum2 = 44;lnum1 = lnum2;return 0;
}

把C代码编译生成汇编代码:

        .arch armv8-a.file   "main.c".text.align  2.global main.type   main, %function
main:
.LFB0:.cfi_startprocsub     sp, sp, #32.cfi_def_cfa_offset 32mov     w0, 10strb    w0, [sp, 31]mov     w0, 11strb    w0, [sp, 30]ldrb    w0, [sp, 31]strb    w0, [sp, 30]mov     w0, 20strh    w0, [sp, 28]mov     w0, 22strh    w0, [sp, 26]ldrh    w0, [sp, 26]strh    w0, [sp, 28]mov     w0, 30str     w0, [sp, 20]mov     w0, 33str     w0, [sp, 16]ldr     w0, [sp, 16]str     w0, [sp, 20]mov     x0, 40str     x0, [sp, 8]mov     x0, 44str     x0, [sp]ldr     x0, [sp]str     x0, [sp, 8]mov     w0, 0add     sp, sp, 32.cfi_def_cfa_offset 0ret.cfi_endproc
.LFE0:.size   main, .-main.ident  "GCC: (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025".section        .note.GNU-stack,"",@progbits

C代码编译成汇编代码的脚本:

#!/bin/shexport PATH=${PATH}:/home/CN/qidong.liu/ti/tda4/server/tda4vl/camera_ok/rtos/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/binaarch64-none-linux-gnu-gcc -E main.c -o main.i
aarch64-none-linux-gnu-gcc -S main.i -o main.S

对生成的汇编代码做一个简单的解释:


main:
.LFB0:.cfi_startprocsub     sp, sp, #32        //申请32字节的栈空间。注:本验证发现,栈的大小似乎总是16的整数倍。.cfi_def_cfa_offset 32mov     w0, 10            //将10保存到寄存器w0里面strb    w0, [sp, 31]      //将寄存器w0的内容,保存到栈偏移31字节处。这里是以字节为操作单位。strb的b,表示bytemov     w0, 11strb    w0, [sp, 30]ldrb    w0, [sp, 31]      //将栈偏移31字节处的内容,加载到寄存器w0里面strb    w0, [sp, 30]mov     w0, 20strh    w0, [sp, 28]      //将寄存器w0的内容,保存到栈偏移28字节处。这里是以半字为操作单位。strh的h,表示half wordmov     w0, 22strh    w0, [sp, 26]ldrh    w0, [sp, 26]      //将栈偏移26字节处的内容加载到w0寄存器。这里是以半字为操作单位。strh    w0, [sp, 28]mov     w0, 30str     w0, [sp, 20]      //将寄存器w0的内容,保存到栈偏移20字节处。这里是以字为操作单位。str的操作单位和寄存器有关 这里的单位为字mov     w0, 33str     w0, [sp, 16]ldr     w0, [sp, 16]      //将栈偏移16字节处的内容加载到w0寄存器。这里是以字为操作单位。ldr的操作单位和寄存器有关 这里的单位为字str     w0, [sp, 20]mov     x0, 40            //x0和w0寄存器为同一个寄存器,w0寄存器为x0寄存器的低32位str     x0, [sp, 8]       //将寄存器x0的内容保存到栈偏移8字节处。这里是以双字为操作单位。str的操作单位和寄存器有关 这里的单位为双字mov     x0, 44str     x0, [sp]ldr     x0, [sp]          //将栈偏移0字节处的内容加载到x0寄存器。这里是以双字为操作单位。ldr的操作单位和寄存器有关 这里的单位为双字str     x0, [sp, 8]mov     w0, 0add     sp, sp, 32.cfi_def_cfa_offset 0ret.cfi_endproc

上面对部分指令做了一个简单的解释。下面进行一点扩展。

mov指令:

mov x0, 123
将立即数123保存到寄存器x0里面mov x1, x2
将寄存器x2里面的内容保存到寄存器x1里面注:ARM架构中,内存单元上的数据不允许被直接操作。因此mov指令作用于寄存器与立即数直接的操作。

ldr指令:将内存上的内容加载到寄存器里面

ldr x0, [x1]
将x1寄存器里面的内容作为内存地址,把该内存地址的值加载到x0寄存器里面注:ldr指令还有其他一些类型,如:ldrb、ldrh
ldrb:操作单位为字节
ldrh:操作单位为半字
ldr:操作单位和寄存器类型有关。w0这一类的寄存器操作单位就是字。x0这一类的寄存器操作单位就是双字。

str指令:将寄存器的内容保存到内存上面去

str x0, [x1]
将x0寄存器里面的内容保存到x1寄存器里面的值的对应的内存空间。
举例:str x0, [x1]    //x0=123    x1=456789
将123保存到内存地址为456789的地址处。str x0, [x1], #8
将x0寄存器里面的内容保存到x1寄存器里面的值的对应的内存空间。同时x1寄存器的内容更新为x1+8str也有一些其他类似指令:strb、strh。这些指令的操作单位和ldr那一类指令类似

add指令:加法指令

add x0, x1, x2
x0=x1+x2add x0, x1, #123
x0=x1+123注:add指令操作的对象也是寄存器和立即数。似乎不能直接操作内存。

sub指令:减法指令

sub x0, x1, x2
x0=x1-x2sub x0, x1, #123
x0=x1-123注:sub指令操作的对象也是寄存器和立即数。似乎不能直接操作内存。

ARM汇编指令 SUB MOV LDR STR相关推荐

  1. ARM 汇编指令 ADR 与 LDR 使用

    简介 这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令.可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR ...

  2. arm汇编指令详细整理及实例详解

    目录 一.简介 二.ARM 汇编指令说明 2.1 32位数据操作指令 2.2 32位存储器数据传送指令 2.3 32位转移指令 2.4 其它32位指令 三.实例讲解 3.1 MRS 3.2 MSR 3 ...

  3. arm汇编指令——分析问题的利器

    文章目录 arm汇编指令为什么重要 1. 主导问题 2. arm汇编指令分类介绍 通用寄存器 状态寄存器 数据转移指令 寻址格式 运算指令 比较指令 跳转指令 3. 反汇编接口 4. 反汇编分析举例 ...

  4. 常用的ARM汇编指令总结

    第一次写博客,请各路大神多多关照. 本人从事软件开发相关的工作,平时主要用c语言撸代码,前段时间因工作需要,接触到了ARM架构下的汇编指令,之前学过51单片机的汇编指令,早已经还给老师了,且ARM汇编 ...

  5. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  6. ida pro 反汇编 Android so 库后修改 arm 汇编指令的方法总结

    1 前言 最近博主在学习Android逆向的时候,参照吾爱破解论坛的<教我兄弟学Android逆向系列课程>学习的时候,学到第8章<教我兄弟学Android逆向08 IDA爆破签名验 ...

  7. 1.15.ARM汇编指令3之逻辑指令

    ARM汇编指令之逻辑指令:and & orr & eor & bic * and 逻辑与操作指令,将operand2的值与寄存器Rn的值按位逻辑与操作,结果保存到Rd中. 指令 ...

  8. ARM汇编指令学习---基于启动文件startup.S分析

    本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...

  9. ARM 汇编指令 MOV32用法

    前言 移植基于ARM平台的RTOS时,需要掌握一些基本的汇编指令,只有熟悉了这些ARM 的汇编指令,才能真正的掌握RTOS的移植方法 MOV32 指令,字面意思是 MOVE 一个 32位 值的意思,具 ...

最新文章

  1. 【Python】百度首页GIF动画的爬虫
  2. 如何防止ISE综合时信号不被优化掉
  3. Iptables防火墙应用
  4. SSM商城项目(八)
  5. VS C++调用python进行画图matplotlib
  6. JQuery中text()、html()和val()的区别
  7. 2018.3.30 边框应用与导航栏设置
  8. 安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)
  9. Laravel Migrate
  10. 分享MYSQL中的各种高可用技术
  11. Centos7.0升级python 2.x到3.x
  12. 陪集编码(Coset coding)
  13. arm64的prefetch/prefetchw/spin_lock_prefetch
  14. 欧美明星,明星照片,韩国明星,街拍照片
  15. 苹果在线商店开售官方翻新Retina MacBook Pro
  16. Excel表列名称(4)
  17. 运行JavaWeb项目报错Access denied for user ‘root‘@‘localhost‘ (using password: YES)
  18. Java 8 流过滤List
  19. POJ1830开关问题
  20. 第五次实验:简单的使用示波器

热门文章

  1. 【HikariCP】【HikariDataSource】源码学习
  2. 赛题分析:AI决策•强化学习落地挑战赛——学习指定平等的促销策略
  3. linux下搭建redis哨兵
  4. webpack-多页面打包
  5. Java面试题集锦(含答案)
  6. js小数加减乘除计算不准
  7. 2021最新PHP域名防封系统源码4.0+后台管理功能+个人免签支付接口网站源码
  8. 超快速的python代理IP提取程序
  9. CSS 3.0实现时光轴加载动画
  10. 第五届蓝桥杯单片机省赛