当前位置:文档之家› 第4章80C51的汇编语言程序设计

第4章80C51的汇编语言程序设计


ORL A,R1 INC DPTR MOVX @DPTR,A SJMP $ END
2013-7-26
23
例、试编写程序,将R1中的低4位数与R2中的高4 位数合并成一个8位数,并将其存放在R1中
MOV ANL MOV MOV ANL ORL A, R1 A,#0FH R1,A A,R2 A,#0F0H A,R1 ORG 0000H MOV R1,#10H MOV 30H,R1 MOV R1,#30H MOV R2,#56H MOV A,R2 XCHD A,@R1 SJMP $ END
4AH 大端模式
ORG 1400H DATA1:DW 324AH,3CH … …
2013-7-26
15
定义常值为符号名伪指令EQU
符号名 EQU 常值表达式 LEN SUM BLOCK EQU EQU EQU CLR MOV MOV LOOP:ADD INC DJNZ MOV 10 21H 22H A R7,#LEN R0,#BLOCK A,@R0 R0 R7,LOOP SUM,A
30H 80H 31H 28H 32H 01H
8位二进制数表示的十进制数范围为0~255(00H~ FFH),转换后为3位十进制数,用两个字节存放。 2)解题思路 先除以100,得百位,余数再除以10得十位余数为个位 取数÷100 商为百位 余数÷10
商为十位 余数为个位
2、源程序
ORG 0000H MOV A,30H MOV B,#64H DIV AB MOV 32H,A ;取数 ;64H=100 ;÷100,A商B余 ;存百位
2013-7-26
7
4.1.3 汇编语言的语句格式
Keil的汇编器A51可以识别的语句形式为:
[标号:] 指令助记符 [操作数1,] [操作数2,] [操作数3,] [;注释]
标号(即符号地址)
非数字字符开头,后跟字母、数字、“-”、“?” 等 不能用已定义的保留字(指令助记符、伪指令等) 后跟英文冒号“:”
符号名可代表: 地址 常数 段名 字符串 寄存器名 位名 比较:标号只能是地址
2013-7-26 16
定义位地址为符号名伪指令BIT
符号名 BIT 位地址表达式 P1.0 0D7H ;将P1.0的位地址赋给符号名ST ;将位地址为D7H的位定义为符号名 如: ST BIT CF BIT
6
2013-7-26
ORG 0000H LJMP MAIN ORG 0040H MAIN:MOV A,#0FEH LOOP:MOV P2,A LCALL D_1s RL A AJMP LOOP
D_1s:MOV R6,#100 D10ms:MOV R5,#40 DL:MOV R4,#123 NOP DJNZ R4,$ DJNZ R5,DL DJNZ R6,D10ms RET END
伪指令主要用于指定源程序存放地址、定义符号、指定 数据存储区、汇编结束等。
4.2.2 伪指令
伪指令,也叫汇编命令。仅对汇编过程进行指示 伪指令无对应的单片机可执行代码
起始地址设定伪指令ORG
ORG 8000H 表达式通常为十六进制地址,例: START:MOV A,#30H ORG可多次使用,但地址值的顺序要由小到大 … …
2013-7-26 14
0AH
12H
定义字数据表伪指令DW
[标号:] DW 字数据表 该指令是用于定义字,将项或项表中 1402H 00H 的一个字(即两个字节)的字符串数据 存入标号开始的连续单元中。项或项表 1403H 3CH 之间用逗号隔开。使用方法与DB类同。
1400H 1401H 32H
分支程序的结构特点: 根据条件的成立与否执行不同的程序段,程序有
两个或两个以上分支。
例如: 根据P1.0的值决定 执行不同的操作 分为:
二分支 三分支 散转,分支很多 P1.0=0? Y 点亮所有8个灯 8个灯交叉点亮
N
例: 从P1口输入一个数,若为正则存入30H单元,若为 负则将其取反后存入30H单元。
9
2013-7-26
4.2 源程序的编辑和汇编
目标程序的产生过程如下图:
汇编源文件 .ASM
汇编器 A51.EXE
目标文件 (浮动地址) .OBJ
调试目标文件 (绝对地址) 无扩展名
可烧写 目标文件 .HEX
.LST
连接器 BL51.EXE
转换器 OH51.EXE
编译器 C51.EXE .M51
写入芯片 仿真调试
用BIT定义的“符号名”一经定义便不能重 新定义和改变
2013-7-26
17
4.3 基本程序结构
4.3.1 顺序程序
(无分支、无循环)
开始
【例4-1】片内RAM的21H单
元存放一个十进制数据十 位的ASCII码,22H单元存 放该数据个位的ASCII码。 编写程序将该数据转换成
取十位的ASCII码 保留低半字节 移至高半字节,存回 取个位的ASCII码 保留低半字节 合并到结果单元 结束
指令助记符
是指令功能的英文缩写。
2013-7-26 8
操作数
数据:二进制(B) 十进制(D或省略D) 十六进制(H),注意A~F开头时要加“0” ASCII码,如 „A‟,‘1245‟ 符号:符号名、标号或“$”(PC的当前值) 表达式:由运算符和数据构成(见表4.1)
注释
英文分号“;”开头
ORG可多次使用,但地址值不能重叠 MOV DPTR,STRT 标号为符号地址其值为8000H
12
ORG
表达式
2013-7-26
ORG START:MOV MOV ORG MOV
8000H A,#30H R2,#20H 8001H A,#40H
结束汇编伪指令END END
该伪指令位于源程序的最后一行。
;查表求平方
;存平方值
TAB:DB 0,1,4,9,16
DB 25,36,49,64,81 ;0~9的平方 END

二翻十 8位二进制数转换成十进制数(BCD码) 设二进制数在30H单元,转换后的十进制数存入31H
和32H单元(设个位十位在31H,百位在32H中)
解: 1、确定算法
1)背景知识
80H = 128
C源文件 .C
.LST
库文件 .LIB
映像文件
2013-7-26
10
MCS-51单片机汇编语言,包含两类不同性质的指令。 (1)基本指令(指令性语句):即指令系统中的指令。它们 都是机器能够执行的指令,每一条指令都有对应的机器码。 源程序的主要功能都是由指令性语句完成。
(2)伪指令(指示性语句):汇编时用于控制汇编的指令。 它们都是机器不执行的指令,无机器码。
30H 80H 31H 28H 32H 01H
MOV A,B
MOV B,#0AH DIV ADD AB A,B
;余数→A
;0AH=10 ;÷10,A商B余
SWAP A
MOV 31H,A SJMP $ END
;交换到高四位
;拼成压缩BCD码 ;存个和十位
还有除10取余法
4.3.2 分支程序
(单分支、双分支、多分支)
工作任务符号 程序连接符号
循环扫描、处理
程序流向符号 程序流向符号
2013-7-26
4
4.1.2 程序编制的方法
对上述51单片机指令系统,要认清以下几点: 1)指令按用户规定排列形成程序,顺序存放在ROM中
2)每条指令的机器码占若干字节,一旦存放就有确定的
地址 3)PC实时指向该地址,使CPU按用户所编程序顺序执 行指令 4)跳转就是把新的目的地址送给PC
2、源程序
TAB +A (TAB+A)
ROM 0 1 4 9 16 ┇ 0的平方 1的平方 2的平方 3的平方 4的平方 ┇ 30H 31H 4
A
16
ORG 0000H
MOV A,30H MOV DPTR,#TAB
;ห้องสมุดไป่ตู้数bA ;表首地址送DPTR
MOVC A,@A+DPTR
MOV 31H,A SJMP $
2013-7-26
13
定义字节数据表伪指令DB
[标号:] DB 字节数据表
1000H 1001H
FEH
FCH
FAH 08H
该指令的功能是用于定义字节,将项或 项表中的一个字节或字符串数据存入标号 开始的连续单元中。项与项之间用逗号隔 开,项或项表若用英文单引号’’括起来 时表示为ASCII码字符串。 如: ORG 1000H DB -2,-4,-6,8,10,18 DB ‘how are you’ DB ‘4’, ‘ 6’
19
拆字程序 例: 设30H单元内容为56H,将高低四位拆开存放 在40H,和41H MOV A,30H ;取数 40H 06H ANL A,#0FH ;屏蔽高4位 41H 05H MOV 40H,A ;存低4位 42H MOV A,30H ;再取 ANL A,#0F0H ;屏蔽低4位 SWAP A ;高低4位交换 MOV 41H,A ;存高4位 与操作: 01010110B 00000110B 56H 06H
例、试编写程序,完成两个16位数的减法:7F4DH- 2B4EH,结果存入内部RAM的30H和31H单元,30H 单元存差的高8位,31H单元存差的低8位。 CLR CY MOV A,#4DH SUBB A ,#4EH MOV 31H,A ;保存低字节相减结果 MOV A,#7FH SUBB A,#2BH MOV 30H,A ;保存高字节相减结果
2013-7-26
24

查表法求平方值
a=b2,设b是0~9之间的一个数,存放在30H单元, 用查表法求平方值a存入31H单元。
相关主题