ARM访存指令:
访存:LDR 读内存,STR 写内存
1、数据流向
2、操作的寄存器和内存地址
3、后续附加行为
LDR R1,[R0,#4]! R0地址偏移4的值给R1,!为附加操作,执行完前面的操作后 把地址写入R0 R1 = [地址+偏移]的值 R0 = [地址+偏移]的地址
LDR R1,[R0] #4 R0地址的值给R1,R0 + 偏移4 的地址给R0 R1 = 值[地址] R0 = 地址[地址] + 偏移
相当于进栈: STR R0,[SP,#-4]!
相当于出栈: LDR R1,[SP],#4
STR R0,[R1],#8 ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。
STR R0,[R1,#8] ;将R0中的字数据写入以R1+8为地址的存储器中。”
STR r1, [r0] ;将r1寄存器的值,传送到地址值为r0的(存储器)内存中
LDR R0,=0x12345678 出现‘=’表示内存寻址
例如:
当前寄存器:
R0:B6EBB93C
R1:B86D1410
当前机器指令:
B6EBB940 04 70 A0 E3
指令:LDR R1,[R0,#4]!
执行后:
R0:B6EBB940
R1:E3A07004
实战:
1、写arm程序 hello.c:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef unsigned int uint32_t;
uint32_t x;
int main()
{
x = 0x12345678;
while(1){
printf("going...");
getchar();
}
return 0;
}
2、编写Android.mk
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm #编译后的指令集 ARM指令
LOCAL_MODULE := hello #模块名称
LOCAL_MODULE_FILENAME :=libhello
LOCAL_SRC_FILES := hello.c #源文件 .c或者.cpp
#LOCAL_LDLIBS += -llog #依赖库
include $(BUILD_EXECUTABLE)
#include $(BUILD_SHARED_LIBRARY) #指定编译文件的类型
3、编写Application.mk
APP_ABI := armeabi-v7a
APP_BUILD_SCRIPT :=Android.mk
APP_PLATFORM :=android-16
4、生成
ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk
5、上传到手机运行,并超级权限下运行android_server
启动之后来到main函数处,找到x的地址和值
上图可以看出R2经过两次mov最后值为0x12345678
STR R2,[R3] 就是将R2写入到R3记录的地址中。
R3 = B6FF44AC + 2B00 计算后为:B6FF6FAC
按G 跳转到 B6FF6FAC
这里的机器码为 B6FF7004 这就是变量X的地址。将0x12345678 写入到这个地址的值。按G 调到代码处:
存放的就是 0x12345678 ,静态分析时这里应该为????是没有值的。
本节内容为周壑ARM汇编内容观看笔记。