找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1780|回复: 0
收起左侧

自己总结的汇编学习小笔记-入门

[复制链接]
ID:270150 发表于 2018-1-2 13:44 | 显示全部楼层 |阅读模式
   实例: movl     %eax,    %ebx        #32位的EAX寄存器值传送给32为的EBX寄存器值
       movx,其中 x 可以是下面的字符:
            1l用于32位的长字值
            2w用于16位的字值
            3b用于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        表示汇编结束

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表