arm的ads彙編器與gcc彙編器
2009-10-14 10:06
彙編器與指令集,不同的cpu對應不同的指令集;不同的彙編器對應不同的語法和偽指令集。
每種彙編器都可以有自己的偽指令集和自己的語法,但實際上,由於事實標準的原因,(所有的cpu廠商會提供指令使用手冊,手冊中的指令書寫樣式,實際上就是事實彙編語法,何況cpu廠商肯定會提供自己的彙編器的),現代大多數的彙編器都會在主流的彙編語法intel型和at&t型這兩類語法中選擇一種作為自己的語法(intel型可能會越來越流行)。
arm官方提供的彙編器/指令手冊中使用的是intel型語法,gnu的彙編器gas使用的是at&t型語法。
然而,gas for arm版的開發者,為了避免混亂,實現了完全和arm官方彙編語法是一致的語法。也就是說,當你使用arm指令集的指令時,按arm官方手冊的語法書寫,用gas for arm編譯完全沒有問題。主要要注意的是偽指令集。
arm的ads彙編器與gcc彙編器
一:ads下的一段匯程式設計序:
__main
export bootreset
bootreset
b resetvec_reqset
import
bootentry
import
|image$$ro$$limit|
area
bootrom, code, readonly
ldr
r0, =|image$$ro$$limit|
beq
%1 ldr
pc, [pc,#-&f20]
轉換到gcc下的匯程式設計序為:
__main
.global bootreset
bootreset:
b resetvec_reqset
.extern
bootentry
.extern
image_ro_limit
# area
bootrom, code, readonly
ldr
r0, =image_ro_limit
beq
func1
ldr
pc, [pc,#-0xf20]
二:將arm sdt下的彙編碼移植到gcc for arm編譯器時,經常要做如下修改:
1、注釋行以「@」或""代替「;」
2、偽操作符替換:
include 替換成 .include
tclk2 equ pb25 替換成 .equ tclk2, pb25
export 替換成 .global
import 替換成 .extern
dcd 替換成 .long
if :def: 替換成 .ifdef
else 替換成 .else
endif 替換成 .endif
:or: 替換成 |
:shl: 替換成 <<
end 替換成 .end
符號定義後加":"號
area word, code, readonly --> .text
area block, data, readwrite --> .data
code32 --> .arm
code16 --> .thumb
ltorg --> .ltorg
3、運算元及運算符號替換
ldr pc, [pc, #&18] 替換成 ldr pc, [pc, #+0x18]
「&」以「+0x」號替換
三:arm gcc彙編中常量編譯控制
編譯定義符說 明
語 法例 子
.byte
位元組定義 expr(8bit數值)
.byte expr
.byte25, 0x11, 031, 'a
.hword
半字定義expr (16bit數值)
.hword expr
.hword2, 0xffe0
.short
作用同.hword
.short expr
.short257
.word
字長定義expr (32bit數值)
.word expr
.word144511, 0x11223
.int
作用同.word
.int expr
.int21
.long
作用同.word
.long expr
.long1923, 0b10010101
.ascii
定義字串expr(非零結束符)
.ascii expr
.ascii"ascii text is here"
.asciz
定義字串expr(以0為結束符)
.asciz expr
.asciz"zero terminated text"
.string
作用同.asciz
.string expr
.string"my cool string\n"
.quad
定義乙個大的數expr (向上分成8bit的數存放)
.quad expr
.quad0x********911
.octa
定義乙個大的數expr(向上分成16bit的數存放)
.octa expr
.octa0xfedcba987654321
.float
定義乙個32bit ieee 浮點數expr
.float expr
.float0f3.14, 0f359.2e11
.single
作用同.float
.single expr
.single0f12341243.14e2
.double
定義64bit ieee浮點數expr(浮點數)
.double expr
.double0f2e1
.fill
用size長度value填充repeat次。size預設為1, value預設為 0.
.fill repeat
.fill32, 4, 0xffffffff
ARM彙編器與GCC彙編器支援的組合語言差別
將arm sdt下的彙編 移植到gcc for arm編譯器時,經常要做如下修改 1 注釋 或者 2 偽操作符替換 jumpaddr jumpaddr 符號定義加 號 include include equ equ tclk2 equ pb25 equ tclk2,pb25 tclk2 equ pb...
構建自己的編譯器(八)彙編器之二
現在大致明白了是怎麼工作的了,它根據前向算的,獲取出乙個token之後就能判斷它到底屬於哪乙個句型,對於c語言的確是如此,但是對於我這個語言來說,emmm,貌似也差不多,它維護著乙個變數表,我完全可以用map實現,然後對於變數定義,真的不難。那麼彙編器實際上也不用做,其也是解析成組合語言然後放入虛擬...
關於編輯器,編譯器,彙編器,以及跨平台的思考
編輯器用來接收鍵盤輸入的字元,比如記事本等,但是這類編輯器沒有語法高亮,補全等功能,對使用者不夠友好,因此書寫 使用功能更加強大的編輯器會提公升效率。機器識別的是0101011之類的二進位制語言 機器語言 但是一般人們用c語言,或更高階語言都是以英文輸入,因此輸入的 需要經過一定轉換,變成機器可以識...