ARM的ADS彙編器與GCC彙編器

2021-06-08 00:45:10 字數 3727 閱讀 4112

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語言,或更高階語言都是以英文輸入,因此輸入的 需要經過一定轉換,變成機器可以識...