微机原理及应用 第四章 汇编语言程序设计基础
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
•
DIV AB
•
MOV 31H, B
•
MOV B, #10
•
DIV AB
•
MOV 32H, B
•
MOV 33H, A
•
RET
;取原数据数
;二进制数除10 ;将余数(BCD码的个位)送31H
;商再继续除10 ;将余数(BCD码的十位)送32H ;将商(BCD码的百位)送33H
【例4-3】查表程序 关键在:组织具有规律性的表格 求R1中数(0~15)的平方,结果仍放回到R1中。
•
DB 10H, 19H, 24H, 31H
•
DB 40H, 51H
;保存DPTR的原值 ;取平方表首地址 ;查平方表 ;恢复DPTR的原值
;平方表
4-2-2 分支结构程序设计
特点:程序中含有转移类指令 关键:正确选用转移指令
• 无条件分支程序 – 程序设计者事先设计好的流向 – LJMP、AJMP 、SJMP、JMP、LCALL、ACALL、RET(I)
N
顺序程序2
顺序程序3 结束
补码绝对值
例 求R2中补码绝对值,正数不变,负数变补。
MOV A,R2
JJNNBB ACC.7,NEXT;为正数?
影响条件
CPL A INC A MOV R2,A
;负数变补
Y
条件满足?
N
处理段
NEXT:SJMP NEXT ;结束
【例4-4】无符号数的比较
比较外部RAM Data1和Datad2a单ta元1的e两qu个无10符0号0h数,并将大数存入
N
F0
;两数相等,F0置位
设置标志F0
Y
异号?
ACC.7, TEST;两数异号,转TEST A, Data2 ;两数同号,恢复Data1 结束
A, Data2 ;比较
STEP3
; Data1小,转STEP3
BIG, Data1 ; Data1大
SMALL, Data2
N
Y
Data1小?
Y
Data1正?
机器语言→汇编语言→高级语言(字符型→图形化)
• 例如:计算63+56+36+14=?
• MOV A,#63 • ADD A,#56 • ADD A,#36 • ADD A,#14
;数63送入寄存器A ;数56与A中的数63相加,其结果119送A ;数36与A中的数119相加,其结果155送A ;数155与A中的数14相加,其结果169保存在A中
围
一、单重分支程序
一个判断决策框,程序有两条出路,二选一。
由一个条件转移指令实现
有三种典型单分支结构:
开始
开始
顺序程序1
顺序程序1
影响条件
影响条件
Y
条件满足?
N
Y
条件满足?
N
分支处理段1
分支处理1 分支处理2
顺序程序2 结束
顺序程序2
顺序程序3 结束
开始 顺序程序1
分支处理段1
影响条件
Y
条件满足?
51H单元的低4位合成一个字节后存入52H单元。
• STR
EQU 50H ;头文件
•
ORG 0000H
•
MOV R1,#STR ;指向50H单元
•
MOV A,@R1
;取50H单元中的数据
•
SWAPA ;高、低4位互换
•
INC R1
;指向51H单元
•
XCHD A,@R1
;拆字,拼字;51H单元的低4位
• 有条件分支程序 – 根据程序执行过程中对标志位、A、内部RAM的某些单元或 位的影响结果决定程序的流向。使cpu具有判断决策能力 – JZ/JNZ、CJNE、DJNZ、位控制转移类指令的有机配合
• 注意
– 使用条件转移指令形成分之前一定安排可供条件转移指令进
行判别的条件。JC LOOP – 正确选定所用的转移条件、转移目标地址(标号)及转移范
【例4-6】带符号数的比较: XRL指令和JNZ、JB、JNC有机配合
比较内部RAM Data1和Data2单元内以补码形式表示的带符号数,并将大 数存入BIG单元,小数存入SMALL单元,若相等,则建立起标志位F0
Data1 Data2 BIG SMALL COM2:
STEP1:
STEP2:
TEST: STEP3:
ADD_37:ADD A, #37H;大于或等于0AH,则加37H
MOV R2, A ;保存结果
RET
;子程序返回
二、 多重分支程序 程序有两条以上的出路,多选一。
1、多次使用条件转移指令,形成 两个以上判断框。 CJNE指令和JC、JNC有机配合 JB、JNB、JBC JZ、JNZ 开始
顺序程序1
2、 程序设计步骤
分析课题→确定算法和数据结构→确定操作步骤→画流程
图→编制源程序→调试程序
分析课题:对具体问题具体分析,并抽象出数学模型
确定算法:解决同一问题有多种方法,从中选择一种最佳的方法
确定数据结构:合理安排数据结构,合理选择和分配内存空间、 工作寄存器以及I/O接口地址
程序模块:把整个问题分成若干个功能模块,画出层次图及通信
;拆字,屏蔽高4位
•
SWAP A
;高、低4位互换
•
INC R1
;指向51H单元
•
XCH A,@R1
;51H单元内容与累加器内容互换
•
ANL A,#0FH
;拆字,取原51H单元的低4位
•
ORL A,@R1
;拼字
•
INC R1
•
MOV @R1,A
;存结果
•
RET
•
END
【例4-1】拆字、拼字程序 将片内RAM 50H单元的低4位取出当作高4位,与
EQU EQU EQU EQU ORG MOV XRL JNZ SETB RET JB XRL SUBB JC MOV MOV RET XRL JNB MOV MOV RET
40h
开始
41h
30H
31H
取Data1和Data2
0000H
A, Data1 A, Data2
Y
不相等?
STEP1 ;两数不等,转STEP1
– 顺序结构 – 选择结构 – 循环结构
– 自底向上方法→先底层开发
• 先写子程序,后写主程序
➢一个子程序结构
• 子程序
– 混合方法
• 中断服务子程序
4-2 汇编语言程序结构
4-2-1 顺序结构程序设计 4-2-2 分支结构程序设计 4-2-3 循环结构程序设计 4-2-4 子程序结构程序设计
4-2-1 顺序结构程序设计
第四章 汇编语言程序设计基础
4-1 汇编语言程序设计方法 4-2 汇编语言程序结构 4-3 汇编语言的编辑与汇编
4-1 汇编语言程序设计方法
1 程序及程序设计 2 程序设计步骤
1 程序及程序设计
• 程序是一系列指令的有序集合 • 程序设计则是编制程序的过程
程序设计:就是人们用计算机能接受的语言,把欲解决问题 的算法和步骤描述出来的过程。编程语言
;续表
【例4-3】查表程序 求R1中数(0~15)的平方,结果仍放回到R1中。
•
ORG 0000H
TAB2: PUSH DPH
•
PUSH DPL
•
MOV DPTR, #TAB
•
MOV A, R1
•
MOVC
A, @A+DPTR
•
MOV R1, A
•
POP DPL
•
POP DPH
•
RET
TAB: DB 00H, 01H, 04H, 09H
开始
Y
?
N
Y
F>5?
N
1
4-2 汇编语言程序结构
程序设计:就是人们用计算机能接受的语言,把欲解决问题 的算法和步骤描述出来的过程。编程语言
机器语言→汇编语言→高级语言(字符型→图形化)
• 程序设计方法 • 程序开发方法
– 结构化设计
– 自顶向下方法→先顶层开发
➢三种基本控制结构,
• 先写主程序,后写子程序
N
Data1存入BIG Data2存入SMALL
N
Data1存入SMALL Data2存入BIG
A, Data2 ;恢复Data1
结束
结束
ACC.7, STEP2 ; Data1为正,大,转STEP2
SMALL, Data1
BIG, 41H
带符号数的比较流程图
【例4-7】散转程序:使用JMP 实现多分支程序转移
• 数据传送和交换程序、简单运算程序、查表程序
【例4-1】拆字、拼字程序 将片内RAM 50H单元的低4位取出当作高4位,与
51H单元的低4位合成一个字节后存入52H单元。
STR EQU 50H ;头文件
•
ORG 0000H
•
MOV R1,#STR
•
MOV A,@R1
;取50H单元中的数据
•
ANL A,#0FH
•
;与A的低4位内容互换
•
INC R1
;指向52H单元
•
MOV @R1,A
;存结果
•
RET
•
END
【例4-2】数制转换 将片内RAM 30H单元的无符号二进制数转换成BCD码
数,结果按高低顺序依次存放到33H、32H、31H单元。
•
wenku.baidu.com
ORG 0000H
• HEX_D: MOV A, 30H
•
MOV B, #10
Data3单元中, Data1、Dactoa2m和1D:amtao3v为d连p续tr,的#单da元ta1
先看数据放在内部RAM的情况movx
a, @DPTR
ORG 0000H
mov b,a
COM1:MOV A, 40H
inc DPTR
CJNE A, 41H, L1;两数比较movx a, @DPTR
end
【例4-5】代码转换程序设计1
一位十六进制数与ASCII码之间的转换
1、一位十六进制数转换为ASCII码 2、ASCII码转换为一位十六进制数
0~9的ASCII码:30~39H,A~F的ASCII码:41~46H。
‘0’~‘9’与0~9之间的差值30h ‘A’~‘F’与A~F之间的差值37h;
A=0 A=1
分支程序0 分支程序1
A=n 分支程序n
结束
1、多次使用条件转移指令,形成两个以上判断框。
例 求符号函数Y=SGN(X)
开始
输入X存入40H,输出Y存入41H中 +1 当 X>0
Y= SGN(X)= 0 当 X=0
取X
Y
N
X=0?
-1 当 X<0
A= 0
Y
N
X<0?
SYMB: MOV A,40H ;取X
2、按分支号转移,使用散转指令 JMP @A+DPTR (1)转向地址表法:DW (2)转向地址偏移量表法:DB (3)查表与RET指令结合 MOVC和RET (4)转移指令表法:LJMP或AJMP
送条件参数
开始
N
Y
条件1成立?
选择参数送A
分支程序1
N
条件2成立?
Y
分支程序2
分支程序3
顺序程序2
A=?
画流程图:以图示形式表示解决具体问题的思路和方法
编制源程序:精心挑选合适的指令和操作数的寻址方式
用注释行说明程序,便于阅读、调试和修改。
调试程序:
汇编
执行
Y
源程序--→机器程序--→分析结果正确--→调试程序完成
N
修改
• 起止框 • 处理框 • 判断框
• 连线
流程图图例
开始
结束
XX+1 Y Y-1
JZ STOR
;X=0,Y=X
A=-1
A= + 1
JB ACC.7,MINUS;X<0 MOV A,# 1 ;X>0,Y=+1 STOR: MOV 41H,A ;保存Y
保存Y←A 结束
RET
求符号函数流程图
MINUS:MOV A,#0FFH ;X<0,Y= -1
SJMP STOR
要点:将流程图按条件NO优先方式拉直 在流程图汇合处和转移目的地址处加标号
• 顺序结构是按照指令在存储器中存放的先后顺序, 从某一条指令开始逐条顺序执行,直至某一条指令 为止。
• 特点:
– 程序中无转移、调用、分支、循环指令; – 程序按编写的先后顺序执行,程序流向不变 – PC自动加1
• 在实际编程中应注意
– 如何正确选择指令、寻址方式和合理使用工作寄存器, 包括数据存储器。
clr c subb A,#30h
JNC ADD_37;若大于等于0AH,则加37Hcjne A,#10,$+3
ADD_30:ADD A, #30H;若小于0AH,则加30H jc A, HEXASC1 ;A<10转移
MOV R2, A ;保存结果
RET
;子程序返回
subb A,#07h ASCHEX1: ret
• ORG 0000H
• TAB1: MOV A, R1
• ADD A, #02H
;加上地址偏移量
• MOVC A, @A+PC ;查表
• MOV R1,A
• RET
• DB 00H, 01H, 04H, 09H ;平方表
• DB 10H, 19H, 24H, 31H ;续表
• DB 40H, 51H
1、十六进制转换成ASCII码
2、ASCII码转换成十六进制
输入:R2中存放一位十六进制;出口:R2返输回入A:SRC2I中I值存放ASCII码
ORG 0000H
输出:R2中返回十六进制
HEXASC:MOV A, R2 ;将该十六进制数暂A存SC于HAEX中:mov A,R2
CJNE A, #0AH, $+3
L1: JC J2 BIG1 MOV 42H, A
;C=1,则cAj小ne转BIaG,2b, l1
;大l1数:送42jcH
big2
;c=1,则a小
RET
big1: inc dptr
BIG2: XCH A, 41H SJMP BIG1 END
;大数送Amovx @dptr, a ret
big2: xch a, b sjmp big1