實例: movl %eax, %ebx #把32位的EAX寄存器值傳送給32為的EBX寄存器值 movx,其中 x 可以是下面的字符: 1,l用于32位的長字值 2,w用于16位的字值 3,b用于8位的字節值 testAddr .usect "MtCtrlP1", 1 在MtCtrlP1段保留一個字 輔助寄存器(XAR0~XAR7) 間接尋址方式: mov acc, #0
movl @xid, acc 執行結果:xid=0; xid 是32位,不能賦立即數,需通過acc累加器賦值 mov @_iqr, #0 iqr是16位,能賦立即數 對定義的變量賦值需要加@,對內部寄存器賦值不需要加@ mov acc, #PWMTPrd<<15 mov *(0:CMPR1), ah ;取ACC的高位 mov *(0:CMPR2), ah mov *(0:CMPR3), ah ;AH 16bits High half of ACC 0x0000
;AL 16 bits Low half of ACC 0x0000 LCR *XARn 使用RPC的間接長調用 LCR 22bitAddr 使用RPC的長調用,PC=22位程序地址 lretr 程序返回 .def _Delay_asm用來定義函數名; .global _Delay_asm將函數名全局化,以便在C文件中能夠調用; .sect".delayasmpage"將函數定位到定義的段中,也可以是.text,可以靈活運用; _Delay_asm:為函數標號,注意一定在前面加上下劃線_否則C文件不能調用; LRETR是函數返回,采用了RPC時必須用該指令。 .c28_amode ; 通知編譯器檢查C28x的語法 file:///C:/Users/buaalp/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 符號定義偽指令 .global,.local,.set,.equ .global 使得符號對連接器可見,變為對整個工程可用的全局變量 .global symbol .local 表示符號對外部不可見,只對本文件可見 .local symbol .set 給一個全局變量或局部變量賦值,和.equ的功能一樣 .set symbol expr .set start, 0x40 .set start, 0x50 mov r1, #start ;r1里面是0x50 .equ 和.set一樣,只是格式不同 symbol .equ expr start .equ, 0x40 start .equ, 0x50 mov r1, #start ;r1里面是0x50 數據定義偽指令 .byte,.short,.long,.quad,.float,.string,.asciz,.ascii,.rept .byte 在存儲器中分配1個字節,用指定的數據對存儲單元進行初始化 label: .byte expr ;label是程序標號,expr可以是-128~255的數字,也可是字符 a: .byte #1 ;等價于C中的char a=1; .short 在存儲器中分配2個字節,用指定的數據對存儲單元進行初始化 a: .short 0x1234 .word / .long 在存儲器中分配4個字節,用指定的數據對存儲單元進行初始化 a: .word 0x12345678 .long 在存儲器中分配個字節,用指定的數據對存儲單元進行初始化 .quad 在存儲器中分配8個字節,用指定的數據對存儲單元進行初始化 a: .quad 0x12345678 ;等價于C中的long a=0x1234567812345678 .float 在存儲器中分配4個字節,用指定的浮點數據對存儲單元進行初始化 a: .float 1.11 .space/.skip 用于分配一塊連續的存儲區域并初始化為指定的值,如果后面的填充值省略不寫則在后面填充為0; label: .spacesize,expr ;expr可以是4字節以內的浮點數 a: space 8, 0x1 .string 定義一個字符串,默認是string8,還有string16,string32,string64 a: .space "hello world!" .rept 重復執行接下來的指令,以.rept開始,以.endr結束 .rept cnt ;cnt是重復次數 ... .endr 匯編控制偽操作 流程控制偽指令主要yy.if .else .endif .macro .endm .exitm .if .else .endif .if logical-expression ... .elseif logical-expression2 ... .else ... .endif .macro .endm .exitm 該偽指令可以將一段代碼定義為一個整體,稱為宏指令,然后就可以在程序中通過宏指令多次調用該段代碼,而.exitm指令用來退出當前的宏指令,宏指令可以使用一個或多個參數,當宏操作被展開時,這些參數被相應的值替換。
包含在.macro和。endm之間的指令序列稱為宏定義體。在宏定義體的第一行應聲明宏的原型,包含宏名所需的參數,然后就可以在匯編程序中通過宏名來調用該指令序列,在源程序被編譯時,匯編器將宏調用展開,用宏定義中的指令序列代替程序中的宏調用,并將實際參數的值傳遞給宏定義中的形式參數 .macro macroname macargs ... ;code .endm 雜項 .align 用于使程序當前位置滿足一定的對齊方式 .section 用來定義一個段的偽指令 .data 用來定義一個數據段 .text 用來定義一個代碼段 .include 用來包含一個頭文件 .arm 定義以下代碼使用arm指令集編譯 .code 32 同.arm .code 16 同.thumb .thumb 定義以下代碼使用thumb指令集編譯 .extern 用于聲明一個外部符號,用于兼容性其他匯編 .weak 用于聲明一個弱符號,如果這個符號沒有定義,編譯就忽略,而不會報錯 .end 表示匯編結束
|