微机原理第八章微型计算机的程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
共同点:均受CX或EXC的值控制,详见P214-215
29
8.3.3 单重循环设计举例
例8.11 计算Z=X+Y,其中X和Y是双字变量 分析:双字变量是4个字节,则和可能占5 个字节
30
31
32
33
34
35
36
37
38
作业8.4 编写求两个4位非压缩BCD数之和, 将和送显示器显示的程序。(P261)
43
例6.2
将内存(10050)单元的内容拆成两段,每段4位,并将它 们分别 存入内存(10051)和(10052)单元。即(10050) 单 元 中 的 低 4 位 放 入 ( 10051 ) 单 元 中 的 低 4 位 , 而
(10050)单元中的高4位放入(10052)单元中的低4位。
开始 初始化 用间址方法取数到AL 用AND指令将该数“与”OFH取得 低4位,存入内存(10051)单元 再取出原始数到AL 逻辑右移得高4位,存入内存(10052)单元
• • ADD AL,AH; AL=8AH DAA ;AL=90H
8
AAA-----两个非压缩BCD数相加调
整指令
若(AL&0FH)>9或AF=1,则(AL+6)&0FH送AL,AH 加1且CF置1; 否则:(AL&0F0H)送AL,AH不变且CF保持0不变;
如:MOV AX,0806H
• ADD AL,AH ; AL=0EH, AH=08H(没变) • MOV AH,0 • AAA ;属于第1种情况,故AL为(AL+6) &0F=14H&0FH=04H; AH=01H
9
【例8.1】的程序段为:
• • • • • • • • • stack segment stack ‘stack dw 32 dup(0) stack stack ends data segment W1 DW 8931H W2 DW 5678H SUM DB 3 DUP(0) data ends code segment
11
例8.2 非压缩BCD数W1与W2(均为字变量)相加, 将其和送到SUM字节变量中。
• • • • data segment W1 DW 0809H ;即89D W2 DW 0607H ;即67D SUM DB 3 DUP(0)
• ;一个字节放1位BCD码,用来放加完后的值156 • data ends
AAS-----两个非压缩BCD数相减调整指令
14
3. 非压缩BCD数乘除法调整指令 AAM和AAD(P199,自看)
15
顺序程序设计举例: 例7.7 镜子程序,P183-184
• • • • data segment OBUF DB ‘>’ 0DH, 0AH, ‘$’ IBUF DB 0FFH, 0, 255 DUP(0) data ends
13
2. BCD数减法调整指令DAS和 DAA(自看,P198)
DAS-----两个压缩BCD数相减调整指令: (AL&0FH)>9,则AL减6; (AL&0F0H)>90H,则AL减60H; 如:MOV AX,5634H
• • SUB AL,AH; AL=DEH, 有借位 DAS ;AL=78H,保持借位即134-56
• • • •
MOV CX, 4 MOV SI, 0 MOV DI, 4; XOR AX, AX;
39
要在[SUM+4]中放个位,[SUM+0]中放最高位的进位。 清CF
A1:
MOV AL, BYTE PTR W1[SI]; ADC AL, BYTE PTR W2[SI] AAA MOV SUM[DI], AL INC SI DEC DI LOOP A1 MOV SUM[DI], 0 RCL SUM[DI] ; 以上是得到加的结果,放在SUM中。下面是输出到显示器的程序语句 MOV DX, OFFSET SUM MOV AH, 09 INT 21H
1
第八章 微型计算机的程序设计
顺序结构程序 分支结构程序 循环结构程序 子程序结构
2
重点:
程序设计方法 顺序结构程序
分支结构程序
循环结构程序 子程序结构
3
8.1 程序设计步骤
1.分析问题 2.建立数学模型 3.确定算法 4.绘制程序流程图 5.内存分配 6.编制程序 7.程序调试
12
MOV AX, W1 ;AX=0809H,W2为0607H ADD AL, BYTE PTR W2 ;AL=10H, CF=0,AF=1 AAA ; 属于第一种情况,故 ; AL为(AL+06H)&0FH=10H+06H )&0FH ; =16H&0FH=06H=AL; ;AH加1且CF置CF=1,所以AH=08H+1=09H,则AX=0906H MOV SUM, AL ;(SUM)=06H MOV AL,AH; AL=09H ADD AL, BYTE PTR W2+1 此句也可表达为MOV [SUM], AL; ; AL=09H+06H=0FH,属于第1种情况 见P151 MOV AH, 0 AAA ; AL=05H, AH=01H ;第一种情况处理:AL=(AL+06H)&0FH, 因0FH+06H=15H,故 AL=05H,AH=AH+1=0+1=01H,所以AX=0105H MOV WORD PTR SUM+1, AX ;(SUM+1)=05,(SUM+2)=01
16
MOV MOV INT MOV MOV INT MOV MOV MOV MOV MOV INT MOV MOV INT
DX , OFFSET OBUF ; 显示提示符“>”并回车换行 AH , O9 21H DX , OFFSET IBUF ; 输入并显示字符串 AH , 10 21H BL, IBUF+1 BH, 0 IBUF[BX+2], ‘$’ DL, 0AH ; 换行 AH, 2 21H DX , OFFSET IBUF+2 ; 再显示输入的字符串 AH, 9 21H
5
8-1 顺序程序设计
补充:二进制编码的十进制数
①压缩BCD码 是用4位二进制数表示一位十进制数。一个字节 表示两位十进制数。 如:1001 0110B 表示 96 D ②非压缩BCD码 是用一个字节表示一位十进制数。高4位总是 0。 如: 0000 1001B 表示 9D 两种BCD码的编码对照表
…
0000 0000 0000 0001 0000 0010
7
1. BCD数加法调整指令DAA和AAA (P196)
DAA-----两个压缩BCD数相加调整指令: (AL&0FH)>9或者AF=1,则AL加6; (AL&0F0H)>90H或CF=1,则AL加60H; 如:MOV AX,3456H
二进制编码的十进制数 就是BCD码(Binary Coded Decimal)。
6
两种BCD码的编码对照表
十进制数 0 1 2 3 … 9 10 11 12
…
压缩 BCD 码 0000 0001 0010 0011 … 1001 0001 0000 0001 0001 0001 0010
…
非压缩 BCD 码 0000 0000 0000 0001 0000 0010 0000 0011 … 0000 1001 0000 0001 0000 0001 0000 0001
考虑到进位,和要5个字节单元,另外,输出到显 示器的结束符号’$’需要一个单元存放,故共需6 个字节。 因此,数据段定义为: data segment W1 DD 01020304H W2 DD 05060708H SUM DB 5 DUP(0) DB ‘$’ data ends
分析:两加数各要4个字节单元,可以为DΒιβλιοθήκη Baidu类型;
代码段中的 核心语句
42
作业8.17 编写求输入算式’加数1+加数2’的和并送显。 (加数及其和均为4位(即指压缩)BCD数,P262)
分析:要求先有屏幕显示输出‘加数1+加 数2:’,然后从键盘输入两个4个字节的 BCD数,加完后送显。 用到的变量:W1和W2因为从键盘输入,均 不确定是几位十进制,故需确定其最大位 数不超过要用 W1
44
暂停
45
程序段如下:
MOV AX, 1000H MOV DS, AX ;给段寄存器DS赋值 MOV SI, 50H MOV AL,[SI] ;把物理地址为10000H+0050H=10050H ; 中的存储内容给AL AND AL, 0FH ;把AL中的前4位清0,取得低4位值 MOV [SI+1], AL;把得到的低4位放到(10051H)单元 MOV AL, [SI] ;再取出需拆字节放到AL中 MOV CL, 4 AND AL, F0H SHR AL, CL ;逻辑右移4次,前4位补0; MOVE [SI+2], MOV [SI+2], AL ;放入( 10052 )单元 AL
22
23
24
25
26
8.3 循环程序设计
27
28
8.3.2 重复控制指令
1. 2. 3.
4.
5.
LOOP short-label LOOPZ short-label 或 LOOPE short-label LOOPNZ short-label 或LOOPNE short-label JCXZ short-label JECXZ short-label
分析:两个加数各要2个字节单元,可以为DW类
• • • •
MOV CX, 2 MOV SI, 0 MOV DI, 2; XOR AX, AX;
41
要在[SUM+2]中放个位,[SUM+0]中放最高位的进位。 清CF
A1:
MOV AL, BYTE PTR W1[SI]; ADC AL, BYTE PTR W2[SI] DAA MOV SUM[DI], AL INC SI DEC DI LOOP A1 MOV SUM[DI], 0 RCL SUM[DI] ; 以上是得到加的结果,放在SUM中。下面是输出到显示器的程序语句 MOV DX, OFFSET SUM MOV AH, 09 INT 21H
begin proc far assume ss: stack, cs: code, ds:data push ds sub ax, ax push ax
10
mov ax, data mov ds, ax MOV AL, BYTE PTR W1 ;AL=31H (+78H) ADD AL, BYTE PTR W2 ;AL=A9H, CF=0,AF=0 DAA ;BCD数加法调整指令; AL=09H, CF=1 MOV SUM, AL MOV AL, BYTE PTR W1+1 ; AL=89H (+56H) ADC AL, BYTE PTR W2+1 ;AL=E0H,CF=0,AF=1 DAA ; AL=46H, CF=1 MOV SUM+1, AL MOV SUM+2, 0 ;处理向万位的进位 RCL SUM+2, 1 ;也可用指令ADC SUM+2, 0 ret begin endp code ends end begin
4
data segment 数据段 a1 db 'hellon!',0dh,0ah,'$' data ends Stack1 segment para stack …….. 堆栈段 Stack1 ends code segment assume cs:code,ds:data, ss:stack1 start:mov ax,data 代码段 mov ds,ax mov ah,4ch int 21h 看一个例子 code ends end start
代码段中的 核心语句
40
作业8.5 编写求两个4位压缩BCD数之和,将 和送显示器显示的程序。(P261)
型;考虑到进位,和要3个字节单元,另外,输出 到显示器的结束符号’$’需要一个单元存放,故共 需4个字节。 因此,数据段定义为: data segment W1 DW 1234H W2 DW 5678H SUM DB 3 DUP(0) DB ‘$’ data ends
17
8.2 分支程序设计
特点:利用改变标志位的指令和转移指令 来实现。 1. 无条件转移指令:JMP (见P207) 2. 条件转移指令:Jcond short-label(偏移 地址送到IP) 特点:满足条件,则实现段内转移;80386开 始才可以转移到代码段的任何位置。
18
19
20
21