ble bt wifi乐鑫c6模组乐鑫芯片esp8266代理商汇编语言功能,汇编语言(Assemble Language)是能够翻译成二进制机器码的符号语言。现今,很少有人使用汇编语言开发应用程序。但是,在开发一些特殊的程序(如设备驱动、系统引导程序等)时,汇编语言仍然是不可或缺的角色。ble bt wifi乐鑫c6模组乐鑫芯片esp8266代理商汇编语言可以直接访问处理器的寄存器、存储器和 I/O 等,提高程序运行效率。
RISC-V 版本的 GNU gas 是常用的 RISC-V 汇编器之一,其汇编语言的语法格式和命令字与 ARM 版本的 GNU gas 相同。
汇编程序格式
汇编语言程序由汇编命令(Assemble Directives)和指令语句组成。汇编命令ble bt wifi乐鑫c6模组乐鑫芯片esp8266代理商常在汇编语言源程序的起始部分,声明汇编源程序中标签和段的属性。指令语旬是汇编语言程序的基本单元。如图 5.6 所示,RISC-V 汇编语言的推令语句由标签、操作码、操作数和注释 4 个部分组成。标签是当前指令的位置标识符号,常作为汇编语言程序中的函数入口或跳转目标。标签是可选项。操作符是 RISC-V 指令符号、汇编语言伪指令或者是用户自定义的宏。
操作数是指令执行时所需的参数,与操作符之间用空格分开,可以是符号、常量或者是由符号和常量组成的表达式。ble bt wifi乐鑫c6模组乐鑫芯片esp8266代理商注释是为了解释语句或程序功能而添加的信息,对程序没有影响,仅仅起到注解作用,是可选项,以“;”和“#”作为分隔号,与指令隔开。或者使用类似 C语言的注释语法,用“//”和“/* */”对单行或者大段程序进行注释。所添加注释的格式与汇编器相关。在 SEGGER Embedded Stiduo 中,gas 采用类似于 C语言的注释语法。
[label:][标签:] operation 操作符 [operands][操作数] [;comment][:注释]
RISC-V 汇编语言指令语句格式
其中,在程序起始部分,用汇编命令声明段的属程序的主体部分是实现程序功能的指令语句。
示例5.1: 指令段声明示例。
/*属性区*/
1 .section .text,"ax" //声明.text 段及其属性
2 .global _start //声明全局标签 _start,指定程序入口
/*指令区 */
3 _start; //定义标签
4 lui al,0x80 //装载立即数
5 addi al, al,0x100 //立即数加
6 la a3,_mydata //装载标签地址
7 lw a2,(a3) //从内存装载数据
8 loop;
9 nop /空操作
10 j loop //跳转到loop
11 .end //当前文件中汇编程序结束
在示例 5.1中,用“.section.text”指定本段是程序的指令区。“ax”是该段的属性标识(flag),字符“a”和“x”分别表示该段可分配和可执行。
命令.global 声明 _start 是全局标签。代码部分由标签和指令语句组成。示例中的“_start”和“loop是标签,“lui”、“addi”“nop”和“j”是指令。
RISC-V 汇编语言还包括数据段。示例 5.2 是声明数据段的汇编语句。其中.section.rodata”声明本段为只读数据段,“.word”声明每个数据分配 4 字节空间并初始化数据。
示例 5.2: 数据段属性声明
/*属性声明区*/
1 .section .rodata //声明为只读数据段
2 .global _mydata //声明全局标签
/* 数据区城 */
3 _mydata: //定义标签,数据区起始地址
4 .word 0x12345678,0x23456789 //分配内存并设定初始值
5 .end
伪指令
为了增强汇编程序的可读性和编程的方便性,ble bt wifi乐鑫c6模组乐鑫芯片esp8266代理商在汇编语言中常定义一些特殊的符号,通常称为伪指令,表示一-些处理器指令的特殊应用或者功能组合。表 5.7列出了RISC-V gas 中部分常用的 RV32I伪指令。
表5.7 gas 中部分常用 RV32I伪指令
功能 伪指令 RV32I指令
装载任意立即数Load Immediate li t0,0x12345678 lui t0,0x12345addi t0,t0,0x678
装载内存地址Load Address la t0,_func auipc t0,(_func-pc)>>12 addi t0,t0,(_func-pe)&.0xfff
函数调用 call call main jal ra,main
返回 RETurn ret jalr x0,0,ra
寄存器间移动数据 Move mv rd,rs addi rd,rs,0
等于零时跳 Branch=0 beqz rs,imm beq rs,x0 ,imm
跳转 Jump j imm jal x0 ,imm