找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2216|回复: 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        表示汇编结束

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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