GNU ARM 汇编学习笔记

指令格式

标签: 指令 @ 注释

  • 标签
    代表该指令在内存中的地址,由字符、数字、_ 和 $ 组成。
  • 指令
    ARM 指令
  • 注释
    以 @ 开始的字符串均为注释

例1:

    .text    @ 汇编指令,表示 text 段
start:              @ 标签,start
    mov r0, #5      @ 初始化 r0 为 5
    mov r1, #4      @ 初始化 r1 为 4
    add r2, r0, r1  @ r2 = r0 + r1
stop: b stop        @ 无限循环

常见的ARM指令

  1. .byte
    label: .(n)byte exp1, exp2, ...
    分配1字节的地址空间,类似: .4byte 表达式
  2. .align
    地址对齐
  3. .asciz
    分配内存空间存储字符串,字符串包含在双引号内,在字符串尾部加入结束字符 ‘\0’
    不同的 .ascii ,在字符串结尾不会自动加入结束字符。
  4. .equ
    .equ name, expression
    分配个符号 name, 其值为 expression
    例2:
        .text
        b start

str:    .asciz "Hello World"

        .equ   nul, 0

        .align
start:  ldr   r0, =str          @ r0 = &str
        mov   r1, #0

loop:   ldrb  r2, [r0], #1      @ r2 = *(r0++)
        add   r1, r1, #1        @ r1 += 1
        cmp   r2, #nul          @ if (r1 != nul)
        bne   loop              @    goto loop

        sub   r1, r1, #1        @ r1 -= 1
stop:   b stop

编译程序

  1. 汇编程序
    arm-linux-as -o 目标文件 源文件
  2. 链接程序
    arm-linxu-ld -T链接脚本 -o 目标文件 源文件
    查看各个标签分配的地址命令
    arm-linux-nm 目标文件
  3. 转换为 binary 格式文件
    ld 输出的文件为 ELF 格式的文件,不能在裸机上运行。所以必须转换为 binary 格式文件。命令arm-linux-objcopy能实现这种转换。
    arm-linux-objcopy -O 输出文件格式(binary) 输入文件 输出文

链接脚本

SECTIONS {
    . = 0x00000000
    .text : {
        abc.o (.text);
        def.o (.text);
    }
}

SECTIONS: 该命令指明代码段如何合并和分布
. (点) 代表当前位置
.text 指明各个文件中的.text 段的分布

C语言代码运行环境建立

  1. 设置栈
    C语言使用栈存储局部变量,传递参数,存储返回地址等内容。
  2. 全局变量

    • 已初始化的全局变量

      已初始化的全局变量分配在 .data 段,运行时,将该段拷贝的RAM中

    • 未初始化的全局变量

      所有未初始化的全局变量自动初始化为零,分配在 .bss 段

  3. 只读数据
    只读数据由 const 标记,分配在 .rodata 段,字符串也是分配在该段。

你可能感兴趣的:(arm-裸机,arm-裸机实验)