ARM汇编指令 SUB MOV LDR STR
开启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相关推荐
- ARM 汇编指令 ADR 与 LDR 使用
简介 这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令.可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR ...
- arm汇编指令详细整理及实例详解
目录 一.简介 二.ARM 汇编指令说明 2.1 32位数据操作指令 2.2 32位存储器数据传送指令 2.3 32位转移指令 2.4 其它32位指令 三.实例讲解 3.1 MRS 3.2 MSR 3 ...
- arm汇编指令——分析问题的利器
文章目录 arm汇编指令为什么重要 1. 主导问题 2. arm汇编指令分类介绍 通用寄存器 状态寄存器 数据转移指令 寻址格式 运算指令 比较指令 跳转指令 3. 反汇编接口 4. 反汇编分析举例 ...
- 常用的ARM汇编指令总结
第一次写博客,请各路大神多多关照. 本人从事软件开发相关的工作,平时主要用c语言撸代码,前段时间因工作需要,接触到了ARM架构下的汇编指令,之前学过51单片机的汇编指令,早已经还给老师了,且ARM汇编 ...
- ARM汇编指令调试方法
学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...
- ida pro 反汇编 Android so 库后修改 arm 汇编指令的方法总结
1 前言 最近博主在学习Android逆向的时候,参照吾爱破解论坛的<教我兄弟学Android逆向系列课程>学习的时候,学到第8章<教我兄弟学Android逆向08 IDA爆破签名验 ...
- 1.15.ARM汇编指令3之逻辑指令
ARM汇编指令之逻辑指令:and & orr & eor & bic * and 逻辑与操作指令,将operand2的值与寄存器Rn的值按位逻辑与操作,结果保存到Rd中. 指令 ...
- ARM汇编指令学习---基于启动文件startup.S分析
本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...
- ARM 汇编指令 MOV32用法
前言 移植基于ARM平台的RTOS时,需要掌握一些基本的汇编指令,只有熟悉了这些ARM 的汇编指令,才能真正的掌握RTOS的移植方法 MOV32 指令,字面意思是 MOVE 一个 32位 值的意思,具 ...
最新文章
- 【Python】百度首页GIF动画的爬虫
- 如何防止ISE综合时信号不被优化掉
- Iptables防火墙应用
- SSM商城项目(八)
- VS C++调用python进行画图matplotlib
- JQuery中text()、html()和val()的区别
- 2018.3.30 边框应用与导航栏设置
- 安卓逆向之基于Xposed-ZjDroid脱壳 逆向分析(脱壳)
- Laravel Migrate
- 分享MYSQL中的各种高可用技术
- Centos7.0升级python 2.x到3.x
- 陪集编码(Coset coding)
- arm64的prefetch/prefetchw/spin_lock_prefetch
- 欧美明星,明星照片,韩国明星,街拍照片
- 苹果在线商店开售官方翻新Retina MacBook Pro
- Excel表列名称(4)
- 运行JavaWeb项目报错Access denied for user ‘root‘@‘localhost‘ (using password: YES)
- Java 8 流过滤List
- POJ1830开关问题
- 第五次实验:简单的使用示波器