組合語言每行的語法:
lable: instruction ; comment
段操作: .section
格式: .section 段名 [標誌]
[標誌]可以是如下:
a 允許段
w 可寫段
x 可執行段
常見段名: data, bss, text, rodata段,我們也可以定義我們自己的段。
.data: 已初始化資料段
.bss: 未初始化資料段
.text:**段
.rodata:唯讀段
匯程式設計序的入口點:
通常,linux的匯程式設計序的入口點都是從_start這個全域性符號開始的。而c語言的入口點是main, main函式就是被_start後面的**呼叫。
.global _start
_start:
**,,, 初始化程式執行環境;
**,,,
,,,bl main
bl exit
linux彙編中常數的使用:
十進位制: 以非0 的數字開頭表示, 124, 564
二進位制: 以0b開頭,如0b101001
八進位制: 以0開始的數字,如05645
十六進製制:以0x開頭, 如0xab12
linux彙編中常用的偽操作:
資料定義偽操作:
.byte, 定義單個位元組, 如, .byte 5, 4, 0b1001, 0x22, 055, 'b'
.short, 定義半字資料, 如,.short 0x1122, 3344
.long, 定義4位元組資料,如, 0x11223344,
.word
.string, .asciz, .ascii, 定義字串資料, 比如.string "hello"
對齊偽操作: .align n --> 2^n
檔案結束操作:.end
檔案包含操作:.include, 一般是在檔案開頭的時候包含標頭檔案時使用
**指令集切換:
.thumb, .code 16 這兩個偽指令告訴編譯器從這裡開始,以後的**都編譯成16為的thumb指令。
.arm, .code 32 這兩個偽指令告訴編譯器從這裡開始,以後的**都編譯成32為的arm指令。
函式定義格式:
函式名:
函式體函式返回語句
比如add函式:
.global add
add:
add r0, r1, r2
mov pc, lr
常見符號的意義和用法:
@ : **注釋符號
; 語句分離符號。(相當於c語言中的;)
# 立即數字首
常用彙編語法 ldr str
首先來看一段 global start 全域性標號 描述 start 函式,程式從此函式開始執行此函式完成時鐘使能 gpio 初始化 最終控制 gpio 輸出低電平來點亮 led 燈。start 例程 1 使能所有時鐘 ldr r0,0x020c4068 暫存器 ccgr0 ldr r1,0xfff...
常用彙編指令
1 加減指令 2 adr指令 adr是小範圍的位址讀取偽指令,ldr是大範圍的讀取位址偽指令。可實際上adr是將基於pc相對偏移的位址值或基於暫存器相對位址值讀取的為指令,而ldr用於載入32為立即數或乙個位址到指定的暫存器中。到這兒就會看到其中的區別了。如果在程式中想載入某個函式或者某個在聯接時候...
常用彙編指令
一 資料傳輸指令 它們在存貯器和 暫存器 寄存 器和輸入輸出埠之間傳送資料.1.通用資料傳送指令.mov 傳送字或位元組.movsx 先符號擴充套件,再傳送.movzx 先零擴充套件,再傳送.push 把字壓入堆疊.pop 把字彈出堆疊.pusha 把ax,cx,dx,bx,sp,bp,si,di依...