三星S5PV210開發之ARM彙編偽指令
阿新 • • 發佈:2019-01-30
偽指令的意義:
偽指令和機器指令的區別是偽指令經過編譯後不會生成機器碼
偽指令的意義在於指導編譯過程
偽指令和具體的編譯器相關,我們使用gnu工具鏈,因此學習gnu環境的彙編偽指令@符號是彙編裡面的註釋
:以冒號結尾的符號為標號,用來標識該指令的地址
. 點號代表當前指令的地址 b .死迴圈
# 井號在彙編裡面代表立即數常用gnu偽指令:
.global _start @給_start的外部連結屬性(申明為全域性屬性,可以外部檔案訪問)
.section .text @指定當前段為程式碼段
.ascii @定義一個字元
.byte @定義一個位元組,佔1位元組
.short @定義一個短整型,佔2位元組
.int @定義一個int型,佔4位元組
.long @定義一個長整型,佔4位元組
.word @定義一個字,跟.long一樣佔4位元組例子:
mmmm:
.word 0x11223344 @定義一個變數mmmm,四位元組,值為0x11223344=============================================不常用:
.quad @定義一個雙字,佔8位元組
.float @定義一個浮點數,佔4位元組
.string @定義一個字串=============================================.align 4 @對齊指令,以16位元組對齊,4表示2的4次方 b表示位填充。align表示要對齊。l表示long,以四位元組為單位填充。
16表示16位元組對齊,0xdeadbeff 是用來填充的原料。.equ @類似於c語言中的巨集定義.end @標誌彙編檔案結尾,可不寫
.include @標頭檔案包含
.arm/.code32 @宣告以下為ARM指令
.thumb/.code16 @宣告以下為thumb指令重要的幾個偽指令:
ldr @大範圍的地址載入指令ldr r0, = 是ldr做偽指令的標誌
adr @小範圍的地址載入指令
adrl @中等範圍的地址載入指令
nop @空操作當ldr作為大範圍地址讀取偽指令,LDR偽指令用於載入32們的立即數或一個地址值到
指定暫存器。在彙編編譯源程式時,LDR偽指令被編譯器替換成一條合適的指令。若加
載的常數未超出MOV或者MVN的範圍,剛使用MOV或MVN指令代替該LDR偽指令,否則匯
編器將常量放入字池,並使用一 條程式相對偏移的LDR指令從文字池讀出常量。ADR指令將基於PC相對偏移的地址值讀取到暫存器中,在編譯源程式時ADR偽指令被編
譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現該ADR偽指
令的功能,若不能用一條指令實現,剛產生錯誤,編譯失敗。
比如adr r0, delay//將標號delay的地址賦給r0ADR總是以PC為基準來表示地址,。因此指令本身和執行地址有關,可以用來檢測程式
當前的執行地址在哪裡
ldr載入的地址和連結時給定的地址有關,由連結指令碼決定
偽指令和機器指令的區別是偽指令經過編譯後不會生成機器碼
偽指令的意義在於指導編譯過程
偽指令和具體的編譯器相關,我們使用gnu工具鏈,因此學習gnu環境的彙編偽指令@符號是彙編裡面的註釋
:以冒號結尾的符號為標號,用來標識該指令的地址
. 點號代表當前指令的地址 b .死迴圈
# 井號在彙編裡面代表立即數常用gnu偽指令:
.global _start @給_start的外部連結屬性(申明為全域性屬性,可以外部檔案訪問)
.section .text @指定當前段為程式碼段
.ascii @定義一個字元
.byte @定義一個位元組,佔1位元組
.short @定義一個短整型,佔2位元組
.int @定義一個int型,佔4位元組
.long @定義一個長整型,佔4位元組
.word @定義一個字,跟.long一樣佔4位元組例子:
mmmm:
.word 0x11223344 @定義一個變數mmmm,四位元組,值為0x11223344=============================================不常用:
.quad @定義一個雙字,佔8位元組
.float @定義一個浮點數,佔4位元組
.string @定義一個字串=============================================.align 4 @對齊指令,以16位元組對齊,4表示2的4次方
.balignl 16,0xdeadbeff
16表示16位元組對齊,0xdeadbeff 是用來填充的原料。.equ @類似於c語言中的巨集定義.end @標誌彙編檔案結尾,可不寫
.include @標頭檔案包含
.arm/.code32 @宣告以下為ARM指令
.thumb/.code16 @宣告以下為thumb指令重要的幾個偽指令:
ldr @大範圍的地址載入指令ldr r0, = 是ldr做偽指令的標誌
adr @小範圍的地址載入指令
adrl @中等範圍的地址載入指令
nop @空操作當ldr作為大範圍地址讀取偽指令,LDR偽指令用於載入32們的立即數或一個地址值到
指定暫存器。在彙編編譯源程式時,LDR偽指令被編譯器替換成一條合適的指令。若加
載的常數未超出MOV或者MVN的範圍,剛使用MOV或MVN指令代替該LDR偽指令,否則匯
編器將常量放入字池,並使用一 條程式相對偏移的LDR指令從文字池讀出常量。ADR指令將基於PC相對偏移的地址值讀取到暫存器中,在編譯源程式時ADR偽指令被編
譯器替換成一條合適的指令。通常,編譯器用一條ADD指令或SUB指令來實現該ADR偽指
令的功能,若不能用一條指令實現,剛產生錯誤,編譯失敗。
比如adr r0, delay//將標號delay的地址賦給r0ADR總是以PC為基準來表示地址,。因此指令本身和執行地址有關,可以用來檢測程式
當前的執行地址在哪裡
ldr載入的地址和連結時給定的地址有關,由連結指令碼決定