1.汇编语言格式简介
以asm_run_seg.S为例:
代码语言:javascript复制.equ BYTE_DELAY, 0x00100000
.equ GPIO_ADDR, 0xf0000000
.globl _start
_start:
LI t2, BYTE_DELAY; # set counter
ADDI t3, x0, 0; # t3 = 0
LI t0, GPIO_ADDR; # set gpio base_address
......
LOOP: ADDI t3, t3, 1; # t3 = t3 1
BNE t3, t2, LOOP; # if(x6 != x7) goto loop
ADDI t3, x0, 0; # t3 = 0
汇编的指示符(directive)的格式使用“.” 关键词
.globl(注意不是.global)用来声明全局标签,可从其它的文件访问,比如上面代码中.globl定义了_start,那么如果工程中其他的文件需要跳转到_start地址,可以直接使用
.equ定义符号常量,符号常量定义后可以在程序中使用,比如BYTE_DELAY 被定义为0x00100000,之后需要用0x00100000都可以用BYTE_DELAY 代替,赋予常量意义,容易理解,且便于批量修改。格式为.equ GPIO_ADDR,0xf0000000
标签,比如_start是地址,标注某段程序的位置,为程序中跳转及分支语句提供的跳转入口。标号一般用大写字母表示,或下划线跟小写字母或单词。在使用标号时后面跟冒号”:”,比如LOOP: ,_start:
一般汇编指令格式:指令 空格 寄存器 “,” 寄存器 “,” 寄存器(或立即数),比如 ADDI t3,x0,0;。也有部分汇编指令只接一个寄存器和立即数,格式为指令 空格 寄存器 “,” 立即数,比如 LI a3,0x08;
汇编指令以分号”;”结束,常量定义以回车换行结束,没有分号”;”。比如.equ GPIO_ADDR, 0xf0000000和ADDI t3,x0,0;
#后跟的内容是注释语句,对该指令或该段程序的说明或解释,编译器在编译时忽略该部分内容。比如# set gpio base_address
2.ABI
ABI(Application Binary Interface),应用程序到二进制的接口,一般是用来在应用程序与操作系统,应用程序与调用库(lib),及应用程序部件之间的底层接口,如图1所示。