【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构

原创 2015年07月06日 16:54:58

作者:郭嘉
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell

【基于Android的ARM汇编语言系列】章节列表

【基于Android的ARM汇编语言系列】之一:ARM汇编语言开篇
【基于Android的ARM汇编语言系列】之二:C/C++程序生成ARM汇编程序的过程分析
【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构
【基于Android的ARM汇编语言系列】之四:ARM处理器的寻址方式
【基于Android的ARM汇编语言系列】之五:ARM指令集与Thumb指令集
【基于Android的ARM汇编语言系列】之六:NEON指令集与VFP指令集

Android平台的ARM汇编是GNU ARM汇编格式,使用的汇编器是GAS(GNU Assembler),GAS有自己的一套语法结构。详细的内容可以查阅GAS语法结构官方手册

我们先来看一个完整的ARM汇编程序:

C代码:

#include <stdio.h>

int main(int argc, char* argv[]){
    printf("Hello ARM!\n");
    return 0;
}

对应的汇编代码:

    .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
.LC0:
    .ascii  "Hello ARM!\000"
    .text
    .align  2
    .global main
    .type   main, %function
main:
    @ args = 0, pretend = 0, frame = 8
    @ frame_needed = 1, uses_anonymous_args = 0
    stmfd   sp!, {fp, lr}
    add fp, sp, #4
    sub sp, sp, #8
    str r0, [fp, #-8]
    str r1, [fp, #-12]
    ldr r3, .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

下面分部分介绍这段代码的结构。

一 处理器架构定义

    .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

1.1 处理器架构

.arch指定了ARM处理器架构。armv5te表示本程序的代码可以运行在armv5te架构的处理器上运行。

1.2 协处理器类型

.fpu指定协处理器的类型。softvfp表示使用浮点数运算库来模拟协处理器运算。还可以用vfpv2、vfpv3来指定自带的协处理器。

1.3 接口属性

.eabi_attrbute指定了一些接口。

EABI(Embedded Application Binary Interface)嵌入式应用二级制接口是ARM指定的一套接口规范,Android系统实现了它。

二 段定义

    .file   "hello.c"
    .section    .rodata
    .align  2
.LC0:
    .ascii  "Hello ARM!\000"
    .text
    .align  2
    .global main
    .type   main, %function
main:
    @ args = 0, pretend = 0, frame = 8
    @ frame_needed = 1, uses_anonymous_args = 0
    stmfd   sp!, {fp, lr}
    add fp, sp, #4
    sub sp, sp, #8
    str r0, [fp, #-8]
    str r1, [fp, #-12]
    ldr r3, .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

ARM中段的定义格式如下所示:

.section name , "flags", %type, flag_specific_arguments
  • name:段名
  • flags:段的属性,如读、写和可执行等。
  • type:段的类型,如progbits表示段中含有数据,note表示段中包含的数据并非程序本身使用。
  • flag_specific_arguments:指定了一些平台相关的参数。

三 注释与标号

GNU ARM支持两种注释添加方式。

/* */型注释

/* args = 0, pretend = 0, frame = 8 */
/* frame_needed = 1, uses_anonymous_args = 0 */

@型注释

@ args = 0, pretend = 0, frame = 8
@ frame_needed = 1, uses_anonymous_args = 0

四 汇编器指令

.file   "hello.c"
    .section    .rodata
    .align  2
.LC0:
    .ascii  "Hello ARM!\000"
    .text
    .align  2
    .global main
    .type   main, %function

程序中所有以.开头的指令都是汇编器指令,汇编器指令是与汇编器相关的,它们并不属于ARM指令集。

  • .file:指定源文件名。
  • .align:指定代码的对齐方式,后面跟的数值是2的次数方。
  • .ascii:声明字符串。
  • .global:声明全局符号,全局符号是指在本程序外可以访问的符号,
  • .type:指定符号的类型。
  • .word:用来存放地址值。
  • .size:设置指定符号的大小。
  • .ident:编译器标识,无实际用途。

五 子程序与参数传递

子程序在代码表示一个独立的功能,很多时候,子程序和代码是相同的概念。在汇编中声明函数的方式如下所示:

.global 函数名
.type 函数名 %Function
函数名:
    ...
    函数体
    ...

那么函数调用过程中,参数传递的方式如下所示:

ARM汇编中规定:R0~R3这4个寄存器分别用来传递函数调用的第1到第4个参数,超出的参数通过堆栈来传递。R0寄存器用来存放函数调用的返回值。被调用的函数在返回前无需恢复这些寄存器的内容。

ARM汇编语言学习笔记(一)---ARM汇编的程序结构

0x00 用到的书籍 《Android软件安全与逆向分析》第六章 0x01 原生程序的生成过程笔者是在Linux环境下测试的,详细过程见书中说明需要编译的C语言代码#include int mai...
  • u013736724
  • u013736724
  • 2016年11月17日 15:21
  • 1841

GNU风格 ARM 汇编指令语法总结

汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作 ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。 1、  GNU汇编语言语句格式 ...
  • yanbixing123
  • yanbixing123
  • 2016年08月24日 15:28
  • 1493

ARM:ARM汇编语言与基础汇编指令

1、为什么要学习汇编语言?     1)嵌入式硬件上电的初始化代码是用汇编代码编写;     2)调试代码时,问题的解决有可能看汇编代码;     3)系统调优(提高产品整体运行效率);   ...
  • sinat_36184075
  • sinat_36184075
  • 2017年02月19日 21:51
  • 592

ARM汇编语言的基本语法

一.汇编语言的基本语法 /************************汇编指令的基本结构*****************************/ 标号 操作码  操作数1,操作数2,....
  • hjj_1015
  • hjj_1015
  • 2014年03月11日 11:16
  • 1714

ARM汇编编程基础

(一) -- ARM CPU寄存器 本系列文章节选自本人所著《深入浅出嵌入式底层软件开发》。 本系列文章,所需代码请从以下地址下载: http://download.csdn...
  • zzsfqiuyigui
  • zzsfqiuyigui
  • 2014年08月05日 23:56
  • 4940

ARM汇编语言学习笔记

ARM处理器一共有37个寄存器 包括31个通用寄存器,包括PC,都是32位的寄存器,6个状态寄存器,也都是32位寄存器 有其中不同的模式,用户模式,快速中断模式,普通中断模式,管理模式,数据访问终...
  • a158337
  • a158337
  • 2014年09月27日 21:03
  • 2249

ARM体系结构与汇编指令

《朱老师物联网大讲堂》学习笔记 学习地址:www.zhulaoshi.org (1). ASIC专用芯片 到 可编程器件, CPU在固定频率下,读取/解析/执行指令, 二进制文件被CPU读取进去,...
  • qq_18973645
  • qq_18973645
  • 2016年04月24日 18:20
  • 1698

ARM汇编语言中的程序结构

在 ARM ( Thumb )汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据...
  • xinianbuxiu
  • xinianbuxiu
  • 2016年10月02日 19:24
  • 785

Linux下ARM汇编教程

第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作ARM的协处理器等。初始化完成后就可以跳转到C代...
  • denlee
  • denlee
  • 2008年06月01日 16:24
  • 15323

arm汇编语法Demo

Arm汇编简单语法小Demo
  • shaohuazuo
  • shaohuazuo
  • 2014年12月11日 20:22
  • 1235
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【基于Android的ARM汇编语言系列】之三:ARM汇编语言程序结构
举报原因:
原因补充:

(最多只允许输入30个字)