ble bt wifi樂鑫c6模組樂鑫芯片esp8266代理商匯編語言功能,匯編語言(Assemble Language)是能夠翻譯成二進制機器碼的符號語言?,F今,很少有人使用匯編語言開發應用程序。但是,在開發一些特殊的程序(如設備驅動、系統引導程序等)時,匯編語言仍然是不可或缺的角色。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