Arm僞指令

僞指令不是指令,僞指令和指令的根本區別是通過編譯後會不會生成機器碼。工具

僞指令的意義在於指導編譯過程。學習

僞指令是和具體的編譯器相關的,咱們使用gun工具鏈,所以學習gun環境下的彙編僞指令。spa

 

gun彙編中的一些符號:code

@  用來作註釋ci

#    也用來作註釋,通常用於行首,表示這一行都是註釋而不是代碼編譯器

:  以冒號結尾的是標號string

.    在gun彙編中表示當前指令的地址io

#   當即數前面要加#或$,表示這是個當即數編譯

 

.global _start  @給_start外部連接屬性float

.section .text  @指定當前段爲代碼段

.ascii .byte .short .long .word

.quad .float .string@定義數據

.align 4    @以16字節對齊

.balignl 16 0x12345678  @16字節對齊填充

.equ    @相似C中宏定義

例如:

IRQ_STACK_START:

  .word  0x12345678

等價於 unsigned int IRQ_STACK_START = 0x122345678;

.balignl 16,0xdeadbeef  @對齊+填充

b表示位填充;align表示要對齊;l表示long,以4字節爲單位填充;16表示16字節對齊;0xdeadbeef是用來填充的原料

 

.end  @表示文件結束

.include  @頭文件包含於

.arm/ .code32 @聲明如下爲arm指令

.thumb/ .code16 @聲明如下爲thumb指令

 

ldr  大範圍的地址加載指令

adr  小範圍的地址加載指令

adrl  中等範圍的地址加載指令

nop  空操做

 

ARM指令中有一個ldr指令,也有一個ldr僞指令。通常都使用僞指令。

ldr指令:  ldr r0,#0xff

ldr僞指令:    ldr r0,=0xfff  @涉及到合法/非法當即數,涉及到ARM文字池

 

adr與ldr

adr編譯時會被1條sub或add指令替代,而ldr編譯時會被條mov指令 替代或者文字池方式處理;
 
adr總 是以PC爲基準來表示地址,所以指令自己和運行地址有關,能夠用來檢測程序當前的運行地址在哪裏;

ldr加載的地址和連接時給定的地址有關,由連接腳本決定。
相關文章
相關標籤/搜索