版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、ARM標準匯編與GNU匯編前段時間看arm的匯編,發(fā)現(xiàn)很多有一個小點,但是借來的書上的語法卻沒有,問同學也 不知道, 于是在網(wǎng)上查了一番才發(fā)現(xiàn)我書上看到的是arm的標準匯編, 而有小點的gnu的 匯編,于是將收集到的資料整理后放到這里來。GNU匯編 語言結(jié)構(gòu)主要包括三個常用的段:databsstext數(shù)據(jù)段 聲明帶有初始值的元素數(shù)據(jù)段 聲明使用0或者null初始化的元素正文段 包含的指令,每個匯編 程序都必須包含此段使用.section指令定義段,如:.section .data.section .bss.section .text起始點:gnu匯編器使用_start標簽表示默認的起始點,此外
2、如果想要 匯編內(nèi)部的標簽?zāi)軌虮?外部程序訪問,需要使用.globl指令,如:. globl _start使用通用庫函數(shù)時可以使用:ld -dynamic-linker /lib/ld-linux.so.2II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II II IIa a a a a a a a a a a a a a a a a a a a a a a a a a a a
3、 a a a a a a a a a a a a a a a a a a a aa a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a aa a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a#四,數(shù)據(jù)傳遞a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
4、 a a a a a a a a a a a a a a a aa a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a aa a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a
5、 a a a a a a a a a1,數(shù)據(jù)段使用.data聲明數(shù)據(jù)段,這個段中聲明的任何數(shù)據(jù)元素都保留在內(nèi)存中并可以被 匯編 程序的指令讀取,此外還可以使用.rodata聲明只讀的數(shù)據(jù)段,在聲明一個數(shù)據(jù)元素時,需要使用標簽和 命令:標簽:用做引用數(shù)據(jù)元素所使用的標記, 它和c語言的變量很相似,它對于處理器是沒 有意義的,它只是用做 匯編 器試圖訪問內(nèi)存位置時用做引用指針的一個位置。指令:指示 匯編器為通過標簽引用的數(shù)據(jù)元素保留特定數(shù)量的內(nèi)存, 聲明命令之后必須 給出一個或多個默認值。聲明指令:.ascii文本字符串.asciz以空字符結(jié)尾的字符串.byte字節(jié)值.doubIe雙精度浮點值.f
6、Ioat單精度浮點值.int32位整數(shù).Iong32位整數(shù),和int相同.octa16字節(jié)整數(shù).quad8字節(jié)整數(shù).short16位整數(shù).singIe單精度浮點數(shù)(和fIoat相同)例子:output:.ascii hello world.pi:.float 2.14聲明可以在一行中定義多個值,如: ages:.int 20, 10, 30, 40定義靜態(tài)符號:使用.equ命令把常量值定義為可以在文本段中使用的符號,如.section .data.equ LINUX_SYS_CALL, 0 x80.section .textmovl $LINUX_SYS_CALL, %eax2, bss段和d
7、ata段不同,無需聲明特定的數(shù)據(jù)類型,只需聲明為所需目的保留的原始內(nèi)存部分 即可。GNU匯編 器使用以下兩個命令聲明內(nèi)存區(qū)域:.comm.Icomm聲明為未初始化的通用內(nèi)存區(qū)域 聲明為未初始化的本地內(nèi)存區(qū)域兩種聲明很相似, 但.Icomm是為不會從本地 匯編代碼之外進行訪問的數(shù)據(jù)保留的,格式 為:.comm/.lcomm symbol, length例子:.section .bss.lcomm buffer, 1000該語句把1000字節(jié)的內(nèi)存地址賦予標簽buffer,在聲明本地通用內(nèi)存區(qū)域的程序之外 的函數(shù)是不能訪問他們的.(不能在. globl命令中使用他們)在bss段聲明的好處是,數(shù)據(jù)不
8、包含在可執(zhí)行文件中。在數(shù)據(jù)段中定義數(shù)據(jù)時,它必須 被包含在可執(zhí)行程序中,因為必須使用特定值初始化它。 因為不使用數(shù)據(jù)初始化bss段中聲 明的數(shù)據(jù)區(qū)域,所以內(nèi)存區(qū)域被保留在運行時使用,并且不必包含在最終的程序中。3, 傳送數(shù)據(jù)move指令:格式movex源操作數(shù),目的操作數(shù)。l用于32位的長字節(jié)w用于16位的字b用于8位的字節(jié)值立即數(shù)前面要加一個$符號,寄存器前面要加%符號。8個通用的寄存器是用于保存數(shù)據(jù)的最常用的寄存器,這些寄存器的內(nèi)容可以傳遞給其他的任何可用的寄存器。的內(nèi)容只能傳送給通用寄存器和通用寄存器不同,專用寄存器(控制,調(diào)試,段) ,或者接收從通用寄存器傳過來的內(nèi)容。在對標簽進行引用
9、時例:.section .datavalue:.int 100_start:movl value, %eax movl $value, %eax movl %ebx, (%edi) movl %ebx, 4(%edi)只是把標簽value當前引用的內(nèi)存值傳遞給eax把標簽value當前引用的內(nèi)存地址指針傳遞給eax如果edi外面沒有括號那么這個指令只是把ebx中的值加載到edi中,如果有了括號就表示把ebx中的內(nèi)容 傳送給edi中包含的內(nèi)存位置。其中x為要傳送數(shù)據(jù)的長度,取值有:其中:movl value, %eaxmovl $value, %eax movl%ebx, (%edi)movl
10、%ebx, 4%edi)表示把edi中的值放在edi指向的位置之后的4字節(jié)內(nèi)存位置中movl %ebx, -4 (%edi)存位置中表示把edi中的值放在edi指向的位置之前的4字節(jié)內(nèi)cmove指令(條件轉(zhuǎn)移):cmovex源操作數(shù),目的操作數(shù). x的取值為無符號數(shù):a/nbe大于/不小于或者等于ae/nb大于或者等于/不小于nc無進位b/nae小于/不大于等于c進位be/na小于或等于/不大于e/z等于/零ne/nz不等于/不為零p/pe奇偶校驗/偶校驗np/po非奇偶校驗/奇校驗有符號數(shù):ge/nl大于或者等于/不小于l/nge小于/不大于或者等于le/ng小于或者等于/不大于o溢出no未
11、溢出s帶符號(負)ns無符號(非負)交換數(shù)據(jù):xchg在兩個寄存器之間或者寄存器和內(nèi)存間交換值如:xchg操作數(shù),操作數(shù),要求兩個操作數(shù)必須長度相同且不能同時都是內(nèi)存位置其中寄存器可以是32,16,8位的bswap反轉(zhuǎn)一個32位寄存器的字節(jié)順序如: bswap %ebxxadd交換兩個值 并把兩個值只和存儲在目標操作數(shù)中如: xadd源操作數(shù),目標操作數(shù)其中源操作數(shù)必須是寄存器,目標操作數(shù)可以是內(nèi)存位置也可以是寄存器其中寄存器可以是32,16,8位的cmpxchgcmpxchg source, destination其中source必須是寄存器, destination可以是內(nèi)存或者寄存器,用
12、來比較 兩者的值,如果相等,就把源操作數(shù)的值加載到目標操作數(shù)中,如果不等就把 目標操作數(shù)加載到源操作數(shù)中,其中寄存器可以是32,16,8位的,其中源操作數(shù)是EAX,AX或者AL寄存器中的值cmpxchg8b同cmpxchg, 但是它處理8字節(jié)值, 同時它只有一個操作數(shù)cmpxchg8bdestination其中destination引用一個內(nèi)存位置,其中的8字節(jié)值會與EDX和EAX寄存器中 包含的值(EDX高位寄存器, EAX低位寄存器)進行比較,如果目標值和EDX:EAX對中的值相等,就把EDX:EAX對中的64位值傳遞給內(nèi)存位置,如果不匹配就把 內(nèi)存地址中的值加載到EDX:EAX對中4,堆
13、棧ESP寄存器保存了當前堆棧的起始位置,當一個數(shù)據(jù)壓入棧時, 它就會自動遞減 反之其自動遞增壓入堆棧操作:pushx source, x取值為:l 32位長字w 16位字彈出堆棧操作:popx source其中source必須是16或32位寄存器或者內(nèi)存位置,當pop最后一個元素時ESP值 應(yīng)該和以前的相等5,壓入和彈出所有寄存器pusha/popa壓入或者彈出所有16位通用寄存器pushad/popad壓入或者彈出所有32位通用寄存器pushf/popf壓入或者彈出EFLAGS寄存器的低16位pushfd/popfd壓入或者彈出EFLAGS寄存器的全部32位6,數(shù)據(jù)地址對齊gas匯編 器支持
14、.align命令, 它用于在特定的內(nèi)存邊界對準定義的數(shù)據(jù)元素, 在數(shù) 據(jù)段中.align命令緊貼在數(shù)據(jù)定義的前面比較:cmp operend1, operend2進位標志修改指令:CLC清空進位標志(設(shè)置為0)CMC對進位標志求反(把它改變?yōu)橄喾吹闹担㏒TC設(shè)置進位標志(設(shè)置為1)循環(huán):loop循環(huán)直到ECX寄存器為0loope/loopz循環(huán)直到ecx寄存器為0或者沒有設(shè)置ZF標志loopne/loopnz循環(huán)直到ecx為0或者設(shè)置了ZF標志指令 格式 為: loopxx address注意循環(huán)指令只支持8位偏移地址另有一個比較篇的如下:ARM匯編和Gnu匯編的轉(zhuǎn)換將ARM ADS下的匯編碼
15、移植到GCC for ARM編譯器時,有如下規(guī)則:1,注釋行以或/* . */代替;2, GET或INCLUDE = .INCLUDE如:get option.a = .include option.a3, EQU = .equTCLK2 EQU PB25 = .equ TCLK2, PB25 SETA = .equSETL = .equBUSWIDTH SETA 16 = .equ BUSWIDTH, 164, EXPORT = .globalIMPORT = .externGBLL = .globalGBLA = .global5, DCD = .long6, IF :DEF: = .IF
16、DEF ELSE = .ELSE ENDIF = .ENDIF :OR: = |:SHL: = .endNOTE:在被include的頭文件中,如option.a中,不再需要.end,否則會導致主匯編程 序結(jié)束。8,符號定義加:號Entry = Entry: AREA Word, CODE, READONLY = .text AREA Block,DATA, READWRITE = .data CODE32= .armCODE16= .thumb9,MACRO = .macroMEND = .endm開始看start.s中的代碼, 又一句.balignl 16,0 xdeadbeef,不知什么
17、意思, 網(wǎng)上搜了一下了解到這條命令的作用如下:.balignwl abs-expr, abs-expr, abs-expr增加位置計數(shù)器(在當前子段)使它指向規(guī)定的存儲邊界。 第一個表達式參數(shù)(結(jié)果必須是 純粹的數(shù)字)是必需參數(shù):邊界基準,單位為字節(jié)。例 如,.balign 8向后移動位置計數(shù)器 直至計數(shù)器的值等于8的倍數(shù)。如果位置計數(shù)器已經(jīng)是8的倍數(shù),則無需移動。 第2個表達 式參數(shù)(結(jié)果必須是純粹的數(shù)字)給出填充字節(jié) 的值,用這個值填充位置計數(shù)器越過的地方。 第2個參數(shù)(和逗點)可以省略。如果省略它,填充字節(jié)的值通常是0。 但在某些系統(tǒng)上,如果本段標識為包含代碼, 而填充值被省略,則使用no-op指令填充空白區(qū)。第3個參數(shù)的結(jié) 果也必須是純粹的數(shù)字, 這個參數(shù)是可選的。 如果存在第3個參數(shù), 它代表本對齊命令允許 跳過字節(jié)數(shù)的最大值。 如果完成這個對齊需要跳過的字
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人力資源專員合同模板
- 防竄貨策略實施:保障市場公平
- 機場建設(shè)挖機操作手招聘合同
- 提升社區(qū)教育水平的方案計劃
- 個人銷售工作總結(jié)范本5篇
- 畢業(yè)生自我鑒定500字范文五篇
- 外貿(mào)跟單實習報告范文錦集五篇
- 讀《金銀島》有感15篇
- 2022民法典宣傳教育活動總結(jié)-民法典宣傳活動總結(jié)報告五篇
- 護士實習工作總結(jié)五篇
- 金融理論與政策(華南農(nóng)業(yè)大學)-中國大學MOOC答案2023版
- 2024年《論教育》全文課件
- 生命安全與救援學習通超星期末考試答案章節(jié)答案2024年
- 節(jié)能改造合同協(xié)議
- 國家開放大學??啤斗ɡ韺W》(第三版教材)形成性考核試題及答案
- (正式版)SHT 3158-2024 石油化工管殼式余熱鍋爐
- MOOC 創(chuàng)業(yè)基礎(chǔ)-暨南大學 中國大學慕課答案
- (2024年)面神經(jīng)炎課件完整版
- 心肺復蘇患者體溫管理
- 馬工程版《中國經(jīng)濟史》各章思考題答題要點及詳解
- 青年教師培養(yǎng)策略的研究
評論
0/150
提交評論