汇编语言设计-循环程序
汇编语言程序设计方法
C 名字前加 下划线
从右到左 调用程序
是
SYSCALL
从右到左 被调用程序
是
STDCALL 名字前加
下划线 (注)
被调用程序
是
PASCAL 名字变大写
BASIC 名字大写
FORTRAN 名字大写
从左到右 被调用程序
是
从左到右 被调用程序
是
从左到右 被调用程序
是
12
PROTO是过程声明伪指令,用于事先声明过程的结构。它的格 式如下:
结束处理部分
AGAIN: ADD AX,CX
;从20,19,……2,1倒序累加到AX
LOOP AGAIN ;每循环一遍,CX自动减1
MOV SUM,AX ;将累加和送入SUM单元
.EXIT 0
END
初始化部分
循环结束? 是 否
工作部分 修改部分 结束处理部分
7
二、用MASM 6.x循环控制伪指令实现循环结构
.CODE
.STARTUP
MOV AL, B
IMUL AL
MOV BX,AX MOV AL,A
;BX中为B的平方
IMUL C
MOV CX,4
IMUL CX
;AX中为4AC
.IF SWORD PTR BX>=AX ;比较B的平方和4AC的大小
MOV SIGN,1
;条件成立,SIGN得到1
.ELSE
MOV SIGN,0
.IF 条件表达式 ;条件为真(非0),执行分支体
分支体
[.ELSEIF 条件表达式
分支体
;前面IF条件为假,并且当前ELSEIF条件为真执行分支体
[.ELSE
;前面IF条件为假执行分支体
汇编语言程序设计的基本方法
01
例2 编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
02
例3 把非压缩十进制数DAT1转换为压缩十进制数
例2编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
通常,编制一个汇编语言源程序应按如下步骤进行:
1
明确任务,确定算法。
2
绘制流程图(包括确定内存单元和分配寄存器)。
3
根据流程图编写汇编语言程序。
4
上机调试程序。
5
程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。
6
5.6 汇编语言程序设计的基本方法
5.6.1 顺序程序设计
顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。 顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。指令指针IP值线形增加,IP=IP+1
条件
N
…
例4用比较指令和条件转移指令实现两路分支的程序段。
两路分支程序设计
例4用比较指令和条件转移指令实现两路分支的程序段。 … MOV AX,M ;假定M和N为有符号数 MOV BX,N CMP AX,BX ;比较 M和N的大小,影响标志位,准备条件 JG NEXT ;M>N时转移,注意若M、N为无符号数时用JA指令 …… ;分支程序2 JMP DONE NEXT: …… ;分支程序1 …… DONE:RET
X+20 (X≥0)
汇编语言程序设计实验报告二(分支循环程序实验)
汇编语言程序设计实验报告二(分支循环程序实验)一、实验目的1、掌握分支程序、循环程序的设计方法。
2、熟悉DEBUG程序的使用方法。
3、掌握汇编语言程序的编辑、汇编、连接以及调试过程。
二、实验内容1、编写一程序,将内存中某一区域的数据传送到另一个区域中(要求用循结构,不考虑数据块重叠问题)。
2、编写一程序,将内存中某一区域的数据传送到另一区域(要求考虑数据块重叠问题)。
三、实验准备1、预习数据传送指令,熟悉分支和循环程序设计方法。
2、预习DEBUG调试程序的使用方法。
3、根据实验内容要求,编写好实验源程序。
四、实验步骤1、用QE或其它编辑软件,在计算机上编辑源程序,使其正确无误。
2、汇编、连接源程序,产生.EXE可执行文件。
3、运行程序。
(1) 进入DEBUG。
打入DEBUGT MYPROG.EXE。
MYPROG为所编程序的文件名。
(2) 先用G命令连续剧连续执行程序,程序执行完毕后,观察运行结果。
如果执行后是对的,说明程序编写是正确的,如果结果不对,说明程序有错误,则执行下一步。
(3) 检查程序。
在程序中设置若干断点,以便杳出错误所在。
(4) 采用单步命令T或执行程序,观察各寄存器和存储单元内容,以便找到错误之处。
五、实验报告要求1、列出程序清单,并给出程序流程图。
2、总结实现数据传送的几种方法,指出它们的区别。
开始3、分析实验中所遇到的一些问题,分析错误原因。
4、说明本实验中是如何使用DEBUG进行调试的。
CX、SI、DI置初值六、流程图勤开始设置增量方式CX、SI、DI置初值保存SI内容AL [SI] SI SI+源块长度[DI] AL N SI>DIYSI SI+1 恢复SI内容恢复SI内容DI DI+1CX CX-1 设置减量方式N CX=0, SI指向源块末尾DI指向目的块末尾Y结束 [DI] [SI]题一流程图 N 传完了吗, 书馆 Y结束题二流程图七、程序清单题一程序清单:STACK SEGMENT STACK ‘STACK’DB 100 DUP(0)STACK ENDSDATA SEGMENT PARA ‘DATA’SOUR DB 0、1、2、3、4、5、6、7、8、9 DEST DB 10 DUP(,)DB ‘$’DATA ENDSSEGMENT PARA‘CODE’ASSUME CS:CODEMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,10MOV SI,offset SOURMOV DI, offset DESTAGAIN: MOV AL,[SI]MOV [DI],ALINC SIIN DILOOP AGAINMOV DX,offset DESTMOV AH,09HINT 21HRETMAIN ENDPCODE ENDSEND START题二程序清单:DATA SEGMENT PARA ‘DATA’STRG DB ‘ABCDEFGHIJKLMNOP’STG1 EQU STRG+4STG2 EQU STHG+8STRSE EQU 6DATA ENDSSTACK SEGMENT PARA ‘CODE’DB 100 DUP(0) STACK ENDSCODE SEGMENT PARA ‘CODE’ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV CX,STRSEMOV SI,OFFSET STG1MOV DI,OFFSET STG2CLDPUSH SIADD SI,STRSE-1CMP SI,DIPOP SIJL MOVESTDADD SI,STRSE-1ADD DI,STRSE-1 MOVE: REP MOVSB RETMAIN ENDPCODE ENDSEND START。
汇编-循环与分支程序设计精简版范文
汇编-循环与分支程序设计汇编-循环与分支程序设计循环程序设计在汇编语言中,循环可以通过使用跳转指令来实现。
常见的循环结构有while循环、do-while循环和for循环。
while循环while循环是最基本的循环结构,它的语法形式如下:while(condition)statement其中,condition是一个条件表达式,通常使用比较指令(如CMP)来判断。
如果条件满足,则执行循环体中的语句,然后判断条件,如果仍然满足,则执行循环体,直到条件不满足为止。
do-while循环do-while循环与while循环的区别在于,执行循环体中的语句,然后再判断条件是否满足。
它的语法形式如下:dostatementwhile(condition)for循环for循环是一种特殊的循环结构,它的语法形式如下:for(initialization; condition; update)statement其中,initialization用于初始化循环控制变量,condition 用于判断循环是否继续,update用于更新循环控制变量的值。
for 循环的执行顺序是:先执行initialization,然后判断condition 是否满足,如果满足则执行循环体中的语句,然后执行update,判断condition,以此类推,直到condition不满足为止。
分支程序设计分支是程序中常用的一种控制结构,它可以根据条件的不同执行不同的代码块。
if语句if语句是一种最基本的分支结构,它的语法形式如下:if(condition)statement1elsestatement2其中,condition是一个条件表达式,如果满足则执行statement1,否则执行statement2。
switch语句switch语句是一种多分支结构,它的语法形式如下:switch(expression){case value1:statement1;break;case value2:statement2;break;default:statementN;}switch语句对expression进行求值,然后根据求值结果的值与各个case后面的value进行比较,如果匹配成功,则执行对应的statement,否则执行default后的statement。
第5章 汇编语言程序
Y
条件满足?
N
处理段
例5-5 设内部RAM30H,31H单元存放两个无符号数, 将大数存在31H,小数存于30H。 ORG 1000H START:CLR C MOV A,30H SUBB A,31H JC NEXT ;次序符合,返回 MOV A,30H ;交换 XCH A,31H MOV 30H,A NEXT: NOP SJMP $ END
$
5-3 分支程序
由条件转移指令构成程序判断框,形成程序分支结构。 5-3-1 单重分支程序 一个判断决策框,程序有两条出路。 两种分支结构: 例1 求R2中补码绝对值,正数不变, 影响条件 负数变补。
MOV A,R2 JNB ACC.7,NEXT;为正数? CPL A ;负数变补 INC A MOV R2,A NEXT:SJMP NEXT ;结束
五、对源程序进行交叉汇编得到机器代码; 反汇编 —— 分析现成产品的程序,要将二进制 的机器代码语言程序翻译成汇编语言源程序。
六、程序调试。
通过微计算机的串行口(或并行口)把机器代 码传送到用户样机(或在线仿真器)进行程序 的调试和运行。
5.1.3评价程序质量的标准
(1)程序的执行时间。 (2)程序所占用的内存字节数。 (3)程序的逻辑性、可读性。 (4)程序的兼容性、可扩展性。 (5)程序的可靠性。
方法二:采用除10H取余数将BCD拆开 ORG 1000H MOV A,20H; 2B 1T MOV B,#10H ; 3B 2T DIV AB ; 1B 4T ORL B,#30H ; 3B 2T MOV 22H,B ; 3B 2T ORL A,#30H; 2B 1T MOV 21H,A ; 2B 1T SJMP $ END;7条指令、16个内存字节、13个机器周期。
汇编语言程序设计第七章 循环结构程序
2. LOOPE/LOOPZ 条件重复控制指令
指令汇编格式: LOOPE/LOOPZ AGAIN
操作: (1) CX CX-1
(2) 若CX≠ 0且ZF=1,则使控制转到AGAIN 标识的循环入口处,继续下一次循环,否则退出循 环体,执行后续指令。
例 比较两个字符串是否相等。
STR1 DB
‘12345’
DSEG SEGMENT
DATA DB
10,20,30,80,100,90,120
CNT DW 7
ADR DW 0FFFFH
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,ES:DSEG
START: MOV AX,DSEG MOV DS,AX
DATA1 00H
01H 00H 02H
: :
SI DATA2 00H
10H
50
00H
个
20H
字
单
:
元
:
DI SUM 00H
BX
00H
50
00H 50
个
00H
个
字 单
:
字 单
元
:
元
00H
00H
例7.1 设内存DATA1和DATA2开始分别存放50个无符 号字数据,编制程序将两个存储区对应字数据求和并存 入SUM开始的单元。
存储器中仅由字节或字组成的一组数据称为数据串。由字节组 成的数据串称为字节数据串,简称字节串;由字组成的数据串称为 字数据串,简称字串。一个数据串的长度最长不能超过64KB。
数据串操作指令的寻址方式为数据串寻址:
(1)指令中要处理的两个数据串应分别在数据段和附加段中定义。 (2)数据段中定义的数据串要用SI作指针;
第4章 单片机汇编语言程序设计
RO 20HBCMDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21 0011
;完成转换 @R0 ;存数
H22HB0C001D0HBCD 01000L
END
回目录 上页 下页
方法1小结:
以上程序用了8条指令,15个内存字节,执行时间为9个 机器周期。
21 0011BCDH H22H0011BCDL
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B00C01D01H0BB0CC0D0DHL
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
例4-7:设30H单元存放的是一元二次方程ax2+bx+c = 0
根的判别式△= b2 – 4ac的值。
试根据30H单元的值,编写程序,
判断方程根的三种情况。
在31H中存放“0”代表无实根,
存放“1”代表有相同的实根,
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序
即小于零,等于零、大于零。
R3
R2
回目录 上页 下页
程序:
ORG 1000H CLR C CLR A SUBB A, R0 MOV R2, A CLR A
SUBB A, R1 MOV R3 , A SJMP $ END
;CY 0
;A 0
;低字节求补
;送R2
;A清零 R3 0000
;高字节求补 0000
单片机应用技术(第三版)第四章汇编语言程序设计课件
第4章 汇编语言程序设 计 实训4 信号灯的控制2
4.1 概述 4.2 简单程序设计 4.3 分支程序设计 4.4 循环程序设计 4.5 查表程序 4.6 子程序设计与堆栈技术 本章小结 习题4
第4章 汇编语言程序设计
实训4 信号灯的控制2
1. 实训目的 (1) 掌握汇编语言程序的基本结构。 (2) 了解汇编语言程序设计的基本方法和思路。 2. 实训设备与器件 (1) 实训设备:单片机开发系统、微机等。 (2) 实训器件与电路:参见实训1电路图。 3. 实训步骤与要求 (1) 运行程序1,观察8个发光二极管的亮灭状态。
ORG 0000H ;程序从地址0000H开始存放
START: MOV P1,#00H
;把立即数00H送P1口,点亮
;所有发光二极管
ACALL DELAБайду номын сангаас ;调用延时子程序
MOV P1,#0FFH
;灭掉所有发光二极管
第4章 汇编语言程序设计
(2) 在单片机开发调试环境中,将内部RAM的20H单元内
容修改为00H,运行程序2,观察8个发光二极管的亮灭状态;
重新将内部RAM的20H单元内容修改为80H,再次运行程序2,
观察8个发光二极管的亮灭状态。
(3) 运行程序3,观察8个发光二极管的亮灭状态。
程序1:所有发光二极管不停地闪动。
汇编语言程序设计上机实验报告(实验三)-循环程序设计
汇编语言程序设计上机实验报告(实验三)一、实验题目、内容及要求:一、实验题目、内容及要求:题目:循环程序设计内容:编写一程序,要求从键盘接收一个4位十六进制数,在终端上显示与它等值的二进制数。
二进制数。
要求:实验前要作好充分准备,包括程序清单、调试步骤、调试方法,对程序结果的分析等。
本实验要求在EDIT 下编写完整的汇编语言程并生成可执行文件运行。
下编写完整的汇编语言程并生成可执行文件运行。
二、实验时间及地点二、实验时间及地点日期:日期: 2011/11/21 节次:节次: 7.8 地点:地点:电子实验楼二楼电子机房电子实验楼二楼电子机房 三、实验目的三、实验目的通过本实验掌握DOS 系统功能调用功能,掌握循环程序设计的方法;学会编写循环结构程序。
构程序。
简述在实验过程中遇到的问题和解决的方法:简述在实验过程中遇到的问题和解决的方法:1、问题:遇到死循环解决方法:程序显示disp 中发现执行int int 21h 21h 会修改al 的值,避免这种情况的方法就是使用堆栈段。
2、问题:调试中出现no data segment 解决方法:start 开始时没有将数据段的IP 地址赋给dx 。
data segment 3、问题:可执行,结果为乱码解决方法:数据划分比较的粗,没有系统的将数据系统划分。
系统划分:<30h other 30h-39h num 39h-41h other 41h-46h big zi mu 46h-61h other 61h-67h small zi mu >67h other 运行结果:(要求用“抓图软件”抓程序的运行结果)(要求用“抓图软件”抓程序的运行结果)结果分析及实验体会:结果分析及实验体会:1、结果0001001000110100是十六进制数1234转化而来。
十六进制数通过ASCII码对照转换为二进制数。
A~F----- -57hA~ f----- -57h0~9 ------ -37h2、学习应用了循环指令并了解了其特点:A、循环指令不影响标志位B、其功能为使寄存器CX的值减1,如果结果不等于0,则循环至标号,否则顺序执行。
第4章 MCS-51单片机汇编语言程序设计
程序清单:
送转移地址序号
A,R3 ;取序号 A ;序号乘2 DPTR, #JTAB ;32个子程序 首地址送DPTR JMP @A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 … MP: MOV RL MOV AJMP ROUT31
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
【例4-1】
双字节二进制数求补。
程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其补码。
开始
程序清单:
BINPL:MOV A,R2 CPL A ADD A,#01H MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET ;低位字节取反 ;加1 ;低位字节补码送R2 ;高位字节取反 ;加进位 ;高位字节补码送R3
散转生成正确偏移号
置换指令地址表首址
转入R3指示的程序
AJMP
……
AJMP
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
3.循环程序
包括:循环初始化、循环处理、循环控制
开始 置初值 循环体 循环结束? Y 循环修改 N 循环体 循环结束? N Y 结束 循环修改 结束 开始 置初值
;调用查表子程序 ; 暂存R1中 ;调查表子程序 ;平方和存A中 ;等待
取第一个数→A 调查表子程序 结果存入R1 取下一个数→A 调查表子程序 两数平方相加 存结果
子程序清单:
SQR: INC A ;加RET占的一个字节 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END
汇编-循环与分支程序设计
汇编-循环与分支程序设计循环与分支程序设计----------1.引言在汇编语言中,循环和分支是编写和优化程序中常用的技术。
循环用于重复执行一段代码,而分支用于根据条件跳转到不同的代码段。
本文将介绍如何在汇编语言中实现循环和分支以及如何优化这些代码段。
2.循环程序设计2.1.while循环在汇编语言中,while循环可以使用条件跳转指令(如jmp、jz、jnz等)来实现。
以下是一个简单的while循环的汇编代码示例:.datacount db 10.codemn procmov al, 0loop_start:cmp al, countjge loop_end。
循环内容inc aljmp loop_startloop_end:。
循环结束后的代码2.2.for循环在汇编语言中,for循环可以使用计数器和条件跳转指令来实现。
以下是一个简单的for循环的汇编代码示例:.datacount db 10.codemn procmov al, 0loop_start:cmp al, countjge loop_end。
循环内容inc aljmp loop_startloop_end:。
循环结束后的代码mn endp3.分支程序设计3.1.if语句在汇编语言中,if语句可以通过条件跳转指令来实现。
以下是一个简单的if语句的汇编代码示例:.dataflag db 1.codecmp flag, 1jne else。
if语句的真正内容jmp endifelse:。
else语句的内容endif:。
if语句结束后的代码mn endp3.2.switch语句在汇编语言中,switch语句可以通过多个条件跳转指令来实现。
以下是一个简单的switch语句的汇编代码示例:.datacase db 2.codemn proccmp case, 1je case1cmp case, 2je case2jmp case_defaultcase1:。
第四章:8086汇编语言程序设计
第 4章
汇编语言程序设计
汇编语言程序设计
(2)尽量采用循环结构和子程序 (2)尽量采用循环结构和子程序 采用循环结构和子程序可以使程序的长度减少、 采用循环结构和子程序可以使程序的长度减少、 占用内存空间减少。 占用内存空间减少。 多重循环,注意各重循环的初值和循环结束条件, 多重循环,注意各重循环的初值和循环结束条件, 死循环”现象; 避免出现 “死循环”现象; 通用的子程序, 通用的子程序,除了用于存放子程序入口参数的寄 存器外, 存器外,子程序中用到的其它寄存器的内容应压入堆栈 进行现场保护, 进行现场保护,并要特别注意堆栈操作的压入和弹出的 平衡; 平衡; 中断处理子程序除了要保护程序中用到的寄存器外, 中断处理子程序除了要保护程序中用到的寄存器外, 还应保护标志寄存器。 还应保护标志寄存器。
1、汇编语言的语句格式
汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言一般由四部分组成。 汇编语言一般由四部分组成。
其典型的汇编语句格式: 其典型的汇编语句格式: 标号: 标号:操作码
例如: 例如: START: START:MOV AL,30H AL,30H ;(AL)=30H (AL)=30H 30
第 4章
汇编语言程序设计
汇编语言程序设计
经过任务分析、算法优化后, 经过任务分析、算法优化后, 在微型机上使用编 首先, 首先,要对单片机应用 就可以进行程序的总体构思, 就可以进行程序的总体构思, 辑软件编写源程序, 辑软件编写源程序, 系统预完成的任务进行 确定程序的结构和数据形式, 确定程序的结构和数据形式, 在使用交叉汇编的 深入的分析, 深入的分析,明确系统 并考虑资源的分配和参数的 方法对源程序进行 的设计任务、 的设计任务、功能要求 计算等。 计算等。然后根据程序运行 汇编, 汇编,然后采用串 和技术指标。其次, 和技术指标。其次,要 的过程, 的过程,勾画出程序执行的 算法是解决具体问题 行通信的方法, 行通信的方法,把 对系统的硬件资源和工 逻辑顺序, 。同一个问题 逻辑顺序,用图形符号将总 的方法。 的方法 汇编得到的目标程 作环境进行分析。 ,, 作环境进行分析。这是 体设计思路及程序流向绘制 的算法可以有多种, 的算法可以有多种 序传送到单片机内, 序传送到单片机内 单片机应用系统程序设 在平面图上, 在平面图上,从而使程序的 结果也可能不尽相同, 结果也可能不尽相同, 并进行程序运行和 计的基础和条件 结构关系直观明了, 结构关系直观明了,便于检 所以, 调试 所以,应对各种算法 查和修改。 查和修改。 进行分析比较,并进 进行分析比较, 行合理的优化
第4章 汇编语言程序设计
例: 三字节无符号数相加,其中被加数在内部RAM 的50H、51H和52H 单元中;加数在内部RAM的53H、 54H和55H单元中;要求把相加之和存放在50H、 51H和52H单元中,进位存放在位寻址区的00H位中。
内部RAM
50H 51H 52H
高字节 低字节
53H 54H 55H
R1→55H
结 束
常用程序结构:
顺序程序、分支程序、循环程序。
4-3
顺序程序
顺序程序又称简单程序,程序走向只有一条路径。 例:双字节求补程序(设数据在R4R5中): 开 始 CLR C MOV A,R5 ;取低字节 处 理 CPL A ADD A,#01H ;低字节变补 处 理 MOV R5,A MOV A, R4 ;取高字节 处 理 CPL A ADDC A,#00H ;高字节变补 结 束 MOV R4,A
片内 RAM 42H 0 十 41H 0 个 40H 十 个
4 -- 4
分支程序(参见书P49-57)
分支程序就是在程序执行过程中要判 断某些条件,当条件成立后程序转移到不 同的功能处运行。在MCS-51单片机中条件 转移指令都可以用在分支程序中。 (复习、参见书P38---39) (1)测试条件符合转移,如: JZ、JNB …等
汇编的主要任务:
1)确定程序中每条汇编语言指令的指令机器码。 2)确定每条指令在存储器中的存放地址。 3)提供错误信息。 4)提供目标执行文件(*.OBJ/*.HEX)和 列表文件(*.LST)。
一、汇编语言指令类型:
1. 机器指令: 指令系统中的全部指令,每条指令有对应的机器代码。 2. 伪指令: 汇编控制指令,仅提供汇编信息,没有指令代码。
在源程序中只能有一条END指令
微机原理与汇编语言实验03_循环程序设计实验
微机原理与汇编语言实验实验三循环程序设计实验一实验目的1、掌握循环程序的设计方法。
2、掌握比较指令、转移指令和循环指令的使用方法。
3、进一步掌握调试工具的使用方法。
二实验预习要求1、复习比较指令、条件转移指令和循环指令。
2、复习循环程序的结构、循环控制方法等知识。
3、读懂“三实验内容”中给出的将十进制数转换为二进制数以及将二进制数转换为十进制数的程序。
4、根据“三实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。
5、从“四实验习题”中任选一道题目,编写源程序,以便上机调试。
三实验内容计算1+2+……n=?,其中n通过键盘输入。
要求在屏幕上提供如下信息:Please input a number(1 627): ;出现此信息后通过键盘输入一个小于628的无符号整数1+2+…..n=sum;其中n为用户输入的数,sum为所求的累加和程序运行情况如下图所示(说明:图中所运行程序允许累加和不大于一个32位二进制数所能表示的范围)。
1、编程指导(1)键盘输入的十进制数如368在计算机中是以33H,36H,38H形式存放的,如何将它们转换为一个二进制数101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题。
将键盘输入的十进制数转换为二进制数的程序清单如下:.model small.stack.dataINF1 DB "Please input a number (0-65535):$"IBUF DB 6,0,6 DUP(?).codeSTART: MOV AX, @dataMOV DS, AXMOV DX, OFFSET INF1MOV AH, 09HINT 21HMOV DX, OFFSET IBUF ;键入一个十进制数(<65535)MOV AH, 0AHINT 21HMOV CL, IBUF+1 ;十进制数的位数送CXMOV CH, 0MOV SI, OFFSET IBUF+2 ;指向输入的第一个字符(最高位)MOV AX, 0 ;开始将十进制数转换为二进制数AGAIN: M OV DX, 10 ;((0⨯10+a4) ⨯10+…) ⨯10+a0MUL DXAND BYTE PTR [SI], 0FHADD AL, [SI]A DC AH, 0I NC SILOOP AGAINMOV AH, 4CHINT 21HEND START本程序功能:从键盘接收一个无符号十进制整数(小于65535),将其转换为二进制数,转换结果存在AX寄存器中。
汇编-循环与分支程序设计
汇编-循环与分支程序设计汇编-循环与分支程序设计导言汇编语言是计算机最底层的程序设计语言之一,它直接操作计算机的硬件资源。
循环和分支是编写汇编程序中常用的两种控制结构,它们能够使程序按照一定的条件执行不同的操作。
本文将介绍汇编语言中循环与分支的基本概念与程序设计技巧。
循环程序设计在汇编语言中,循环是通过条件判断和无条件跳转实现的。
常见的循环结构有`while`循环和`for`循环。
while循环assembly; 初始化init:; 初始化计数器值mov cx, 0; 循环开始loop_start:; 判断循环条件cmp cx, 10je loop_end; 执行循环体操作 ;; 递增计数器inc cx; 跳转到循环开始处 jmp loop_start; 循环结束loop_end:;for循环assembly; 初始化init:; 初始化计数器值 mov cx, 0; 计数器上界mov dx, 10; 循环开始loop_start:; 判断循环条件cmp cx, dxjg loop_end; 执行循环体操作 ;; 递增计数器inc cx; 跳转到循环开始处 jmp loop_start; 循环结束loop_end:;分支程序设计在汇编语言中,分支是通过条件判断和条件跳转实现的。
常见的分支结构有`if`语句和`switch`语句。
if语句assembly; 判断条件cmp ax, bxjg greaterje equaljl lessgreater:; 条件为真时执行的语句;equal:; 条件为真时执行的语句 ;less:; 条件为真时执行的语句 ;switch语句assembly; 计算switch表达式的值mov ax, switch_value; 开始判断cmp ax, 1je case_1cmp ax, 2je case_2cmp ax, 3je case_3jmp default; case 1case_1:; 执行case 1的语句 ;; case 2case_2:; 执行case 2的语句 ;; case 3case_3:; 执行case 3的语句 ;; defaultdefault:; 执行default语句 ;总结循环和分支是汇编语言中常用的程序设计结构。
第4章-汇编语言程序设计教案
第四章教学实施计划3课堂教学实施计划第 8 课教学过程设计:复习 0 分钟;授新课 100 分钟讨论 0 分钟;其它 0 分钟授课类型(请打√):理论课√讨论课□实验课□习题课□其它□教学方式(请打√):讲授√讨论□示教□指导□其它□教学手段(请打√):多媒体√模型□实物□挂图□音像□其它□4.1 汇编语言程序设计概述程序实际上是一系列计算机指令的有序集合。
我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称为程序设计。
程序设计是单片机应用系统设计的重要组成部分,单片机的全部动作都是在程序的控制下进行的。
随着芯片技术的发展,很多标准的或功能型的硬件电路都集成到了芯片中,所以,软件设计在单片机应用系统开发中占的比重越来越大。
一、汇编语言和高级语言汇编语言:用助记符表示的指令称为汇编语言,用汇编语言编写的程序称为汇编语言源程序汇编语言也是面向机器的,它仍是一种低级语言。
汇编语言离不开具体计算机的硬件,与硬件紧密相关。
高级语言:高级语言不受具体“硬件”的限制,具有通用性强,直观、易懂、易学,可读性好等优点。
多数的51单片机用户使用C语言来进行程序设计。
C语言已经成为人们公认的高级语言中高效、简洁而又贴近51单片机硬件的编程语言。
二、汇编语言的特点•助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
•使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
•汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
•汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。
三、汇编语言的语句格式•指令语句:每一条指令语句在汇编时都产生一个指令代码(也称机器代码),执行该指令代码对应着机器的一种操作。
第四章 汇编语言程序设计基础
4.2.2 分支程序的设计方法 ★条件控制 ★逻辑尺控制 ★地址跳转表控制
1. 条件控制——利用比较和条件转移指令实现分支,是最常用的 程序设计方法。
பைடு நூலகம்
例如,求解函数:
练习题2. 编写程序,比较两个字符串STRING1和STRING2所 含字符是否完全相同,若相同则显示“MATCH”,若不同则显示 “NO MATCH”。 答案: datarea segment string1 db ‘asfioa’ ;定义字符串STRING1 string2 db ‘xcviyoaf’ ;定义字符串STRING2 mess1 db ‘MATCH’,’$’ ;定义显示字串“MATCH” mess2 db ‘NO MATCH’,’$’ ;定义显示字串“NO MATCH” datarea ends prognam segment main proc far assume cs:prognam,ds:datarea start: push ds ;将ds:00入栈 sub ax,ax push ax mov ax,datarea ;装填数据段及附加段 mov ds,ax mov es,ax
程序流程图
mov ch,4 rotate: mov cl, 4 rol bx,cl mov al,bl and al,0fh add al,30h ;’0’-’9’ ASCII 30H-39H cmp al,3ah jl printit add al,7h ;’A’-’F’ ASCII 41H-46H printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate
例4.3 将首地址为A的N字数组按照从小到大的次序整序(气 泡算法,多重循环) A dw 32,85,16,15, 8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
②、参数表传送。主程序在调用子程序之前, 应事先建 立一个参数表。参数表可建在内存或外设端口中, 由子程 序按规则去存取。它适合于参数较多的情况。
③、堆栈传送。主程序和子程序在同一堆栈中存放数据 或结果, 根据参数存取的需要, 调节出入栈顺序, 达到传递 参数的目的。其中主程序将参数压入堆栈, 子程序将参数 从堆栈中弹出。它适合于参数多且子程序有嵌套或递归调 用的场合。
思考:若数据块长度为100个字节,遇回车符停止清0,否则 全部清0,程序应如何编写?
4、多重循环
多重循环又称循环嵌套 , 即循环套循环。使用时, 应注 意以下几点:
①、内循环必须完整地包含在外循环内,不得互相交叉。
()
()
②、内循环在外循环中的位置,根据需要设置。 ③、内循环在外循环中可以并存、可以从内循环中直接 跳至外循环 , 反之则不行。
①、先将断点(即CALL下一条指令的地址)NEXT进栈, 即保护断点。
②、程序转到DTOB处执行 ,实现转子 ;且利用子程序的
最后一条指令RET ,将堆栈 的内容弹出 ,返回主程序。
⑵、寄存器及其所用工作单元内容的保护
设计子程序时, 除具有通用性外, 还要注意避免子程序无
意破坏主程序的数据的情况, 因此, 应将子程序中用到的寄
四、循环程序设计
1、循环程序的引入
例:计算Y=100ai 设和数为16位数
i=1
置数据区
MOV AX , 0 ;清结果寄存器 MOV BX,OFFSET TABL ;置地址指针
ADD AX , [BX] ;求部分和
AX←0
INC BX
;修改指针
MAASXM←.EXAEX—+宏a1汇编A程IND序CD
栈后 , 继续修改堆栈指针 , 将立即数4加到SP中 , 即 (SP)←(SP)+1。
这一特性可用来冲掉在执行CALL指令之前推入堆栈 的一些数据。要注意: n一定为偶数。
④ 思考:P159的MOV BP , SP指令的作用。
例2:求n的阶乘(n!) 具体程序见P160。
第七节 汇编语言程序的上机过程
;待转换的数在XX单元
PUSH BX ;保护所用寄存器BX的内容
CALL DTOB ;调用子程序DTOB
NEXT: MOV YY , CL ;存在CL中的转换结果送YY单元
PO••• P BX DTOB PROC
R••E• T
;子程序开始
DTOB ENDP
CODE ENDS END STRT
由上例可知,CALL实现主程序向过程的转移分两步走:
成基本延时单元10ms,外循环完成BL10ms的操作。程序
框图如下:
延时程序及延时时间的计算见P154。
BL置初值 说明: ①、本程序实例可作为一个独立
的子程序,可被任何源程序调用。
CX置初值
CX←CX-1 N CX=0?
②循环次数的计算
延时时间 N= 一次循环时间
③、软件延时程序,就是用来拖延时间,
循环控制 AX=0?
N AX左移
停机
定。流程图如下:
程序见P154。 思考:若采用SHL、SHR指令
可行?SAR指令呢?
N CF=1?
置数据块指针
Y 统计值加1
例3:试编程将以DA1为始地址的 数据块全部清0,数据长度不定,仅 知以回车符(0DH)为结束标志。
程序段如下:
取数比较 =0DH? Y
N 停机 清存储单元
调用汇编程序,对源程序进行汇编
结束
修正语 Y 法错误
有语法错误? N
调用连接程序,连接并装
入目标程序
具体操作见P163∽170
运行目标程序
Y 有逻辑错误? N
调程用序调进试行程查序错,和对调目试标
⑤、调用实例(可有可无)。
⑵、子程序说明实例
注意:子程序的说明应以注释的形式写在程序的开关。
; 子程序: DTOB , 将两位组合BCD数转换为二进制数
; 入口参数: AL寄存器存放等转换的BCD(十进制)数
; 出口参数: CL寄存器中存放转换后的二进制数
; 所用寄存器: BX , 未保护
; 执行时间: 0.06ms
④、公用数据区传送。与堆栈传送法类似,主程序和子 程序共同开辟一公用数据区,类同公用信箱,按照预先约定 的规则存取参数。
4、子程序应用举例
例1:利用堆栈传递参数和多个代码段的使用—设计一个 累加求和子程序, 并在主程序中调用它。 本例在数据段定义了两个数组,程序段实现数组分别求和。 主程序和过程分别在两个段中,过程应是FAR类型的。 主程序向过程的参数传递是利用堆栈实现的。程序见P158
存器及其工作单元压入堆栈保护(保护现场), 以免破坏主
程序中的数据; 子程序返回时, 应将压入内容弹回到原来的
寄存器或工作单元中(恢复现场)。例如:
DTOB PROC
POP AX
PUSH BX
POP BX
注意:
出栈的顺序正好
PUSH AX •••
RET DTOB ENDP
与入栈顺序相反。
⑶、参数的传递
①、顺序、分支的共性:每个语词只执行一次。而循环 则是重复执行
②、8086控制循环的指令有:条件转移和循环控制指令。 JCC、LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE、 JCXZ等。
2、循环程序的基本结构
⑴、初始化:为循环做准备工作。如: 初始化部分
设置指针、循环次数及设置变量初值。
修改指针
MOV BX , OFFSET DA1 ;置数据块地址指针
XOR AL , AL
ABS: CMP [BX] , 0DH
JZ STP
;是,转STP处执行
MOV [BX] , AL ;否则,清存储单元
INC BX JMP ABS ;继续
STP: HLT 注:这是一个以设置关键字为控制条件的循环控制程序。
负数? N 循环体 ② CMP AL , 0指令用来设
YБайду номын сангаас
置标志。也可用其它指令。
负数统计值加1
③ 循环控制是采用计数
器。这是一个典型的先 修改针及长度 循环修改 执行后判断的循环程序。
N 计=0?
及循环控制
Y
存结果 循环结束
例2: 统计AX寄存器中“1”的个数,结果放在CX中。
置统计初值
分析:若(AX)=0 ,则不必统计了。 若(AX)≠0 ,可采用移位方法来判
否则将陷入“死循环”。
若循环次数已知 , 可用计数器控制。若未知 , 将视具体
情况设置条件。
3、程序举例 例1:统计数据块中负元素的个数。
置数据地址指针
程序见P152∽153
置数据块长度 初始化 说明:
置统计值初值
① BUF DB –1, – 3 , 5 , 6 , 9
取数并置标志
CUNT EQU $ – BUF 其中的‘$’表示当前值
说明:
① MOV AX , SIZE ARY1 PUSH AX ;SUM过程的入口参数1进栈(即数组长度)
MOV AX , OFFSET ARY1 PUSH AX ;过程的入口参数2进栈(数组起始地址) ② MOV [BX] , AX ;数组之和送到结果区
结果区,即两个数组预留的存储字单元SUM1、SUM2。 ③ RET 4 ;返回并废除参数1和2 指令中的4,称为退栈值。执行该指令,允许在返回地址出
设计子程序时 , 应使其具有通用性 , 且为了使用方便 , 子程序常以文件形式编写。
2、子程序文件 ⑴、子程序说明组成部分
标准子程序应加以文字说明 , 常包括以下内容。 ①、功能描述:子程序名称、功能、性能指标(如执行 时间)。
②、所用寄存器和存储单元(未保护部分)。
③、子程序的入口、出口参数。
④、子程序中所用其它子程序。
一、建立汇编语言的工作环境
1、硬件环境: 汇编语言对机器硬件无特殊要求 , 因此 无需特殊准备。
2、软件环境:应准备以下软件: ① DOS操作系统。用于启动机器,中西文DOS都可以。
② 编辑软件。用于输入和建立源程序。常用的有行编 辑和全屏幕编辑两种。
③ 汇编程序。一般选用宏汇编MASM.EXE。
④ 连接程序。连接程序LINK.EXE将MASM.EXE产生 的机器代码程序(.OBJ)连接成可执行程序(.EXE文件)。 ⑤ 动态调试程序。用于帮助编程者进行程 序的调试、文件格式的转换等。
3、准备工作盘 编程者应将以下工作软件拷入工作盘:
MASM.EXE—宏汇编程序 LINK.EXE—连接程序
EDLIN.EXE—编辑程序(也可选用其它编辑程序) —动态调试程序
二、程序的输入、汇编、连接和调试运行
在DOS环境下,建立和运行汇编语言程序的过程如下:
开始
调用编辑程序,输入或修改源程序 修正或重新设计
因此,既可采用双循环,也可采用单循环。
Y 如:延时时间约1ms的程序如下: BL←BL –1 START: MOV CX , 176H
N BL=0?
Y
结束
LP1:
PUSHF POPF LOOP LP1 HLT
五、子程序设计 1、概念
在汇编语言中,子程序用过程来描述。调用子程序的程 序称为主程序或调用程序。①一个主程序可以多次调用 一个子程序,也可以调用多个子程序; ②一个子程序也可 以被多个主程序调用; ③子程序也可以调用它自已(称递 归调用); ④子程序还可以调用其下级子程序,称为子程序 嵌套, 其嵌套层次不受限制。
()
()