实例: 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 表示汇编结束
|