ARM汇编语言学习笔记(一)---ARM汇编的程序结构
2016-11-17 15:21
363 查看
0x00 用到的书籍
《Android软件安全与逆向分析》第六章0x01 原生程序的生成过程
笔者是在Linux环境下测试的,详细过程见书中说明需要编译的C语言代码
#include <stdio.h> int main(int argc, char* argv[]){ printf("Hello ARM!\n"); return 0; }
预处理,生成hello.i文件
gcc -E hello.c -o hello.i
编译
gcc -S hello.i -o hello.s
汇编,生成二进制目标文件
gcc -c hello.s -o hello.o
链接,生成hello可执行文件
gcc hello.o -o hello
0x02 完整ARM汇编结构
下面打开生成的.文件.arch armv5te @处理器架构 .fpu softvfp @浮点协处理器类型 .eabi_attribute 20, 1 @接口属性 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25, 1 .eabi_attribute 26, 2 .eabi_attribute 30, 6 .eabi_attribute 18, 4 .file "hello.c" @源文件名 .section .rodata @声明只读数据 .align 2 @声明对齐方式2^2=4字节 .LC0: @标号LC0 .ascii "Hello ARM!\000"@声明字符串 .text @声明代码段 .align 2 @声明对齐方式4字节 .global main @全局符号main .type main, %function @main类型为函数 main: @标号main @ args = 0, pretend = 0, frame = 8 @ frame_needed = 1, uses_anonymous_args = 0 stmfd sp!, {fp, lr} @将fp,lr压入堆栈 add fp, sp, #4 @初始化fp寄存器,设置栈帧,用于访问局部变量 sub sp, sp, #8 @开辟栈空间 str r0, [fp, #-8] @保存第一个参数 str r1, [fp, #-12] @保存第二个参数 ldr r3, .L3 @取标号.L3处的内容, .LPIC0: add r3, pc, r3 mov r0, r3 bl puts(PLT) mov r3, #0 mov r0, r3 sub sp, fp, #4 ldmfd sp!, {fp, pc} .L4: .align 2 .L3: .word .LC0-(.LPIC0+8) .size main, .-main .ident "GCC: (GNU) 4.4.3" .section .note.GNU-stack,"",%progbits
0x03 处理器架构定义
.arch armv5te @处理器架构 .fpu softvfp @浮点协处理器类型 .eabi_attribute 20, 1 @接口属性 .eabi_attribute 21, 1 .eabi_attribute 23, 3 .eabi_attribute 24, 1 .eabi_attribute 25, 1 .eabi_attribute 26, 2 .eabi_attribute 30, 6 .eabi_attribute 18, 4
0x04 段定义
本例子中定义了三个段如下:
.section .rodata @声明只读数据 .text @定义了代码段 ..section .note.GNU-stack,"",%progbits @保护代码,禁止生成可执行堆栈。
0x05 注释与标号
单行注释用@表示,例如@声明只读数据
多行注释用/* */
0x06 汇编器指令
程序中所有以点开头的都是汇编器指令,就是给汇编器读的指令,不属于ARM指令集.flie:指定了源文件名。手写可忽略
.align:指定了代码对齐方式你后面跟的是2的次方
.ascii:声明字符串
.global:声明全局符号。全局符号是指在本程序外可访问的符号。
.type:指定符号的类型,“.type main,%function”表示main为函数
.word: 用来存放地址。
.size:设定指定符号的大小。“.size main,.-main”中的”.”表示当前地址,减去main符号的地址为整个main函数的大小。
.ident:编译器标识,无实际意义。
0x07 子程序与参数传递
函数声明方法.global 函数名 .type 函数名,“%function” 函数名: <函数体>
实例
.global MyAdd .type MyAdd,%function MyAdd: ADD r0,r0,r1 @两个数相加 MOV pc,lr @ 函数返回
ARM参数传递规定(重要)
R0-R3这4个寄存器用来传递函数调用的第1到4个参数,超出的通过堆栈来传递,R0同时用来存放函数调用的返回值。由函数调用方来平衡堆栈。
相关文章推荐
- ARM汇编语言中的程序结构
- 两种arm汇编程序结构和基本语法
- ARM汇编程序结构
- 第1天:从计算机结构到汇编程序入门
- 交叉编译汇编程序到ARM CPU-4412开发板
- arm汇编程序调用C函数之参数传递
- friendarm 6410板子在windows的第一个程序 (下程序,在模拟dos终端编译汇编,C)
- iOS程序破解——ARM汇编基础
- 05_ARM汇编自学笔记模型之程序状态寄存器
- ARM汇编程序AXD调试出现00000000 [0xe7ff0010] dci 0xe7ff0010 ; ? undefined 00000004 [0xe800e800] stmd
- arm汇编程序调用C函数之参数传递
- ARM中汇编程序实例小笔记
- ARM汇编程序---用ARM汇编实现R0寄存器中数据调换数据
- ARM裸机程序开发7(汇编与c混合编程)
- ARM之汇编学习---如何编写ARM汇编程序
- 使用ARM汇编破解iOS程序基础知识分享
- 第一个ARM汇编程序
- 第一次写ARM汇编程序是碰到的两个问题
- ARM 汇编的冒泡程序
- mini2440(6) 我的第一个ARM汇编程序---LED灯裸机硬件控制程序(2)