本连载的2/3/4/5部分,如无特别说明,均出自:北师大课件
1. 数据定义伪操作
// ltorg =>用于在当前段的当前地址,产生一个data buffer的开始地址,可以分配很大的空间
.ltorg /*产生一个文字池的伪操作*/
src:
/*定义一个字(word=32bit)数据区*/
.long 1,2,3,4,5,6
dst:
.long 0,0,0,0,0,0
=============定义一个字符串============
.asciz "It is a dog"
.string "Intel"
2. 字符定义伪操作
用于为下述3种情况,定义一个字符名称:
数字常量
基于寄存器的值
程序中的标号
===================.equ/.set=================
.equ x,45 /*定义变量x,并赋值x=45*/
.equ y,64
.equ stack_top, 0x1000
.set zheng, "Chairman"
===================.global | .extern symbol ==============
声明一个Symbo可以被其它文件引用,相当于声明一个全局变量
.global _start
_start:
mov r0,#x
... ...
.extern Image_RO_Limit
.extern Image_ZI_Limit
.extern Main /*The entry of main program*/
3. 汇编控制伪操作
用于控制汇编程序的执行流程。
============ .section / .text / .data / .bss ================
格式: .section name [,"flags"[,@type[,@entsize]]]
.section .text,"x" ; 定义一个代码段"x"
.section .data ; "定义一个数据段"
.section .bss ; 定义一个未初始化的数据段
单独用 .text / .data / .bss也能定义段
===========构造链接脚本文件===================
假设程序仅由代码/初始化数据/未初始化数据组成,代码存放在0x10000开始的区域,数据存放在0x8000000开始位置.
SECTIONS
{
. = 0x10000 ; /* .代表位置计数器,标示当前位置*/
.text : {*(.text)} ; /*标示所有代码段置于此*/
. = 0x8000000 ; /* .代表位置计数器,标示当前位置*/
.data : {*(.data)}
.bss : {*(.bss)}
}