ARM GNU 汇编 “每日读书“

GNU ARM汇编程序如果我们定义一个浮点数那么可以使用下面伪操作来定义

标签,命令

f:

.float 3.14

.equ f,3.1415

我们可以使用.float 伪操作定义一个浮点数f, 并初始化3.14 如果你想这个浮点数重新赋值3.1415可以通过.equ 伪操作来完成

.equ 伪操作除了数据赋值还可以常量定义代码然后代码直接引用这一点有点类似C语言#define 定义

.section .data

.equ DELAY,100

...

.section .text

...

MOV R0,$DELAY

3.7.7 汇编代码分析实战

有了GNU ARM汇编语言基础之后接下来我们做一个实验linux环境编写一个C程序使用ARM交叉编译器将其编译汇编文件然后利用本节所学知识分析汇编文件组织结构

C程序源码如下

hello.c

#include <stdio.h>

int global_val = 10;

int global_uvar;

int add(int a, int b)

{

return a + b;

}

int main(void)

{

int sum;

sum = add(1, 2);

printf("hello world\n");

return 0;

}

接下我们这个hello.c 源文件编译汇编程序文件对其进行分析

cat hello.s

.arch armvST ;//指令集版本

.fpu softvfp;//付点类型

.eabi_attribute,20,1 ;EABI 接口属性

.eabi_attribute,21,1 ;

.eabi_attribute,23,1 ;

.eabi_attribute,24,1 ;

.eabi_attribute,25,1 ;

.eabi_attribute,26,2 ;

.eabi_attribute,30,6 ;

.eabi_attribute,34,0 ;

.eabi_attribute,18,4 ;

.file "hello.c" ;当前汇编文件对应文件名

.global global_val 声明一个全局符号声明其他文件可以引用

.data 声明一个数据段

.align 2 数据段对齐方式22次方4字节对齐

.type global_val, %object 设置全局符号类型变量

.size global_val, 4 设置全局符号大小4字节

global_val:

.word 10 ;global_val 分配一个字大小存储空间初始化10

.comm global_uvar,4,4 .comm 临时段申请一段命名空间

.text 代码段起始地址

.align 2 代码段对齐方式22次方4字节对齐

.global add 声明一个全局符号add

.syntax unified

.arm 当前代码指令ARM指令

.type add, %function 设置符号add类型函数

add:

@args = 0pretend = 0, frame = 0注释

@frame needed = 1, uses_anonymous_args = 0

@ link register save elimitnated

str fp, [sp, #-4]f

add fp, sp, #0

sub sp, sp, #12

str r0, [fp, #-8]

str r1, {fp, #-12}

ldr r2, [fp, #-8]

ldr r3, [fp, #-12]

add r3, r2, r3

mov r0, r3

sub sp, fp, #0

@sp needed

ldr fp, [sp], #4

bx lr

.size add , -add 函数大小 --当前地址(函数结束地址)-add函数开始地址

.section .rodata 定义一个section .rodata 只读数据段

.align 2 只读数据对齐方式2字节对齐

.LC0

.ascli "hello world\n" 定义一个字符串

.text //代码开始地址

.global main 声明一个全局符号main

.syntax unifield

.arm

.type main, %function 全局符号main类型设置为函数

main:

#args 0, pretend = 0 frame = 0

#frame_needed = 1, uses_anonymous_args = 0;

push {fp, lr}

add fp, sp, #4

sub sp, sp, #8

mov, r1, #2

mov r0, #1

bl add

str r0, {fp, #-8}

ldr r0, LS

bl puts

mov r3, #0

mov r0, r3

sub sp, fp, #4

@sp needed

pop {fp, pc}

.L6

.align 2

.LS

.word .LC0 分配内存用来存放printf 要打印字符串地址, .LC0

.size main, -main 设置main函数大小=当前地址-main开始地址

.ldent "GCC"

.section .note.GNU-stack

相关推荐

  1. ARM GNU 汇编每日读书

    2024-03-11 15:12:03       42 阅读
  2. linux内核网络“每日读书

    2024-03-11 15:12:03       45 阅读
  3. linux内核网络揭秘《二》“每日读书

    2024-03-11 15:12:03       45 阅读
  4. ARM汇编程序设计 注释 “每日读书

    2024-03-11 15:12:03       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-11 15:12:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-11 15:12:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-11 15:12:03       87 阅读
  4. Python语言-面向对象

    2024-03-11 15:12:03       96 阅读

热门阅读

  1. flink是什么

    2024-03-11 15:12:03       36 阅读
  2. 使用docker搭建s-pdf

    2024-03-11 15:12:03       46 阅读
  3. 《Effective Modern C++》- 极精简版 30-35条

    2024-03-11 15:12:03       44 阅读
  4. 力扣爆刷第91天之hot100五连刷41-45

    2024-03-11 15:12:03       46 阅读
  5. 【Django】聚合查询

    2024-03-11 15:12:03       44 阅读
  6. 数据的处理包括哪些内容

    2024-03-11 15:12:03       37 阅读
  7. TREC 2023 Deep Learning Track Guidelines

    2024-03-11 15:12:03       35 阅读
  8. Django路由层

    2024-03-11 15:12:03       40 阅读
  9. 关于51单片机晶振定时问题

    2024-03-11 15:12:03       45 阅读
  10. Mybatis分组查询大于某值的最小值记录

    2024-03-11 15:12:03       46 阅读