[专业课笔记] 单片机 第四章 汇编语言程序设计知识
正文
编程入门
应该只有无基础学习单片机的才需要看这部分把
编程步骤
- 提出问题
- 确定算法(思路)
- 画程序流程图
(个人认为是绝大多数编程入门都要讲, 但是实际上用不到的一个东西) - 编写程序
- 标号
- 操作码
- 操作数
- 注释(注释符号为==;==)
编程方法技巧
程序功能模块化
少用无条件转移
多写注释
这些难道不是什么语言都适用吗
程序结构
- 顺序
- 分支(jz等指令配合使用可实现)
- 循环(djnz等指令可实现)
伪指令
不同的微机系统有不同的汇编程序, 也定义了不同的汇编指令
以下这些英文字母表示的汇编指令不是真正的指令, 没有对应的机器码, 汇编时也不产生目标程序(机器码), 只是用来对汇编过程进行某种控制
它们被称为伪指令
org 汇编起始指令
格式:
org addr16
功能是规定该伪指令后的程序的汇编地址, 即汇编后生成的目标程序的起始地址
例如
org 0030h ; 规定下一条指令的起始地址是0030h
end 汇编结束指令
告知汇编程序在此结束汇编, 在end之后的所有指令不予以汇编
equ 赋值指令
格式
字符名称 equ 项(数值或者汇编符号)
用(前者) 一个字符名称指代(后者) 项(数值或者汇编符号)
类似C语言的宏定义
例如
aa equ r0 ; 指可以用aa指代寄存器r0, 之后的指令比如mov aa, a就等价于将a中数据放入r0中
data 数据地址赋值指令
格式
字符名称 data 表达式
和equ有所区别:
data允许后定义先使用
data只能给字符名称赋予数据
data可以把一个表达式的值赋予字符名称(表达式需要是可求值的)
data往往用来在程序里定义数据地址
例如
LED_lits data 72h ; 存放led排灯每个灯开关的数据
db 定义字节指令
用于在当前ROM地址位置中存放常数, 例如字符串常量, 数组等等
格式
db 项或者项表
例如
org 0072h
db 00h, 01h, 05h
db 'abc'
表示从地址0072h开始在ROM依次存放00h, 01h, 05h, ‘a’, ‘b’, 'c’几个数据
经汇编后,ROM中则有:
(0072h) = 00h
(0073h) = 01h
(0074h) = 05h
(0075h) = ‘a’(的ascii码, 也就是61h)
(0076h) = ‘b’(的ascii码, 也就是62h)
(0077h) = ‘c’(的ascii码, 也就是63h)
dw 定义字命令
用于在当前ROM地址位置中存放16位数据项或者项表, 每个数据都是高8位先放, 低8位后放
格式
dw #data16[,…]
例如
org 0072h
dw 00h, 1001h, 05h
(0072h) = 00h
(0073h) = 00h
(0074h) = 10h
(0075h) = 01h
(0076h) = 00h
(0077h) = 05h
ds 定义存储空间命令
从当前ROM地址位置开始保留指定数目的存储单元
格式
ds 保留的单元个数
例如
org 0072h
ds 05h
db 00h
从ROM的0072h开始保留5个单元不被之后的程序和其他定义占用
因此下一个伪指令db所存放的00h的ROM地址为0077h
以上伪指令db, dw, ds都只对程序存储器起作用
bit 位地址符号命令
格式
字符名称 bit 位地址
例如
a1 bit p0.1; 之后就可以用a1指代p0.1
说明
在实际编程中, 使用的汇编程序不同, 可能可使用的伪指令集会有增减