一、間隔符。可用空格或Tab,一個多個都可,無順序。node
二、註釋。段註釋和C語言的相同,都是/*...*/。而行註釋就因TARGET不一樣而不一樣了。X86機上,使用「#」。ARM行註釋採用「;」或者「@」。程序員
三、符號。符號由字母、數字、(_ . $)這三種組合而成的一個或者多個字符組成。注意不要以數字開頭,沒有長度限制,大小寫敏感。符號以不在字符集內的字符分割,或者是以文件開頭分割。算法
四、語句。支持空行,其餘和X86下的彙編相似,以newline(「\n」)結束。express
五、常量。包含字符常量、字符串、數字常量等。關於數字常量,以「0X」或「0x」開頭表示16進制,以「0B」或「0b」開頭表示二進制,以「0」開頭表示八進制,以非零開頭表示十進制。十進制和八進制容易出錯了。仍是直接使用16進制好。若是使用十進制,注意開頭不能爲0。編程
.abort
該指令的做用是當即中止彙編。這麼作是爲了與其餘彙編器兼容。最初的想法是彙編語言源程序將被傳送到彙編器。若是源程序的發送者退出,它可使用此指令告訴as也退出。有一天.abort將不受支持。數據結構
.ABORT(COFF)
當生成COFF輸出時,as接受此指令做爲.abort的同義詞。框架
.align abs-expr, abs-expr, abs-expr
將位置計數器(在當前子段中)填充到特定存儲邊界。第一個表達式(必須是絕對的)是所需的對齊,以下所述。
第二個表達式(也是絕對的)給出填充值存儲在填充字節中。它(和逗號)能夠省略。若是省略,則填充字節一般爲零。可是,在大多數系統上,若是該部分被標記爲包含代碼而且省略了填充值,則該空間將填充無操做指令。
第三個表達式也是絕對的,也是可選的。若是存在,則是此對齊指令應跳過的最大字節數。若是進行對齊將須要跳過比指定的最大值更多的字節,則根本不會進行對齊。您能夠徹底省略填充值(第二個參數),只需在所需的對齊後使用兩個逗號;若是您但願在適當的時候使用無操做指令填充對齊,這可能頗有用。
指定所需對齊的方式因系統而異。對於arc,hppa,使用ELF的i386,iq2000,m68k,or1k,s390,sparc,tic4x,tic80和xtensa,第一個表達式是以字節爲單位的對齊請求。例如 '.align 8'使位置計數器前進,直到它是8的倍數。若是位置計數器已是8的倍數,則不須要進行任何更改。對於tic54x,第一個表達式是word中的對齊請求。
對於其餘系統,包括ppc,使用a.out格式的i386,arm和strongarm,它是位置計數器在前進後必須具備的低位零位數。例如 '.align 3'使位置計數器前進,直到它爲8的倍數。若是位置計數器已是8的倍數,則不須要進行任何更改。
這種不一致是因爲各類本地彙編程序對GAS必須模擬的這些系統的不一樣行爲。GAS也提供了.balign和.p2align指令,後面描述,其中有在全部體系結構一致的行爲(但具體到GAS)。ide
.ascii "string"
.ascii指望用逗號分隔的零個或多個字符串文字(請參閱字符串)。它將每一個字符串(沒有自動尾隨零字節)組合成連續的地址。函數
.asciz "string"
.asciz就像.ascii,但每一個字符串後跟一個零字節。其中的'z'表明「零」。ui
.balign[wl] abs-expr, abs-expr, abs-expr
將位置計數器(在當前子部分中)填充到特定存儲邊界。第一個表達式(必須是絕對的)是以字節爲單位的對齊請求。例如 '.balign 8'使位置計數器前進,直到它是8的倍數。若是位置計數器已是8的倍數,則不須要進行任何更改。
第二個表達式(也是絕對的)給出填充值存儲在填充字節中。它(和逗號)能夠省略。若是省略,則填充字節一般爲零。可是,在大多數系統上,若是該部分被標記爲包含代碼而且省略了填充值,則該空間將填充無操做指令。
第三個表達式也是絕對的,也是可選的。若是存在,則是此對齊指令應跳過的最大字節數。若是進行對齊將須要跳過比指定的最大值更多的字節,則根本不進行對齊。您能夠徹底省略填充值(第二個參數),只需在所需的對齊後使用兩個逗號; 若是您但願在適當的時候使用無操做指令填充對齊,這可能頗有用。
在.balignw和.balignl指令是變體的 .balign指令。該.balignw指令將填充模式視爲雙字節字值。該.balignl指令把填充圖案爲四個字節長字值。例如,.balignw 4, 0x368d將對齊到4的倍數。若是它跳過兩個字節,它們將填入值0x368d(字節的確切位置取決於處理器的字節順序)。若是它跳過1或3個字節,則填充值未定義。
.bundle_align_mode abs-expr
.bundle_align_mode啓用或禁用對齊的指令包模式。
.bundle_lock和.bundle_unlock
在.bundle_lock和指令.bundle_unlock指令容許在指令束填充明確的控制。這些指令僅.bundle_align_mode在用於啓用對齊指令包模式時有效。若是它們在.bundle_align_mode徹底沒有被使用時出現,或者在最後一個指令是.bundle_align_mode 0時出現,則會出錯。
.byte expressions
.byte指望零或多個表達式,以逗號分隔。每一個表達式都彙編到下一個字節中。
CFI 指令
7.10.1 .cfi_sections section_list
.cfi_sections可用於指定CFI指令是否應發出.eh_frame部分和/或.debug_frame部分。若是section_list是.eh_frame,.eh_frame被髮射,若是section_list是.debug_frame,.debug_frame被髮射。要發射二者,同時使用.eh_frame,.debug_frame。若是不使用此指令,則默認爲.cfi_sections .eh_frame。
在支持緊湊展開表的目標上,能夠經過指定.eh_frame_entry而不是生成這些表來生成.eh_frame。
某些目標可能支持其餘名稱,例如.c6xabi.exidx目標使用的名稱。
若是CFI生成還沒有啓動,則可使用相同或不一樣的參數重複.cfi_sections指令。可是,一旦CFI生成開始,分區列表是固定的,任何從新定義它的嘗試都會致使錯誤。
7.10.2 .cfi_startproc [simple]
.cfi_startproc在每一個函數的開頭使用,在.eh_frame中應該有一個條目。它初始化一些內部數據結構。別忘了關閉這個功能.cfi_endproc。
除非.cfi_startproc與參數simple一塊兒使用, 它還會發出一些與體系結構相關的初始CFI指令。
7.10.3 .cfi_endproc
.cfi_endproc在函數的末尾使用,它關閉之前由.cfi_startproc打開的展開項,並將其發送到.eh_frame。
7.10.4 .cfi_personality encoding [, exp]
. cfi_personality 定義了個性規律及其編碼。編碼必須是一個常量,以肯定如何編碼個性。若是是255(DW_EH_PE_omit),則不存在第二個參數,不然第二個參數應爲常量或符號名稱。在使用間接編碼時,所提供的符號應該是能夠從其加載個性的位置,而不是個性常規自己。默認值爲.cfi_startproc是cfi_personality 0xff, 沒有個性習慣。
7.10.5 .cfi_personality_id id
cfi_personality_id定義了一個個性例程,其索引定義爲緊湊的展開格式。僅在生成緊湊EH幀時有效(即.cfi_sections eh_frame_entry)。
7.10.6 .cfi_fde_data [opcode1 [, …]]
cfi_fde_data用於描述用於當前函數的緊湊展開操做碼。若是足夠小且沒有LSDA,或者在.gnu.extab節中,則會在.eh_frame_entry節中內聯發出這些內容。僅在生成緊湊EH幀時有效(即.cfi_sections eh_frame_entry)。
7.10.7 .cfi_lsda encoding [, exp]
.cfi_lsda定義LSDA及其編碼。編碼必須是肯定如何編碼LSDA的常量。若是是255(DW_EH_PE_omit),則不存在第二個參數,不然第二個參數應爲常量或符號名稱。默認值爲.cfi_startproc緊跟cfi_lsda 0xff,即不存在LSDA。
7.10.8 .cfi_inline_lsda [align]
.cfi_inline_lsda標記LSDA數據節的開始,並切換到相應的.gnu.extab節。前面必須有一個包含.cfi_lsda指令的CFI塊。僅在生成緊湊EH幀時有效(即.cfi_sections eh_frame_entry)。
此時將生成表頭和展開操做碼,以便緊接着LSDA數據。.cfi_lsda指令引用的符號仍應在使用基於回退FDE的編碼時定義。LSDA數據由節指令終止。
可選對齊參數指定所需的對齊方式。對齊方式指定爲2的冪,與.p2align指令相同。
7.10.9 .cfi_def_cfa register, offset
.cfi_def_cfa定義了一個計算CFA的規則:從寄存器中取地址並添加偏移量。
7.10.10 .cfi_def_cfa_register register
.cfi_def_cfa_register修改計算CFA的規則。從如今起註冊將使用而不是舊的。偏移量保持不變。
7.10.11 .cfi_def_cfa_offset offset
.cfi_def_cfa_offset修改計算CFA的規則。寄存器保持不變,但偏移量是新的。注意,它是將被添加到定義的寄存器中以計算CFA地址的絕對偏移量。
7.10.12 .cfi_adjust_cfa_offset offset
與.cfi_def_cfa_offset相同, 但偏移量是從上一個偏移量中加/減的相對值。
7.10.13 .cfi_offset register, offset
寄存器的先前值保存在從CFA的偏移量偏移處。
7.10.14 .cfi_val_offset register, offset
寄存器的先前值是CFA+偏移量。
7.10.15 .cfi_rel_offset register, offset
寄存器的先前值保存在偏離當前CFA寄存器的偏移量處。這被轉換爲.cfi_offset使用來自CFA的CFA寄存器的已知位移。這一般更容易使用,由於該數字將與它註釋的代碼相匹配。
7.10.16 .cfi_register register1, register2
寄存器1的先前值保存在寄存器寄存器2中。
7.10.17 .cfi_restore register
.cfi_restore在執行全部由.cfi_startproc添加的初始指令以後,寄存器的規則如今與函數開頭的規則相同。
7.10.18 .cfi_undefined register
從如今開始,寄存器的先前值沒法再恢復。
7.10.19 .cfi_same_value register
寄存器的當前值與前一幀中的相同,即不須要恢復。
7.10.20 .cfi_remember_state和.cfi_restore_state
.cfi_remember_state將每一個寄存器的規則集推送到隱式堆棧,同時將.cfi_restore_state它們從堆棧中彈出並將它們放在當前行中。這對於.cfi_*因爲程序的控制流而須要撤消多個指令的狀況頗有用。例如,咱們能夠有相似的東西(假設CFA是rbp的值):
je label
popq %rbx
.cfi_restore %rbx
popq %r12
.cfi_restore %r12
popq %rbp
.cfi_restore %rbp
.cfi_def_cfa %rsp,8
ret
label:
/* Do something else */
在這裏,咱們但願.cfi指令隻影響與標籤以前的指令對應的行。這意味着,咱們必須在標籤以後添加多個.cfi指令,以從新建立寄存器的原始保存位置,並將CFA從新設置爲"限制性"的值。這將是笨拙的, 並致使更大的二進制大小。相反, 咱們能夠這樣寫:
je label
popq %rbx
.cfi_remember_state
.cfi_restore %rbx
popq %r12
.cfi_restore %r12
popq %rbp
.cfi_restore %rbp
.cfi_def_cfa %rsp,8
ret
label:
.cfi_restore_state
/* Do something else */
這樣,後面的指令規則label將與第一個以前的規則相同,.cfi_restore而沒必要使用多個.cfi指令。
7.10.21 .cfi_return_column register
更改返回列寄存器,即返回地址直接在寄存器中,或者能夠經過寄存器規則訪問。
7.10.22 .cfi_signal_frame
將當前功能標記爲信號蹦牀。
7.10.23 .cfi_window_save
SPARC註冊窗口已保存。
7.10.24 .cfi_escape expression [,...]
容許用戶向展開信息添加任意字節。可使用它來添加特定於操做系統的CFI操做碼,或者GAS尚不支持的通用CFI操做碼。
7.10.25 .cfi_val_encoded_addr register, encoding, label
寄存器的當前值是label。label的值將根據編碼在輸出文件中編碼;有關此編碼的詳細信息,參見.cfi_personality說明。
將寄存器等同於固定標籤的用處可能僅限於返回地址寄存器。在這裏,標記一個只有一個返回地址的代碼段是有用的,該代碼段由直接分支到達,而且內存或另外一個寄存器中不存在返回地址的副本。
.comm symbol, length
.comm聲明一個名爲symbol的通用符號。連接時,一個目標文件中的公共符號能夠與另外一個目標文件中的相同名稱的已定義或公共符號合併。
.data subsection
.data告訴as將如下語句彙編到數據小節編號子節的末尾(這是一個絕對錶達式)。若是省略subsection,則默認爲零。
.dc[size] expressions
.dc指令指望用逗號分隔零個或多個表達式。評估這些表達式並將其值插入當前節。發出值的大小取決於.dc指令的後綴 :
'.a'
發出N位值,其中N是目標系統上地址的大小。
'.b'
發出8位值。
'.d'
發出雙精度浮點值。
'.l'
發出32位值。
'.s'
發出單精度浮點值。
'.w'
發出16位值。注意 - 即便在.word指令將發出32位值的目標上也是如此。
'.x'
發出長雙精度浮點值。
若是沒有使用後綴,則假設是'.w' 。
字節排序與目標有關,浮點值的大小和格式也是如此。
.dcb[size] number [,fill]
該指令發出fill的number個副本,每一個size字節。number和fill都是絕對錶達式。若是省略逗號和填充,則假定填充爲零。若是省略了逗號和fill,則假定fill爲零。size後綴(若是存在) 必須是下列值之一:
'.b'
發出單字節值。
'.d'
發出雙精度浮點值。
'.l'
發出4字節值。
'.s'
發出單精度浮點值。
'.w'
發出2字節值。
'.x'
發出長雙精度浮點值。
若是省略大小後綴,則假設是'.w'。
字節排序與目標有關,浮點值的大小和格式也是如此。
.def name
開始定義符號名稱的調試信息; 直到遇到.endef指令。
.desc symbol, abs-expression
該指令將符號的描述符(請參閱符號屬性)設置爲絕對錶達式的低16位。
當as被配置爲COFF輸出時,'.desc'指令不可用; 它僅用於a.out或b.out 對象格式。爲了兼容性,as接受它,但在配置爲COFF時不產生輸出。
.dim
該指令由編譯器生成,以在符號表中包含輔助調試信息。它只被容許在.def/.endef內出現。
.double flonums
.double指望零或更多的flonums,用逗號分隔(其實就是定義一個64位IEEE雙精度浮點數)。它彙編了浮點數。發出的確切浮點數取決於as的配置方式。請參閱機器依賴性。
.eject
當生成彙編列表時,在此位置強制插入一個分頁符。
.else
.else是as支持條件彙編的一部分;參見.if。若是前面的條件.if爲假,它標誌着要彙編的代碼段的開始。
.end
表示彙編程序的結束。
.endef
此指令標記以.def開始的符號定義的結束。
.endfunc
.endfunc標記以.func指定的函數的結束。
.endif
.endif是as條件彙編支持的一部分; 它標誌着條件彙編的代碼塊的結束。參見.if。
.equ symbol, expression
該指令將symbol的值設置爲expression。它是'.set'的代名詞;參見.set。
在HPPA上equ的語法是'symbol .equ expression'。
在Z80上equ的語法是'symbol equ expression'。若是符號已經被定義,則在Z80上這是一個錯誤,但該符號不受之後從新定義的保護。比較一下equiv。
.equiv symbol, expression
.equiv指令是像.equ和.set,不一樣之處在於,但若是符號已經定義,彙編器將發出錯誤信號。注意已引用但未實際定義的符號被視爲未定義。
除了錯誤消息的內容外,這大體等同於:
.ifdef SYM
.err
.endif
.equ SYM,VAL
加上它能夠保護符號之後不被從新定義。
.eqv symbol, expression
.eqv指令相似於.equiv,但沒有嘗試對錶達式或它的任何部分當即進行評估。相反,每次在表達式中使用生成的符號時,將採起其當前值的快照。
.err
若是as彙編.err指令,它將打印錯誤消息,除非使用-z 選項,不然不會生成對象文件。這可用於在有條件編譯的代碼中發出錯誤信號。
.error "string"
相似於.err,此指令發出錯誤,但您能夠指定將做爲錯誤消息發出的字符串。若是未指定消息,則默認爲".error directive invoked in source file"。參見錯誤和警告消息。
.error "This code has not been assembled and tested."。
.exitm
從當前的宏定義中提早退出。參見宏。
.extern
.extern在源程序中被接受,爲了兼容其它彙編器起見,但它被忽略了。as將全部未定義符號視爲外部。
.fail expression
生成錯誤或警告。若是表達式的值爲500或更多,將打印警告消息。若是值小於 500,將打印錯誤消息。該消息將包括表達式的值。這在複雜的嵌套宏或條件彙編內偶爾會有用。
.file
.file指令有兩個不一樣的版本。支持DWARF2行號信息的目標使用DWARF2版本的.file。其餘目標使用默認版本。
默認版本
此版本的.file指令告訴咱們即將啓動一個新的邏輯文件。語法是:
.file string
字符串是新文件名。一般,文件名被識別是否被引號""所包圍;可是,若是您但願指定一個空文件名,則必須給出引號""。此語句未來可能會消失:它只被識別爲與舊程序兼容。
DWARF2版本
在發出DWARF2行號信息時,.file將文件名分配給.debug_line文件名錶。語法是:
.file fileno filename
fileno操做數應該是惟一正整數,用做表中條目的索引。文件名操做數是C字符串文本。
因爲文件名錶與DWARF2調試信息的.debug_info部分共享,所以用戶必須知道表條目將具備的確切索引,因此文件名索引的詳細信息會暴露給用戶。
.fill repeat, size, value
repeat,size和value都是絕對錶達式。這將發出重複的大小字節副本。重複可能爲零或更多。大小可能爲零或更多,但若是它大於8,則它被認爲具備值8,與其餘人的彙編器兼容。每一個重複字節的內容取自8字節的數字。最高階4字節爲零。最低順序4字節是在計算機上做爲正在彙編的整數的字節順序呈現的值。重複中的每一個大小字節都取自此數字的最低順序大小字節。一樣,這種怪異的行爲與其餘人的彙編器是兼容的。
size和value是可選的。若是沒有第二個逗號和值,則假定value爲零。若是缺乏第一個逗號和如下標記,則假定size爲1。
.float flonums
此指令彙編零個或多個浮點數,用逗號隔開。它的效果與.single相同。發出的浮點數字的確切類型取決於as配置的方式。參見計算機依賴性。
.func name[, label]
.func發出調試信息以表示函數名,除非在啓用調試的狀況下彙編文件,不然將被忽略。當前僅有"--gstabs[+]"支持。標籤是函數的入口點,若是使用"leading char"前面的省略名稱。"leading char"一般是 _ 或無,具體取決於目標。全部函數當前都定義爲具備void返回類型。該函數必須以.endfunc終止。
.global symbol, .globl symbol
全局使符號對ld可見。若是在分部程序中定義符號,則它的值可用於與之連接的其餘部分程序。不然,符號將其屬性從連接到同一程序的另外一個文件的同名符號中獲取。
這兩種拼寫 (".globl"和".global") 都被接受,以便與其餘彙編器兼容。
在HPPA上,.global並不老是足以讓其餘部分程序訪問它。你可能須要HPPA特有的.EXPORT指令。參見HPPA彙編器指令。
.gnu_attribute tag,value
記錄此文件的GNU對象屬性。參見對象屬性。
.hidden names
這是ELF可見性指令之一。另外兩個是.internal(參見.internal)和.protected(參見.protected)。
此指令重寫命名符號默承認見性(由其綁定設置:local、global或weak)。該指令將可見性設置爲隱藏,這意味着符號對其餘組件是不可見的。這些符號老是被認爲是受保護的。
.hword expressions
這將要求零個或多個表達式,併爲每一個表示發出16位數。
此指令是".short"的同義詞。取決於目標體系結構,它也多是".word"的同義詞。
.ident
某些彙編器使用此指令將標記放置在對象文件中。此指令的行爲因目標而異。使用a.out對象文件格式時,只需接受與現有彙編器的源文件兼容性的指令,但不爲其發出任何內容。使用COFF時, 將根據目標向.comment或.rdata節發出註釋。使用ELF時,註釋會發出到.comment部分。
.ifdef symbol
若是已定義指定的符號,則彙編下面的代碼。
.ifb text
若是操做數爲空(blank或empty),則彙編下面的代碼。
.ifc string1,string2
若是兩個字符串相等,則彙編下面的代碼。
.ifeq absolute expression
若是參數爲零,則彙編下面的代碼。
.ifeqs string1,string2
另外一種形式的.ifc,必須使用雙引號引用字符串。
.ifge absolute expression
若是參數大於或等於零,則彙編下面的代碼。
.ifgt absolute expression
若是參數大於零,則彙編下面的代碼。
.ifle absolute expression
若是參數小於或等於零,則彙編下面的代碼。
.iflt absolute expression
若是參數小於零,則彙編下面的代碼。
.ifnb text
就像.ifb,可是做用相反。若是操做數是非空(non-blank或non-empty),則彙編下面的代碼。
.ifnc string1,string2
就像.ifc,可是做用相反。若是兩個字符串不相等,則彙編下面的代碼。
.ifndef symbol, .ifnotdef symbol
若是還沒有定義指定的符號,則彙編下面的代碼。兩種寫法是等價的。注意,已引用但還沒有定義的符號被視爲未定義。
.ifne absolute expression
若是參數不等於零,則彙編下面的代碼。
.ifnes string1,string2
就像.ifeqs,可是做用相反。若是兩個字符串不相等,則彙編下面的代碼。
.incbin "file"[, skip[, count]]
incbin指令在當前位置上逐字地包含文件。您能夠控制與"-I"命令行選項一塊兒使用的搜索路徑 (參見命令行選項)。文件周圍須要引號。
skip參數從文件開頭跳過字節數。count參數指示要讀取的最大字節數。注意,數據沒有以任何方式對齊,所以用戶有責任確保在incbin指令先後提供正確的對齊方式。
.include "file"
此指令提供了一種在源程序的指定點包含支持文件的方法。文件中的代碼是按照.include的點進行彙編的;當到達包含文件的末尾時,原始文件的彙編將繼續進行。您能夠控制與"-I"命令行選項一塊兒使用的搜索路徑 (參見命令行選項)。文件名必須用引號包括。
.int expressions
指望零個或更多的表達式,任何部分,用逗號隔開。對於每一個表達式,發出一個在運行時爲該表達式的值的數字。數字的字節順序和位大小取決於彙編的目標類型。
.internal names
這是ELF可見性指令之一。另外兩個是.hidden(參見.hidden)和.protected(參見.protected)。
此指令重寫命名符號默承認見性(由其綁定設置:local、global或weak)。該指令將可見性設置爲隱藏,這意味着符號對其餘組件是不可見的。這些符號老是被認爲是受保護的。
.irp symbol, values…
計算爲符號分配不一樣值的語句序列。語句序列從.irp指令開始,並由.endr指令終止。對於每一個值,符號都設置爲值,而且語句序列被彙編。若是未列出任何值,則會彙編語句序列一次,並將符號設置爲null字符串。要在語句序列中引用符號,請使用\symbol。
舉例說明,彙編:
.irp param,1,2,3
move d\param,sp@-
.endr
等效於彙編:
move d1,sp@-
move d2,sp@-
move d3,sp@-
有關符號拼寫的一些警告,參見宏。
.irpc symbol, values…
計算爲符號分配不一樣值的語句序列。語句序列從.irpc指令開始,並由.endr指令終止。對於值中的每一個字符,符號都設置爲字符,而且語句序列被彙編。若是未列出任何值,則會彙編語句序列一次,並將符號設置爲null字符串。要在語句序列中引用符號, 請使用\symbol。
舉例說明,彙編:
.irpc param,123
move d\param,sp@-
.endr
等效於彙編:
move d1,sp@-
move d2,sp@-
move d3,sp@-
對於一些告誡與符號的拼寫,參見關於宏的討論。
.lcomm symbol, length
由符號表示的本地公用的預留長度(絕對錶達式)字節。符號的節和值是新的局部通用的。這些地址在bss節中分配, 以便在運行時字節從零開始。符號未聲明爲全局(參見.global),所以一般對ld不可見。
某些目標容許第三個參數與.lcomm一塊兒使用。此參數指定在bss節中符號的所需對齊方式。
.lcomm的語法在HPPA上稍有不一樣。語法是'symbol .lcomm, length';符號是可選的。
.lflags
as接受此指令,以便與其餘彙編器兼容,但忽略它。
.line line-number
更改邏輯行號。行號必須是絕對錶達式。下一行具備該邏輯行號。所以, 當前行上的任何其餘語句(在語句分隔符字符以後)都將報告爲邏輯行號:行號-1。某一天as可能再也不支持此指令:它僅能與現有的彙編器兼容。
儘管這是一個與a.out或b.out對象-代碼格式無關的指令,但as在製做COFF輸出時仍能識別它,且將COFF的'ln'視爲'.line',即便它在.def/.endef以外。
而在.def中,".line"是編譯器用來生成用於調試的輔助符號信息的指令之一。
linkonce [type]
標記當前節,以便連接器僅包含它的單個副本。這可能用於在多個不一樣的對象文件中包含同一節,但要確保連接器只在最終輸出文件中包含一次。linkonce僞運算必須用於該節的每一個實例。根據節名檢測到重複節,所以它應該是惟一的。
此指令僅受少數對象文件格式的支持。在這篇文章中,惟一支持它的對象文件格式是Windows NT上使用的可移植可執行格式。
類型參數是可選的。若是指定,它必須是下列字符串之一。例如:
.linkonce same_size
並不是全部對象文件格式均可以支持全部類型。
discard
默默丟棄重複的部分。這是默認值。
one_only
警告若是有重複的節, 但仍然只保留一個副本。
same_size
若是任何重複項有不一樣的大小, 則發出警告。
same_contents
若是任何重複項沒有徹底相同的內容, 則發出警告。
.list
控制(與.nolist指令一塊兒使用)是否生成彙編清單。這兩個指令維護一個內部計數器(最初爲零)。.list遞增計數器,而後.nolist遞減。每當計數器大於零時,都會生成彙編列表。
默認狀況下,列表被禁用。當您啓用它們時(使用"-a"命令行選項;請參見命令行選項),列表計數器的初始值爲一。
.ln line-number
'.ln'是'.line'的同義詞。
.loc fileno lineno [column] [options]
當發出DWARF2行號信息時,.loc指令將向.debug_line行號矩陣中添加一行,對應於緊跟在彙編指令後面的。在添加行以前,fileno、lineno和可選列參數將應用於.debug_line狀態機。
這些選項是按任意順序排列的如下標記:
basic_block
此選項會將.debug_line狀態機中的basic_block寄存器設置爲true。
prologue_end
此選項會將.debug_line狀態機中的prologue_end寄存器設置爲true。
epilogue_begin
此選項會將.debug_line狀態機中的epilogue_begin寄存器設置爲true。
is_stmt value
此選項會將.debug_line狀態機中的is_stmt寄存器設置爲值,必須爲0或1。
isa value
此指令會將.debug_line狀態機中的isa寄存器設置爲值,它必須是無符號整數。
discriminator value
此指令會將.debug_line狀態機中的鑑別器寄存器設置爲值,它必須是無符號整數。
view value
此選項致使將行添加到.debug_line中,以引用當前地址(可能與下面的彙編指令不相同),並將值與.debug_line狀態機中的視圖寄存器關聯。若是值是標籤,則視圖寄存器和標籤都設置爲在同一程序位置上的前.loc指令的數量。若是值爲字面0,則視圖寄存器設置爲零,而彙編程序斷言在同一應用程序位置沒有任何之前的.loc指令。若是值爲字面-0,則彙編程序會安排在此行中重置視圖寄存器,即便在同一程式位置有前.loc指令。
.loc_mark_labels enable
在發出DWARF2行號信息時,.loc_mark_labels指令使彙編程序在出現代碼標籤時使用狀態機集中的basic_block寄存器向.debug_line行號矩陣發出一個條目。啓用參數應爲1或0,以便分別啓用或禁用此函數。
.local names
此指令可用於ELF目標,將以逗號分隔的名稱列表中的每一個符號標記爲本地符號,以使其不會在外部可見。若是符號不存在,將建立它們。
對於lcomm指令(參見lcomm)不接受對齊參數的目標,對於大多數ELF目標來講,.local指令能夠與.comm(參見comm)結合使用來定義對齊的本地通用數據。
.long expressions
.long等同於'.int'。參見.int。
.macro
.macro MACRO_NAME PARAM1, PARAM2
.exitm
.endm
.mri val
若是val是非零,這就告訴進入MRI模式。若是val爲零,則說明退出MRI模式。此更改將影響彙編到下一.mri指令的代碼,或直到文件的末尾。參見MRI模式。
.noaltmacro
禁用備用宏模式。見altmacro。
.nolist
控制(與.nolist指令一塊兒使用)是否生成彙編清單。這兩個指令維護一個內部計數器(最初爲零)。.list遞增計數器,而後.nolist遞減。每當計數器大於零時,都會生成彙編列表。
.nops size[, control]
此指令發出填充無操做指令的size字節。size是絕對錶達式,它必須是正值。control控制如何生成無操做指令。若是省略逗號和control,則假定控件爲零。
注意:對於Intel 80386和AMD x86-64目標,control指定無操做指令的大小限制。控制的有效值在16位模式下介於0和4之間,在32位模式下調整爲較舊的處理器時爲0到7之間,在64位模式下調整爲0到11之間,或者在32位調整爲較新的處理器時模式。使用0時,無操做指令大小限制設置爲支持的最大大小。
.octa bignums
該指令須要零個或多個bignums,以逗號分隔。對於每一個bignum,它發出一個16字節的整數。
術語"octa"來自上下文,其中"word"是兩個字節; 所以octa-word爲16個字節。
.offset loc
將位置計數器設置爲絕對部分中的loc。loc必須是絕對錶達式。該指令可用於定義具備絕對值的符號。不要將它與.org指令混淆。
.org new-lc , fill
將當前節的位置計數器前進到new-lc。new-lc是絕對錶達式或與當前子節具備相同部分的表達式。也就是說,你不能使用.org橫截面:若是new-lc有錯誤的節,.org則忽略該指令。爲了與之前的彙編器兼容,若是new-lc的節是絕對的,as發出警告,而後僞裝new-lc的部分與當前子節相同。
.org可能只會增長位置計數器,或保持不變; 你不能用來.org向後移動位置計數器。
由於as嘗試在一次傳遞中彙編程序,因此new-lc可能不是未定義的。若是你真的討厭這個限制,咱們熱切期待有機會分享你改進的彙編器。
請注意,原點是相對於該節的開頭,而不是該節的開頭。這與其餘人的彙編器兼容。
當(當前子節的)位置計數器被提早時,插入的字節用填充填充,填充應該是絕對錶達式。若是省略逗號和填充,則填充默認值爲零。
.p2align[wl] abs-expr, abs-expr, abs-expr
將位置計數器(在當前子節中)填充到特定存儲邊界。第一個表達式(必須是絕對的)是位置計數器在前進後必須具備的低位零位數。例如'.p2align 3'使位置計數器前進,直到它爲8的倍數。若是位置計數器已是8的倍數,則不須要進行任何更改。
第二個表達式(也是絕對的)給出填充值存儲在填充字節中。它(和逗號)能夠省略。若是省略,則填充字節一般爲零。可是,在大多數系統上,若是該部分被標記爲包含代碼而且省略了填充值,則該空間將填充無操做指令。
第三個表達式也是絕對的,也是可選的。若是存在,則是此對齊指令應跳過的最大字節數。若是進行對齊將須要跳過比指定的最大值更多的字節,則根本不進行對齊。您能夠徹底省略填充值(第二個參數),只需在所需的對齊後使用兩個逗號; 若是您但願在適當的時候使用無操做指令填充對齊,這可能頗有用。
在.p2alignw和.p2alignl指令是變體的 .p2align指令。該.p2alignw指令將填充模式視爲雙字節字值。該.p2alignl指令把填充圖案爲四個字節長字值。例如,.p2alignw 2,0x368d將對齊到4的倍數。若是它跳過兩個字節,它們將填入值0x368d(字節的確切位置取決於處理器的字節順序)。若是它跳過1或3個字節,則填充值未定義。
.popsection
這是ELF節堆棧操做指令之一。其餘的是 .section(參見section),.subsection(參見subsection),.pushsection(參見pushsection)和.previous(參見previous)。
該指令用截面堆棧上的頂部(和子節)替換當前部分(和子節)。此節從堆棧中彈出。
.print string
as將在彙編期間在標準輸出上打印字符串。您必須將字符串放在雙引號中。
.protected names
這是ELF可見性指令之一。另外兩個是.hidden(見hidden)和.internal(見internal)。
該指令覆蓋命名符號的默承認見性(由其綁定設置:local,global或weak)。該指令設置可見性爲protected,這意味着必須將定義它們的組件中對符號的任何引用解析爲該組件中的定義,即便另外一個組件中的定義一般會搶佔它。
.psize lines, columns
在生成列表時,使用此僞指令聲明每一個頁面使用的行數和(可選)列數。
若是您不使用.psize,列表使用默認行數60。您能夠省略逗號和列規範;默認寬度爲200列。
as每當超過指定的行數時(或者在您明確請求一行時使用.eject),都會生成換頁。
若是將行指定爲0,則不會生成formfeeds,從而保存顯式指定的.eject。
.purgem name
取消定義宏名稱,以便之後使用該字符串不會被擴展。參見宏。
.pushsection name [, subsection] [, "flags"[, @type[,arguments]]]
這是ELF部分堆棧操做指令之一。其餘的是.section(參見section),.subsection(參見subsection),.popsection(參見popsection)和.previous (參見previous)。
此指令將當前section(和subsection)推送到節堆棧的頂部,而後用name和subsection替換當前節和小節。可選flags、type和arguments的處理方式與.section(參見節)指令中的相同。
.quad bignums
.quad指望零或更多的bignums,用逗號分隔。對於每一個bignum,它發出一個8字節的整數。若是bignum不適合8個字節,它會輸出一條警告信息; 而且只取最低8字節的bignum。
術語"quad"來自上下文,其中"word"是兩個字節;所以quad-word爲8個字節。
.reloc offset, reloc_name[, expression]
使用值表達式在reloc_name類型的偏移量處生成重定位。若是offset是數字,則在當前節中生成重定位。若是offset是一個解析爲符號加偏移量的表達式,則會在給定符號的節中生成重定位。表達式(若是存在)必須解析爲符號加上加數或絕對值,但請注意,並不是全部目標都支持加數。例如,諸如i386之類的ELF REL目標在節內容中存儲加數而不是在重定位中。此低級別接口不支持存儲在該節中的加數。
.rept count
重複.rept指令和下一個.endr指令計數次數之間的行序列。
舉例說明,彙編:
.rept 3
.long 0
.endr
至關於彙編:
.long 0
.long 0
.long 0
容許計數爲零,但不生成任何內容。不容許使用負數,若是遇到則將其視爲零。
.sbttl "subheading"
生成彙編列表時,使用subheading做爲標題(第三行,緊接標題行以後)。
此指令會影響後續頁,若是它出如今頁頂部的十行內,則會影響當前頁。
.scl class
設置符號的存儲類值。該指令只能在.def/.endef中使用。存儲類能夠標記符號是靜態的仍是外部的,或者它能夠記錄進一步的符號調試信息。
.section name
使用該.section指令將下面的代碼彙編到名爲name的節中。
該指令僅支持實際支持任意命名節的目標;例如,在a.out目標上,即便使用標準的a.out節名,也不接受它。
.set symbol, expression
將symbol的值設置爲expression。這會更改符號的值和類型以符合表達式。若是symbol被標記爲外部,則它仍然被標記(參見符號屬性)。
若是.set給予符號的值是常量,則能夠在同一程序集中屢次使用符號。容許使用基於涉及其餘符號的表達式的值,但某些目標可能會將此限制爲僅在每一個程序集中執行一次。這是由於這些目標在彙編時不設置符號的地址,而是延遲賦值,直到執行最終連接。這容許連接器有機會改變文件中的代碼,改變各類不一樣符號的位置和相對距離。
若是.set是全局符號,則存儲在目標文件中的值是存儲在其中的最後一個值。
在Z80上set是一個真正的指令,使用'symbol defl expression'替代。
.short expressions
.short一般與"word"相同。參見.word。
在一些配置中,.short和.word產生不一樣長度的數字。參見機器依賴性。
.single flonums
該指令彙編零個或多個flonums,以逗號分隔。它和.float具備相同的效果。發出的確切浮點數取決於as的配置方式。參見機器依賴性。
.size
該指令用於設置與符號關聯的大小。
COFF版本
對於COFF目標,該.size指令僅容許出如今.def/.endef中。使用方法以下:
.size expression
ELF版本
對於ELF目標,.size指令使用方法以下:
.size name, expression
該指令設置與符號名稱關聯的大小。以字節爲單位的大小是根據表達式計算的,該表達式可使用標籤算法。該指令一般用於設置函數符號的大小。
.skip size [,fill]
該指令發出size個字節,每一個值都fill。size和fill都是絕對錶達式。若是省略逗號和fill,則假定填充爲零。這和'space'相同。
.sleb128 expressions
sleb128表明"signed little endian base 128"。這是DWARF符號調試格式使用的可變長度表示的數字縮寫。參見.uleb128。
.space size [,fill]
該指令發出size字節,每一個值都fill。size和fill是絕對錶達式。若是省略逗號和填充,則假定填充爲零。這與'skip'相同。
警告:.space對於HPPA目標具備徹底不一樣的含義;請使用.block做爲替代。有關該指令的含義,請參閱"HP9000系列800彙編語言參考手冊(HP 92432-90001)"中.space的含義。有關摘要,參見HPPA彙編器指令。
.stabd, .stabn, .stabs
有三個指令開始'.stab」。全部發出符號(參見符號),供符號調試器使用。這些符號不會輸入到as哈希表中:它們不能在源文件的其餘位置引用。最多須要五個字段:
string
這是符號的名稱。它可能包含任何字符,除了'\000',比普通的符號名稱更通用。一些調試器用於使用該字段將任意複雜的結構編碼爲符號名稱。
type
一個絕對錶達式。符號的類型設置爲此表達式的低8位。容許任何位模式,但ld調試器會愚蠢的位模式。
other
一個絕對錶達式。符號的"other"屬性設置爲此表達式的低8位。
desc
一個絕對錶達式。符號的描述符設置爲此表達式的低16位。
value
絕對錶達式,它成爲符號的值。
若是讀取被檢測到警告.stabd,.stabn或.stabs聲明,該符號有可能已經被建立;你在目標文件中獲得一個半成形的符號。這與早期的彙編器兼容!
.stabd type, other, desc
生成的符號的"name"甚至不是空字符串。它是一個空指針,爲了兼容性起見。較老的彙編器使用空指針,所以它們不會在具備空字符串的目標文件中浪費空間。
符號的值設置爲位置計數器,可從新定位。程序連接時,此符號的值.stabd是彙編時位置計數器的地址。
.stabn type, other, desc, value
符號的名稱設置爲空字符串""。
.stabs string, type, other, desc, value
指定了全部五個字段。
.string "str",.string8 "str",.string16
"str",.string32 "str",.string64 "str"
將str中的字符複製到目標文件中。您能夠指定要複製的多個字符串,以逗號分隔。除非爲特定機器另行指定,不然彙編器用0字節標記每一個字符串的結尾。您可使用字符串中描述的任何轉義序列。
變體string16,string32和string64從不一樣string在於從每一個8位字符的僞碼str被複制並分別擴展到16位,32位或64位。擴展字符以目標字節序字節順序存儲。
例如:
.string32「BYE」
擴展爲:
.string "B\0\0\0Y\0\0\0E\0\0\0" /*在小端目標上。*/
.string "\0\0\0B\0\0\0Y\0\0\0E" /*在大端目標上。*/
.struct expression
切換到絕對節,並將section offset設置爲expression,它必須是絕對錶達式。您可使用以下:
.struct 0
field1:
.struct field1 + 4
field2:
.struct field2 + 4
field3:
這將定義符號field1的值爲0,符號field2的值爲4,符號field3的值爲8。彙編將保留在絕對節中,您須要使用.section某種類型的指令來更改在進一步彙編以前到其餘節。
.subsection name
這是ELF部分堆棧操做指令之一。其餘的.section(參見section),.pushsection(參見pushsection),.popsection(參見popsection)和.previous(參見previous)。
該指令用name替換當前subsection。當前節未更改。將替換的子節放在節堆棧上代替當前堆棧子節。
.symver
使用該.symver指令將符號綁定到源文件中的特定版本節點。這僅在ELF平臺上受支持,一般在彙編要連接到共享庫的文件時使用。在某些狀況下,在對象中使用它來綁定到應用程序自己以便從共享庫中覆蓋版本化符號多是有意義的。
對於ELF目標,該.symver指令能夠像這樣使用:
.symver name,name2@nodename
若是符號名稱是在正在彙編的文件中定義的,則該.symver指令有效地建立了一個名稱爲name2@nodename的符號別名,實際上咱們不嘗試建立常規別名的主要緣由是@字符是不容許使用符號名稱。的NAME2名稱的一部分是經過其將要外部引用符號的實際名稱。這個名字的名字 自己只是爲了方便被使用,所以,它可能有一個源文件中的一個函數的多個版本定義,這樣編譯器能夠明確地知道被說起的一個函數的版本的名稱。該節點名稱別名的一部分應該是在構建共享庫時提供給連接器的版本腳本中指定的節點的名稱。若是您嘗試從共享庫中覆蓋版本化符號,則nodename應對應於您嘗試覆蓋的符號的節點名。
若是未在正在彙編的文件中定義符號名稱,則對name的全部引用都將更改成name2@nodename。若是未對name進行引用,則將從符號表中刪除name2@nodename。
該.symver指令的另外一個用法是:
.symver name,name2 @@ nodename
在這種狀況下,符號名稱必須存在並在正在彙編的文件中定義。它相似於name2@nodename。區別在於name2@@nodename也將用於解析連接器對name2的引用。
該.symver指令的第三種用法是:
.symver name,name2@@@nodename
若是未在正在彙編的文件中定義name,則將其視爲name2@nodename。當name被該文件被彙編內定義,符號名稱,name,將改成name2@@nodename。
.tag structname
該指令由編譯器生成,以在符號表中包含輔助調試信息。它只容許在.def/.endef中出現。標籤用於將符號表中的結構定義與這些結構的實例相連接。
.text subsection
告知as將如下語句彙總到文本小節編號subsection的末尾,這是一個絕對錶達式。若是subsection被省略,則subsection數字零被使用。
title "heading"
生成彙編列表時,使用heading做爲標題(第二行,緊跟源文件名和頁號以後)。
此指令會影響後續頁,若是它出如今頁面頂部的十行內,則會影響當前頁。
.type
該指令用於設置符號的類型。
COFF版本
對於COFF目標,此指令僅容許出如今.def/.endef中。它使用以下:
.type int
這會將整數int記錄爲符號表條目的type屬性。
ELF版本
對於ELF目標,該.type指令使用以下:
.type name, type description
這將符號名稱的類型設置爲函數符號或對象符號。type description字段支持五種不一樣的語法,以便提供與各類其餘彙編器的兼容性。
由於這些語法中使用了一些字符(例如'@'和'#')是某些體系結構的註釋字符,下面的一些語法不適用於全部體系結構。GNU彙編程序將在全部體系結構上接受第一個變體,所以若是您不須要將代碼與其餘彙編程序彙編,則應使用變量以實現最大的可移植性。
支持的語法是:
.type <name> STT_ <TYPE_IN_UPPER_CASE>
.type <name>,#<type>
.type <name>,@ <type>
.type <name>,%<type>
.type <name>,「<type>」
支持的類型有:
STT_FUNC
function
將符號標記爲函數名稱。
STT_GNU_IFUNC
gnu_indirect_function
在重定位處理期間評估時,將符號標記爲間接函數(這僅適用於面向GNU系統的彙編程序)。
STT_OBJECT
object
將符號標記爲數據對象。
STT_TLS
tls_object
將符號標記爲線程局部數據對象。
STT_COMMON
common
將符號標記爲公共數據對象。
STT_NOTYPE
notype
不以任何方式標記符號。它只是爲了完整性而受到支持。
gnu_unique_object
將符號標記爲全局惟一數據對象。動態連接器將確保在整個過程當中只有一個符號使用此名稱和類型。(這僅適用於面向GNU系統的彙編程序)。
注意:除了上面列出的類型以外,某些目標還支持其餘類型。
.uleb128 expressions
uleb128表明"unsigned little endian base 128"。這是DWARF符號調試格式使用的可變長度表示數字的縮寫。參見.sleb128。
.val addr
該指令僅出如今.def/.endef中,它將地址addr記錄爲符號表條目的value屬性。
.version "string"
該指令建立一個.note節,並在其中放置一個類型爲NT_VERSION的ELF格式的註釋。備註的名稱設置爲string。
.vtable_entry table, offset
此指令查找或建立一個符號表,併爲其建立一個VTABLE_ENTRY從新定位,其offset爲加數。
.vtable_inherit child, parent
此指令查找符號子項並查找或建立符號父級,而後爲其加數爲子符號值的父級建立VTABLE_INHERIT從新定位。做爲特殊狀況,0的父名稱被視爲指向*ABS*節。
.warning "string"
相似於指令.error(參見.error "string"),但只發出警告。
.weak names
此指令設置符號names的逗號分隔列表中的weak屬性。若是符號不存在,將建立它們。
在非PE的COFF目標上,weak符號是GNU擴展。此指令設置符號names的逗號分隔列表中的weak屬性。若是符號不存在,將建立它們。
在PE目標上,weak符號本地支持爲weak別名。當建立的weak符號不是別名時,GAS會建立一個備用符號來保存默認值。
.weakref alias, target
該指令爲目標符號建立一個別名,該別名使符號可以以weak符號語義引用,但實際上不會使其變weak。若是存在符號的直接引用或定義,則符號不會weak,但若是對它的全部引用都是經過weak引用,則符號表中的符號將被標記爲weak。
效果至關於將對別名的全部引用移動到單獨的彙編源文件,將別名重命名爲其中的符號,在那裏將符號聲明爲weak,並運行可從新加載的連接以合併由組件生成的對象文件新源文件和刪除了別名引用的舊源文件。
別名自己永遠不會對符號表進行處理,而且徹底在彙編器中處理。
.word expressions
該指令要求使用逗號分隔的任何節的零個或多個表達式。
發出的數字的大小及其字節順序取決於彙編所針對的目標計算機。
警告:支持編譯器的特殊處理
具備32位地址空間但小於32位尋址的機器須要如下特殊處理。若是您感興趣的計算機執行32位尋址(或不須要它;參見計算機依賴性),則能夠忽略此問題。
爲了將編譯器輸出彙編到工做中,偶爾會對".word"指令進行一些奇怪的操做。表單".word sym1-sym2" 的指令一般由編譯器做爲跳轉表的一部分發出。所以, 當將表單的指令彙編爲".word sym1-sym2" 時,sym1和sym2之間的差別不適合16位, 如在下一個標籤以前建立一個輔助跳轉表。這次跳轉表前面有一個短跳轉到輔助表後的第一個字節。這種短跳轉防止控制流意外落入新表中。在表裏面是一個跳遠到sym2。原來的".word"包含sym1減去長跳轉到sym2的地址。
若是在第二個跳轉表以前出現了幾個".word sym1-sym2",則全部這些事件都被調整。若是有一個'.word sym3-sym4',這也不適合十六位,一個跳遠到sym4是包括在次跳轉表中,和.word指令調整爲包含sym3減去長跳轉到sym4的地址;還有,對於在原始跳轉表中的許多條目是必要的。
.zero size
此指令發出size爲0值的字節。size必須是絕對錶達式。此指令其實是".skip"指令的別名, 所以在能夠將值的可選第二個參數存儲在字節而不是零中。然而,用這種方式使用"零"會讓人迷惑。
.2byte expression [, expression]*
此指令指望零個或多個表達式,用逗號分隔。若是沒有表達式,則指令不進行任何運算。不然,使用目標的字節序模型依次計算每一個表達式並將其置於當前輸出節的下一個兩個字節內。若是表達式不能容納兩個字節,則會顯示一條警告消息,並使用表達式值的最不重要的兩個字節。若是沒法在程序集時間計算表達式,則將生成遷移,以便在連接時間計算值。
此指令在插入值以前或以後不該用任何對齊方式。所以,若是生成了遷移,則它們可能與用於以保證對齊方式插入值的方法不一樣。
此指令僅適用於ELF目標。
.4byte expression [, expression]*
就像.2byte指令,除了它將未對齊的四字節長值插入輸出。
.8byte expression [, expression]*
就像.2byte指令,除了它將未對齊的八字節長值插入輸出。
AArch64機器指令
.arch name
選擇目標體系結構。name的有效值對於-march 命令行選項是相同的。
指定.arch清除之前選擇的任何體系結構擴展。
.arch_extension name
在目標體系結構中添加或刪除體系結構擴展。name的有效值與做爲體系結構擴展接受的值相同-mcpu命令行選項。
.arch_extension 能夠屢次使用,以遞增方式向正在編譯的體系結構添加或刪除擴展。
.bss
該指令切換到該.bss部分。
.cpu name
設置目標處理器。name的有效值與接受的值相同-mcpu=命令行選項。
.dword expressions
該.dword指令產生64位值。
.even
該.even指令在下一個偶數字節邊界上對齊輸出。
.inst expressions
將表達式插入輸出中,就好像它們是指令而不是數據同樣。
.ltorg
此僞指令使文本池的當前內容轉儲到當前位置(假定爲.text節)的當前位置(與字邊界對齊)。GAS爲每一個部分和每一個子部分維護一個單獨的文字池。該.ltorg指令僅影響當前節和子節的文字池。在彙編結束時,將自動轉儲全部剩餘的非空文字池。
注意:舊版本的GAS會在發生部分更改時轉儲當前文字池。這已再也不有用,由於它阻止了對文字池放置的準確控制。
.pool
這是.ltorg的同義詞。
name .req register name
這會爲名爲name的寄存器名稱建立別名。例如:
foo .req w0
ip0,ip1,lr和fp分別自動定義爲X16,X17,X30和X29的別名。
.tlsdescadd
在下一條指令上發出TLSDESC_ADD reloc。
.tlsdesccall
在下一條指令上發出TLSDESC_CALL reloc。
.tlsdescldr
在下一條指令上發出TLSDESC_LDR reloc。
.unreq alias-name
這取決於先前使用該req指令定義的寄存器別名。例如:
foo .req w0
.unreq foo
若是名稱未定義,則會發生錯誤。注意:此僞操做可用於刪除寄存器名稱別名中的內置(例如'w0')。只有在真的有必要時才應該這樣作。
.xword expressions
該.xword指令產生64位值。這與.dword指令相同。
Alpha彙編器指令
as由於Alpha支持許多其餘指令以與本機彙編程序兼容。本節僅簡要介紹它們。
這些是asAlpha 的附加指令:
.arch cpu
指定目標處理器。這至關於-mcpu命令行選項。有關cpu的值列表,參見選項。
.ent function[, n]
標記功能的開頭。爲了與OSF/1彙編程序兼容,可使用可選數字,但會被忽略。生成.mdebug信息時,這將爲該函數建立一個過程描述符。在ELF中,它將符號標記爲泛型.type指令的函數a-la 。
.end function
標記功能的結束。在ELF中,它將設置符號a-la的大小爲泛型.size指令。
.mask mask, offset
指示哪一個整數寄存器保存在當前函數的堆棧幀中。 掩碼被解釋爲位掩碼,其中位n設置表示寄存器n被保存。寄存器保存在一個塊中,該塊位於規範幀地址(CFA)的偏移字節中,該地址是進入函數時的堆棧指針的值。除了$26首先保存返回地址寄存器(正常)外,寄存器按順序保存。
這個和描述堆棧幀的其餘指令目前僅在生成.mdebug信息時使用。它們未來可能用於生成.debug_frame手寫彙編的DWARF2 展開信息。
.fmask mask, offset
指示哪些浮點寄存器保存在當前堆棧幀中。該掩模和偏移參數被解釋爲與.mask。
.frame framereg, frameoffset, retreg[, argoffset]
描述堆棧框架的形狀。使用的幀指針是framereg;一般這是$fp或$sp。幀指針是CFA下面的幀偏移字節。返回地址最初位於retreg中,直到按照指示保存爲止.mask。爲了與OSF/1兼容,接受並忽略可選的 argoffset參數。它被認爲表示從CFA到保存的參數寄存器的偏移。
.prologue n
指示堆棧幀已設置且全部寄存器已溢出。參數n表示函數是否以及如何使用傳入過程向量(被調用函數的地址)$27。0表示$27未使用; 1表示該函數的前兩個指令$27 用於執行GP寄存器的加載; 2表示$27以某種非標準方式使用,所以連接器在放鬆期間不能忽略過程向量的負載。
.usepv function, which
用於表示$27寄存器的使用,相似於.prologue,但沒有須要在open .ent/.end塊中的其餘語義。
在該參數應該是no,表示 $27不使用,或者std,表示該函數的前兩個指令執行GP負載。
.prologue若是您還使用dwarf2 CFI指令,則可使用此指令。
.gprel32 expression
計算表達式中的地址與當前目標文件的GP之間的差別,並將其存儲爲4個字節。除了小於完整的8字節地址外,在共享庫中使用時,這也不須要動態重定位。
.t_floating expression
將表達式存儲爲IEEE雙精度值。
.s_floating expression
將表達式存儲爲IEEE單精度值。
.f_floating expression
將表達式存儲爲VAX F格式值。
.g_floating expression
將表達式存儲爲VAX G格式值。
.d_floating expression
將表達式存儲爲VAX D格式值。
.set feature
啓用或禁用各類彙編程序功能。使用該功能的正面名稱能夠在使用時啓用'nofeature'禁用。
at
表示宏擴展可能破壞彙編程序臨時($at或$28)寄存器。若是沒有這個,某些宏可能沒法展開,若是noat生效則會生成錯誤消息。當at有效時,若是將產生一個警告$at,使用由程序員。
macro
啓用宏指令的擴展。請注意,實際指令的變體(例如br labelvs)br $31,label被視爲替代形式而非宏。
move
reorder
volatile
它們控制彙編程序是否以及如何從新排序指令。接受與OSF/1彙編程序的兼容性,但as不執行指令調度,所以忽略這些功能。
如下指令是爲了與OSF / 1彙編程序兼容而被識別,但會被忽略。
.proc .aproc
.reguse .livereg
.option .aent
.ugen .eflag
.alias .noalias
ARM機器指令
.align expression [, expression]
這是通用的.align指令。可是對於ARM,若是第一個參數爲零(即不須要對齊),彙編器的行爲就好像參數爲2(即填充到下一個四字節邊界)。這是爲了與ARM本身的彙編程序兼容。
.arch name
選擇目標體系結構。name的有效值與。的有效值相同-遊行 命令行選項。
指定.arch清除之前選擇的任何體系結構擴展。
.arch_extension name
在目標體系結構中添加或刪除體系結構擴展。name的有效值與做爲體系結構擴展接受的值相同-mcpu和 -march 命令行選項。
.arch_extension能夠屢次使用,以遞增方式向正在編譯的體系結構添加或刪除擴展。
.arm
這與.code 32執行相同的操做。
.bss
該指令切換到該.bss部分。
.cantunwind
防止經過當前函數展開。不須要或不容許個性例程或異常表數據。
.code [16|32]
該指令選擇正在生成的指令集。值16選擇Thumb,值32選擇ARM。
.cpu name
選擇目標處理器。name的有效值等同於-mcpu命令行選項。
指定.cpu清除之前選擇的任何體系結構擴展。
name .dn register name [.type] [[index]]
name .qn register name [.type] [[index]]
在dn和qn指令用於建立類型化和/或用於高級SIMD擴展(Neon)指令使用索引寄存器的別名。前者應該用於建立雙精度寄存器的別名,後者用於建立四精度寄存器的別名。
若是這些指令用於建立類型化別名,則能夠在Neon指令中使用這些別名,而不是在助記符以後或每一個操做數以後寫入類型。例如:
x .dn d2.f32
y .dn d3.f32
z .dn d4.f32 [1]
vmul x,y,z
這至關於編寫如下內容:
vmul.f32 d2,d3,d4 [1]
使用dn或qn建立的別名可使用unreq銷燬。
.eabi_attribute tag, value
將EABI對象屬性標記設置爲value。
該標籤或者是一個屬性編號,或下列之一:Tag_CPU_raw_name,Tag_CPU_name,Tag_CPU_arch, Tag_CPU_arch_profile,Tag_ARM_ISA_use, Tag_THUMB_ISA_use,Tag_FP_arch,Tag_WMMX_arch, Tag_Advanced_SIMD_arch,Tag_PCS_config, Tag_ABI_PCS_R9_use,Tag_ABI_PCS_RW_data, Tag_ABI_PCS_RO_data,Tag_ABI_PCS_GOT_use, Tag_ABI_PCS_wchar_t,Tag_ABI_FP_rounding, Tag_ABI_FP_denormal,Tag_ABI_FP_exceptions, Tag_ABI_FP_user_exceptions,Tag_ABI_FP_number_model, Tag_ABI_align_needed,Tag_ABI_align_preserved, Tag_ABI_enum_size,Tag_ABI_HardFP_use, Tag_ABI_VFP_args,Tag_ABI_WMMX_args, Tag_ABI_optimization_goals,Tag_ABI_FP_optimization_goals, Tag_compatibility,Tag_CPU_unaligned_access, Tag_FP_HP_extension,Tag_ABI_FP_16bit_format, Tag_MPextension_use,Tag_DIV_use, Tag_nodefaults,Tag_also_compatible_with, Tag_conformance,Tag_T2EE_use, Tag_Virtualization_use
該值能夠是一個number,"string"或 number, "string"根據標記。
注意:如下舊式值也能夠被tag接受:Tag_VFP_arch,Tag_ABI_align8_needed, Tag_ABI_align8_preserved,Tag_VFP_HP_extension,
.even
該指令與偶數地址對齊。
.extend expression [, expression]*
.ldouble expression [, expression]*
這些指令將12byte長的雙浮點值寫入輸出節。這些與當前的ARM處理器或ABI不兼容。
.fnend
使用展開表條目標記函數的結尾。處理此指令時會建立展開索引表條目。
若是未指定個性例程,則將使用標準個性例程0或1,具體取決於所需的展開操做碼的數量。
.fnstart
使用展開表條目標記函數的開頭。
.force_thumb
即便目標處理器不支持這些指令,該指令也會強制選擇Thumb指令
.fpu name
選擇要彙編的浮點單元。name的有效值等同於-mfpu命令行選項。
.handlerdata
標記當前函數的結尾,以及該函數的異常表條目的開頭。此指令和.fnend指令之間的任何內容都將添加到異常表條目中。
必須以.personality或.personalityindex指令開頭。
.inst opcode [ , … ]
.inst.n opcode [ , … ]
.inst.w opcode [ , … ]
生成與數值操做碼對應的指令。.inst.n和.inst.w容許顯式指定Thumb指令大小,覆蓋正常的編碼規則。
.ldouble expression [, expression]*
參見.extend。
.ltorg
此僞指令使文本池的當前內容轉儲到當前位置(假定爲.text節)的當前位置(與字邊界對齊)。GAS爲每一個部分和每一個子部分維護一個單獨的文字池。該.ltorg指令僅影響當前節和子節的文字池。在彙編結束時,將自動轉儲全部剩餘的非空文字池。
注意:舊版本的版本GAS會在發生部分更改時轉儲當前文字池。這已再也不用,由於它阻止了對文字池放置的準確控制。
.movsp reg [, #offset]
告訴unwinder,reg包含當前堆棧指針的偏移量。若是未指定offset,則假定爲零。
.object_arch name
覆蓋EABI對象屬性部分中記錄的體系結構。name的有效值與.arch指令的有效值相同。一般,當代碼使用CPU功能的運行時檢測時,這很是有用。
.packed expression [, expression]*
該指令將12字節壓縮浮點值寫入輸出節。這些與當前的ARM處理器或ABI不兼容。
.pad #count
爲計數字節的堆棧調整生成退繞註釋。正值表示函數序言經過遞減堆棧指針來分配堆棧空間。
.personality name
將當前函數的個性例程設置爲name。
.personalityindex index
將當前函數的個性例程設置爲EABI標準例程編號索引
.pool
這是.ltorg的同義詞。
name .req register name
這會爲名爲name的寄存器名稱建立別名。例如:
foo .req r0
.save reglist
生成退繞註釋以恢復reglist中的寄存器。reglist的格式與相應的store-multiple指令相同。
核心寄存器
.save {r4,r5,r6,lr}
stmfd sp!,{r4,r5,r6,lr}
FPA寄存器
.save f4,2
sfmfd f4,2,[sp]!
VFP寄存器
.save {d8,d9,d10}
fstmdx sp!,{d8,d9,d10}
iWMMXt寄存器
.save {wr10,wr11}
wstrd wr11,[sp,# - 8]!
wstrd wr10,[sp,# - 8]!
或者
.save wr11
wstrd wr11,[sp,# - 8]!
.save wr10
wstrd wr10,[sp,# - 8]!
.setfp fpreg, spreg [, #offset]
相對於幀指針進行全部開卷註釋。若是沒有這個,unwinder將使用堆棧指針的偏移量。
此指令的語法與用於設置框架指針的添加或移動指令相同。spreg必須是sp或前面的.movsp指令中提到的。
.movsp ip
mov ip,sp
...
.setfp fp,ip,#4
add fp,ip,#4
.secrel32 expression [, expression]*
該指令發出重定位,計算每一個表達式符號的節相對偏移量。該指令僅支持PE目標。
.syntax [unified | divided]
該指令設置指令集語法,如ARM-Instruction-Set節所述。
.thumb
這與.code 16執行相同的操做。
.thumb_func
該指令指定如下符號是Thumb編碼函數的名稱。此信息是必要的,以便容許彙編器和連接器爲ARM和Thumb指令之間的互通生成正確的代碼,而且即便不執行交互操做也應該使用該信息。該指令的存在也意味着.thumb。
生成EABI對象時不須要此指令。在這些目標上,生成Thumb代碼時隱式編碼。
.thumb_set
這執行等效的.set指令,由於它建立了一個符號,該符號是另外一個符號的別名(可能還沒有定義)。該指令還具備添加的屬性,由於它將別名符號標記爲拇指函數入口點,與.thumb_func指令的方式相同。
.tlsdescseq tls-variable
該指令用於註釋內聯TLS描述符trampoline的部份內容。一般,蹦牀是由連接器提供的,不須要該指令。
.unreq alias-name
此取消定義這是之前使用所定義的寄存器別名 req,dn或qn指令。例如:
foo .req r0
.unreq foo
若是名稱未定義,則會發生錯誤。注意:此僞操做可用於刪除寄存器名稱別名中的內置(例如'r0')。只有在真的有必要時才應該這樣作。
.unwind_raw offset, byte1, …
插入一個或多個任意展開操做碼字節,已知這些字節可經過偏移字節調整堆棧指針。
例如.unwind_raw 4, 0xb1, 0x01至關於.save {r0}
.vsave vfp-reglist
使用FLDMD生成unwinder註釋以恢復vfp-reglist中的VFP寄存器。也適用於要使用VLDM恢復的VFPv3寄存器。vfp-reglist的格式與相應的store-multiple指令相同。
VFP寄存器
.vsave {d8,d9,d10}
fstmdd sp!,{d8,d9,d10}
VFPv3寄存器
.vsave {d15,d16,d17}
vstm sp!,{d15,d16,d17}
因爲如今不推薦使用FLDMX和FSTMX,所以應該使用該指令來支持.save爲ARMv6及更高版本保存VFP寄存器。
x86特定指令
.lcomm symbol , length[, alignment]
由符號表示的本地公用的預留長度(絕對錶達式)字節。符號的部分和值是新的局部通用的。這些地址在bss部分中分配,以便在運行時字節從零開始。因爲符號未聲明爲全局,所以它一般不可見於ld。可選的第三個參數,對齊方式,指定在bss部分中符號所需的對齊方式。
此指令僅適用於基於COFF的x86目標。
.largecomm symbol , length[, alignment]
此指令的行爲方式與comm指令相同,只是數據被放到.lbss節而不是.bss節comm中。
該指令旨在用於須要大量空間的數據,而且僅適用於基於ELF的x86_64目標。
RISC-V指令
下表列出了全部可用的RISC-V特定指令。
.align size-log-2
與給定邊界對齊,其大小爲log2,即要對齊的字節數。
.half value
.word value
.dword value
在當前位置發出半字,字或雙字值。
.dtprelword value
.dtpreldword value
在當前位置發出DTP相關字(或雙字)。這適用於編譯器在共享庫中用於線程局部變量的DWARF調試信息。
.bss
將當前節設置爲BSS節。
.uleb128 value
.sleb128 value
在當前位置發出簽名或未簽名的LEB128值。這隻接受常量表達式,由於符號地址能夠隨着鬆弛而改變,而且咱們不支持重定位以在連接時修改LEB128值。
.option argument
修改與彙編代碼一致的RISC-V特定彙編器選項。當特定指令序列必須與一組特定選項組合時,使用此方法。例如,因爲咱們將序列放寬到較短的GP相對序列,所以GP的初始負載不能放寬,應該像:
.option push
.option norelax
la gp,__ global_pointer $
.option pop
爲了在鏈接器放鬆指望後製做:
auipc gp,%pcrel_hi(__ global_pointer $)
addi gp,gp,%pcrel_lo(__ global_pointer $)
而不只僅是
addi gp,gp,0
在常規使用期間,不指望選項以這種方式改變,可是有一些深奧的狀況,例如上面那些用戶須要爲特定代碼序列禁用匯編器的特定功能的狀況。選項參數的完整列表以下所示:
push
pop
壓入或彈出當前選項堆棧。只要根據彙編代碼更改選項,就應該使用這些選項,以確保對正在彙編的文件的大部分使用用戶的命令行選項。
rvc
norvc
啓用或禁用壓縮指令的生成。儘量由RISC-V彙編程序機會性地壓縮指令,但有時這種行爲是不可取的。
pic
nopic
啓用或禁用與位置無關的代碼生成。除非你真的知道你在作什麼,不然這應該只是在文件的頂部。
relax
norelax
啓用或禁用放鬆。RISC-V彙編器和連接器機會性地放鬆一些代碼序列,但有時這種行爲是不可取的。
.insn value .insn value 此指令容許指令的數字表示, 並使彙編器根據".insn"(參見RISC-V-Formats)的一種指令格式插入操做數。例如,"add a0、a一、a2"等指令能夠寫成".insn r 0x33, 0, 0, a0, a1, a2"。