微机原理第六章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第六章
微型计算机的程序设计
6.1 6.2 6.3 程序设计步骤 简单程序 分支程序
6.4
6.5
循环程序
子程序
6.6
查表程序
6.1
程序设计步骤
汇编语言程序设计归纳如下7个步骤: (1)分析问题:要把解决问题所需条件(原始数据、输入和输出 信息等)搞清楚。 (2)建立数学模型:把问题数学化、公式化。 对于不能用数学模型来描述的,需要建立近似数学模型 模拟问题,来实现其目的。 (3)确定算法:算法通常用流程图,按计算机能够接受的方法 进行描述。 (4) 汇制程序流程图:程序流程图是用箭头线段、框图及菱形 图等绘制的一种图,用它把程序内容直接描述出来。 (5)内存空间分配:在编程时,要为程序和数据分配存储空间。 (6)编制程序Baidu Nhomakorabea静态检查:程序的结构要层次简单、清楚、易 读、易维护,最好是模块化和通用子程序结构。 (7) 程序调式。
初始予置SI、DI BX、CX、CF、DF
调过程
二进制加法
十进制调整
存结果修改地址 返回LOOP处
N
CX = 0 ?
Y
结束
mov es, ax mov st, stack MOV SS ,AX MOV SP ,TOP MOV SI ,OFFSET A MOV DI,OFFSET SUM MOV BX,OFFSET B MOV CX,04 CLC CALL AAB MOV AH,4CH INT 21H
6.4
循环程序设计
开始
初始化
循环程序设计分为三部分: 1、设置初始部分:设置循环次数,地址 指针或其它初始状态。 2、循环体:包括工作部分和修改部分。 3、控制部分:控制循环次数。 控制方式有多种: •计数控制:每次循环加或减计数,并判定 总次数以达到控制循环。 •条件控制:在循环时判定某种条件的真假 达到控制循环。 •状态控制:事先设定二进制位的状态,测 试其状态,决定循环。
+
BX+AL
4、执行指令XLAT
求“4”的平方值。 程序如下: MOV BX,2000H 假设这段数据首址的 MOV AL,4 偏移地址为 2000H , XLAT
4、换码指令
XLAT
XLAT的功能是使AL中的内容变换为内存表 格中的某一个值,一般用来实现编码制的转换。 其指令格式: XLAT ;(无操作数指令,隐含) 功能:[(BX)+(AL)] ( AL) 源 目的
根据状态控制循环
BEGIN :IN AL ,52H ;从状态口读 TEST AL ,02 ;测试 D1 = 0 ? JZ BEGIN ;D1 = 0 转,继续查 IN AL ,50H ;D1 = 0,数据口 MOV [DI] ,AL ;数据存内存 INC DI
52H是接口中的状态口,其中D1 位等于1 时,表示CPU可从数据口 读数据。
分别写出实现如下功能的程序段
1. 将AX中间八位,BX低四位,DX高四位拼成 一个新字。结果存放在AX中。 2. 将CX中间八位取反,其余位不变。 3. 对数据段中以BX为偏移地址的连续三个单元 (字节)中的无符号数求和。结果存放在后 续两个单元中。 4. 对数据段中以BX为偏移地址的连续四单元 (字节)的内容颠倒来。 5. 将BX中的四位压缩BCD数用非压缩BCD数 形式按序放在AL,BL,CL和DL中。 6. 不用乘法指令实现AL(无符号数)乘以20。
MOV ES:[SI], BL ADD [BP+500H], AH SUB [SI-300H], AL MOV [DI+1000H], DL
MOV [BX-8], CL
MOV ES:[DI+1000H], CH
MOV [BP+SI], DH
MOV [BX+DI], DL
• • • • • •
指出下列指令是否合法: MOV AX, DL MOV [BX], 5 ADD AX, 5 MOV DS, 1000H PUSH CH POP CS ADD ES, AX MOV SS, CS DEC BX INC[BX]
AX BX CX BX AX DX
• 已知字变量W1和W2分别存放着两个压缩 BCD数,编写求两数之和,并将其和送到 SUM字节变量中的程序。 • 字变量W和字节变量B分别存放着两个非压 缩BCD数,编写求两数之积,并将它存储 到JJ字节变量中的程序。
AAB ADI:
PROC
NEAR
MOV AL,[SI] ADC AL ,[BX] DAA MOV [DI],AL INC SI INC DI
INC BX
LOOP ADI RET AAB ENDP CODE ENDS
END START
1.子程序调用与返回 子程序调用与返回由CALL和RET指令实现。 2.在编写实际子程序时要注意一列问题: (1)入口信息。 (2)出口信息。 (3)现场的保护和恢复。 (4)最后一条一定是RET指令。 (5)子程序说明: ①子程序名; ②功能、技术指标(如执行时间等); ③占寄存器和存储单元; ④入口、出口参数; ⑤嵌套哪些子程序。
例:用子程序调用实现1S的延时,子程序延时时间是1mS。 LP2: MOV CX, CALL LOOP HLT PROC PUSH MOV NOP LOOP NOP NOP POP CX RET ENDP 3E8H DELY LP2 NEAR CX CX, LP1
DELY
4DBH
LP1:
6.6 查表程序
循环体
修改部分
Y
控制
N 结束
例3、 累加从地址 01000H开始的 5 个字的內容, 并将和存入SUM单 元(一个字长) 开始
Dt segment 01000H→ 23H 初始 SI、 ORG 1000H 01H CX AB DW 0123H,2A00H,52EFH 01002H→ 00H 2AH DW 0700H,7255H 01004H→ EFH 相加 SUM DW ? 52H Dt ends 01006H→ 00H 07H Code segment 修改 SI 01008H→ 55H assume cs: code 72H assume ds:data 0100AH→ N CX = 0? START:MOV AX ,DATA 0100BH→ MOV DS ,AX Y MOV CX ,05 SUM 结束 MOV AX ,0 和存 SUM 控制计数循环 LEA SI ,AB
6.3 分 支 程 序
例2 检查输入的字符,如果输入字符为A则显示, 否则循环等待。
输入字符
STA: MOV INT CMP JZ JMP DISY:MOV MOV INT HLT
AH ,07H 21H;键入Ctr-Break结束 N 是否为 A? AL,41H Y DISY STA 显示A AH,02H N 条件 Y DL,AL 结 束 21H 执行A 执行B
6.2 简 单 程 序(顺序)程序设计 程序设计举例 例1 编程计算 80H×(30H+20H) S = Data segment 185H S DW ?,? 加法ADD 顺序程序要考虑以下内容: Data ends 1、组织初始、中间、结果数据。 乘法 MOV AL ,30H 2、计算的顺序,用变量、寄存器、 ADD AL ,20H 还是堆栈保存中间结果。 扩展 MOV BL ,80H MUL BL ;结果在AX中。 MOV BX , 185H 除法 SUB DX , DX ; 扩展被除数为双字/字 DIV BX 存结果 MOV S , AX ;存商。S为结果数据的符号地址 结束 MOV S + 2 , DX ;存余数 HLT
….
Y
输入状态
测试 D1
D1 = 0 ?
N
输入数据
….
存内存
例6.6 要求设计一个软件延时程序,延时时间约 1mS左右。
分析题目:让计算机做一些无用的 操作,主要是用来拖延时间。完 成1mS的延时。 计算:通过一些无用的操作的时钟 周期,和一共要延时的时间计算 出循环次数。 采用PUSHF(10),和POPF(8) 作为循环体。LOOP指令的时钟 周期为(3.4)。需要的循环次数: X=延时时间/一次循环时间
例题:利用XLAT指令,将任意一位十进 制数 转换成相对应的ASCII码。
作业1:用十六进制数填写下表.已知 DS=1000H,ES=2000H,SS=0FCH,其余通用寄存器值 为0 作业2:5-1
指令
SUB [BP], AL MOV [BX], BH
存储器操作数的逻辑地址
MOV [DI], DL
LOOP REG 此题,若累加和超出一个字,应开始: MOV SUM ,AX MOV SUM+2,DX SUM DW ?,? MOV AH ,4CH MOV DX ,0 INT 21H 在REG:ADD AX ,[SI]后加 ADC DX ,0
根据条件控制循环
(AX为带符号数)
初始 CX = 0
例4、 编程序统计 AX 寄存器中 1 的个数。 (采用 AX = 0?做为循环的条件) Y code segment AX = 0 ? assume cs: code N START: MOV CX , 0 ;存 1 的个数 逐位移到最高位 AGAIN: TEST AX , 0FFFFH JZ B SAL AX , 1 N CF = 1 ? JNC A Y INC CX A: JMP AGAIN CX+1 B: MOV AH ,4CH 继续 INT 21H CODE ENDS 结束 END START
•假设用户程序装入内存后SS=095BH,SP=40H, 问该用户程序的可用栈底部物理地址是多少?
•设AX=1122H、BX=3344H、 PUSH CX=5566H、SS=095BH、SP=40H, PUSH 下述程序执行后AX、BX、CX、 PUSH DX等通用寄存器的内容是多少? POP 画出堆栈存储器的逻辑地址及其 POP POP 存储器内容和SP指向示意图。
MOV BX, LP2: MOV CX, LP1: PUSHF POPF LOOP DEC BX JNZ HLT LP2 LP1 3E8H 176H
6.5 子
程
序
例5、做十进制加法 44332211+88776655
data segment A DB 11H,22H,33H,44H B DB 55H,66H,77H,88H SUM DB 20 DUP (?) data ends stack segment STA DB 20 DUP (?) TOP EQU LENGTH STA stack ends code segment ASSUME CS:CODE,DS:DATA ASSUME SS:STACK START: mov ax, data mov da, ax
开始 设置CX(循环次数)
循环体
否
CX←CX-1 判断CX=0 是 暂停
START: MOV LP1: PUSHF POPF LOOP HLT
CX, 176H
LP1
假设要延时1S。 若是以前循环体,则 需循环373832次。而 CX的取值范围是0~ 65535。因此需要用 到多重循环。需要增 加一个循环计数器。
用十六进制写出下列程序每条指令执行后AX的 AX, 0 AX: 值 MOV DEC AX AX:
ADD ADC NEG OR AND XCHG SHL RCL
AX, AX, AX AX, AX, AH, AX, AX,
7FFFH 1 3FDFH 0EBEDH AL 1 1
AX: AX: AX: AX: AX: AX: AX: AX:
用汇编语言编制计算较为复杂函数(如sin x) 的程序时,通常采用查表方法。例:
【例6.9】 用查表程序方法。求X2。(假定X≥0,且为整数)。 BX AL 其操作步骤如下: 1 、将平方表定位到某个逻辑段 的一片连续地址中, 2、将其表首址的偏移量置入BX。 3、将变量值装入到AL寄存器中。 00H 01H 04H 09H 10H ┋ BX+0H BX+1H BX+2H BX+3H BX+4H ┋ BX+AL
若用ADD SI ,2,则 : REG:ADD AX ,[SI] PUSHF INC SI ;修改指针 ADD SI ,2 INC SI ; POPF LOOP REG;CX-1,CX≠0 因为ADD影响 CF 循环. MOV SUM ,AX 控制计数循环 CODE ENDS INC SI INC SI END START
微型计算机的程序设计
6.1 6.2 6.3 程序设计步骤 简单程序 分支程序
6.4
6.5
循环程序
子程序
6.6
查表程序
6.1
程序设计步骤
汇编语言程序设计归纳如下7个步骤: (1)分析问题:要把解决问题所需条件(原始数据、输入和输出 信息等)搞清楚。 (2)建立数学模型:把问题数学化、公式化。 对于不能用数学模型来描述的,需要建立近似数学模型 模拟问题,来实现其目的。 (3)确定算法:算法通常用流程图,按计算机能够接受的方法 进行描述。 (4) 汇制程序流程图:程序流程图是用箭头线段、框图及菱形 图等绘制的一种图,用它把程序内容直接描述出来。 (5)内存空间分配:在编程时,要为程序和数据分配存储空间。 (6)编制程序Baidu Nhomakorabea静态检查:程序的结构要层次简单、清楚、易 读、易维护,最好是模块化和通用子程序结构。 (7) 程序调式。
初始予置SI、DI BX、CX、CF、DF
调过程
二进制加法
十进制调整
存结果修改地址 返回LOOP处
N
CX = 0 ?
Y
结束
mov es, ax mov st, stack MOV SS ,AX MOV SP ,TOP MOV SI ,OFFSET A MOV DI,OFFSET SUM MOV BX,OFFSET B MOV CX,04 CLC CALL AAB MOV AH,4CH INT 21H
6.4
循环程序设计
开始
初始化
循环程序设计分为三部分: 1、设置初始部分:设置循环次数,地址 指针或其它初始状态。 2、循环体:包括工作部分和修改部分。 3、控制部分:控制循环次数。 控制方式有多种: •计数控制:每次循环加或减计数,并判定 总次数以达到控制循环。 •条件控制:在循环时判定某种条件的真假 达到控制循环。 •状态控制:事先设定二进制位的状态,测 试其状态,决定循环。
+
BX+AL
4、执行指令XLAT
求“4”的平方值。 程序如下: MOV BX,2000H 假设这段数据首址的 MOV AL,4 偏移地址为 2000H , XLAT
4、换码指令
XLAT
XLAT的功能是使AL中的内容变换为内存表 格中的某一个值,一般用来实现编码制的转换。 其指令格式: XLAT ;(无操作数指令,隐含) 功能:[(BX)+(AL)] ( AL) 源 目的
根据状态控制循环
BEGIN :IN AL ,52H ;从状态口读 TEST AL ,02 ;测试 D1 = 0 ? JZ BEGIN ;D1 = 0 转,继续查 IN AL ,50H ;D1 = 0,数据口 MOV [DI] ,AL ;数据存内存 INC DI
52H是接口中的状态口,其中D1 位等于1 时,表示CPU可从数据口 读数据。
分别写出实现如下功能的程序段
1. 将AX中间八位,BX低四位,DX高四位拼成 一个新字。结果存放在AX中。 2. 将CX中间八位取反,其余位不变。 3. 对数据段中以BX为偏移地址的连续三个单元 (字节)中的无符号数求和。结果存放在后 续两个单元中。 4. 对数据段中以BX为偏移地址的连续四单元 (字节)的内容颠倒来。 5. 将BX中的四位压缩BCD数用非压缩BCD数 形式按序放在AL,BL,CL和DL中。 6. 不用乘法指令实现AL(无符号数)乘以20。
MOV ES:[SI], BL ADD [BP+500H], AH SUB [SI-300H], AL MOV [DI+1000H], DL
MOV [BX-8], CL
MOV ES:[DI+1000H], CH
MOV [BP+SI], DH
MOV [BX+DI], DL
• • • • • •
指出下列指令是否合法: MOV AX, DL MOV [BX], 5 ADD AX, 5 MOV DS, 1000H PUSH CH POP CS ADD ES, AX MOV SS, CS DEC BX INC[BX]
AX BX CX BX AX DX
• 已知字变量W1和W2分别存放着两个压缩 BCD数,编写求两数之和,并将其和送到 SUM字节变量中的程序。 • 字变量W和字节变量B分别存放着两个非压 缩BCD数,编写求两数之积,并将它存储 到JJ字节变量中的程序。
AAB ADI:
PROC
NEAR
MOV AL,[SI] ADC AL ,[BX] DAA MOV [DI],AL INC SI INC DI
INC BX
LOOP ADI RET AAB ENDP CODE ENDS
END START
1.子程序调用与返回 子程序调用与返回由CALL和RET指令实现。 2.在编写实际子程序时要注意一列问题: (1)入口信息。 (2)出口信息。 (3)现场的保护和恢复。 (4)最后一条一定是RET指令。 (5)子程序说明: ①子程序名; ②功能、技术指标(如执行时间等); ③占寄存器和存储单元; ④入口、出口参数; ⑤嵌套哪些子程序。
例:用子程序调用实现1S的延时,子程序延时时间是1mS。 LP2: MOV CX, CALL LOOP HLT PROC PUSH MOV NOP LOOP NOP NOP POP CX RET ENDP 3E8H DELY LP2 NEAR CX CX, LP1
DELY
4DBH
LP1:
6.6 查表程序
循环体
修改部分
Y
控制
N 结束
例3、 累加从地址 01000H开始的 5 个字的內容, 并将和存入SUM单 元(一个字长) 开始
Dt segment 01000H→ 23H 初始 SI、 ORG 1000H 01H CX AB DW 0123H,2A00H,52EFH 01002H→ 00H 2AH DW 0700H,7255H 01004H→ EFH 相加 SUM DW ? 52H Dt ends 01006H→ 00H 07H Code segment 修改 SI 01008H→ 55H assume cs: code 72H assume ds:data 0100AH→ N CX = 0? START:MOV AX ,DATA 0100BH→ MOV DS ,AX Y MOV CX ,05 SUM 结束 MOV AX ,0 和存 SUM 控制计数循环 LEA SI ,AB
6.3 分 支 程 序
例2 检查输入的字符,如果输入字符为A则显示, 否则循环等待。
输入字符
STA: MOV INT CMP JZ JMP DISY:MOV MOV INT HLT
AH ,07H 21H;键入Ctr-Break结束 N 是否为 A? AL,41H Y DISY STA 显示A AH,02H N 条件 Y DL,AL 结 束 21H 执行A 执行B
6.2 简 单 程 序(顺序)程序设计 程序设计举例 例1 编程计算 80H×(30H+20H) S = Data segment 185H S DW ?,? 加法ADD 顺序程序要考虑以下内容: Data ends 1、组织初始、中间、结果数据。 乘法 MOV AL ,30H 2、计算的顺序,用变量、寄存器、 ADD AL ,20H 还是堆栈保存中间结果。 扩展 MOV BL ,80H MUL BL ;结果在AX中。 MOV BX , 185H 除法 SUB DX , DX ; 扩展被除数为双字/字 DIV BX 存结果 MOV S , AX ;存商。S为结果数据的符号地址 结束 MOV S + 2 , DX ;存余数 HLT
….
Y
输入状态
测试 D1
D1 = 0 ?
N
输入数据
….
存内存
例6.6 要求设计一个软件延时程序,延时时间约 1mS左右。
分析题目:让计算机做一些无用的 操作,主要是用来拖延时间。完 成1mS的延时。 计算:通过一些无用的操作的时钟 周期,和一共要延时的时间计算 出循环次数。 采用PUSHF(10),和POPF(8) 作为循环体。LOOP指令的时钟 周期为(3.4)。需要的循环次数: X=延时时间/一次循环时间
例题:利用XLAT指令,将任意一位十进 制数 转换成相对应的ASCII码。
作业1:用十六进制数填写下表.已知 DS=1000H,ES=2000H,SS=0FCH,其余通用寄存器值 为0 作业2:5-1
指令
SUB [BP], AL MOV [BX], BH
存储器操作数的逻辑地址
MOV [DI], DL
LOOP REG 此题,若累加和超出一个字,应开始: MOV SUM ,AX MOV SUM+2,DX SUM DW ?,? MOV AH ,4CH MOV DX ,0 INT 21H 在REG:ADD AX ,[SI]后加 ADC DX ,0
根据条件控制循环
(AX为带符号数)
初始 CX = 0
例4、 编程序统计 AX 寄存器中 1 的个数。 (采用 AX = 0?做为循环的条件) Y code segment AX = 0 ? assume cs: code N START: MOV CX , 0 ;存 1 的个数 逐位移到最高位 AGAIN: TEST AX , 0FFFFH JZ B SAL AX , 1 N CF = 1 ? JNC A Y INC CX A: JMP AGAIN CX+1 B: MOV AH ,4CH 继续 INT 21H CODE ENDS 结束 END START
•假设用户程序装入内存后SS=095BH,SP=40H, 问该用户程序的可用栈底部物理地址是多少?
•设AX=1122H、BX=3344H、 PUSH CX=5566H、SS=095BH、SP=40H, PUSH 下述程序执行后AX、BX、CX、 PUSH DX等通用寄存器的内容是多少? POP 画出堆栈存储器的逻辑地址及其 POP POP 存储器内容和SP指向示意图。
MOV BX, LP2: MOV CX, LP1: PUSHF POPF LOOP DEC BX JNZ HLT LP2 LP1 3E8H 176H
6.5 子
程
序
例5、做十进制加法 44332211+88776655
data segment A DB 11H,22H,33H,44H B DB 55H,66H,77H,88H SUM DB 20 DUP (?) data ends stack segment STA DB 20 DUP (?) TOP EQU LENGTH STA stack ends code segment ASSUME CS:CODE,DS:DATA ASSUME SS:STACK START: mov ax, data mov da, ax
开始 设置CX(循环次数)
循环体
否
CX←CX-1 判断CX=0 是 暂停
START: MOV LP1: PUSHF POPF LOOP HLT
CX, 176H
LP1
假设要延时1S。 若是以前循环体,则 需循环373832次。而 CX的取值范围是0~ 65535。因此需要用 到多重循环。需要增 加一个循环计数器。
用十六进制写出下列程序每条指令执行后AX的 AX, 0 AX: 值 MOV DEC AX AX:
ADD ADC NEG OR AND XCHG SHL RCL
AX, AX, AX AX, AX, AH, AX, AX,
7FFFH 1 3FDFH 0EBEDH AL 1 1
AX: AX: AX: AX: AX: AX: AX: AX:
用汇编语言编制计算较为复杂函数(如sin x) 的程序时,通常采用查表方法。例:
【例6.9】 用查表程序方法。求X2。(假定X≥0,且为整数)。 BX AL 其操作步骤如下: 1 、将平方表定位到某个逻辑段 的一片连续地址中, 2、将其表首址的偏移量置入BX。 3、将变量值装入到AL寄存器中。 00H 01H 04H 09H 10H ┋ BX+0H BX+1H BX+2H BX+3H BX+4H ┋ BX+AL
若用ADD SI ,2,则 : REG:ADD AX ,[SI] PUSHF INC SI ;修改指针 ADD SI ,2 INC SI ; POPF LOOP REG;CX-1,CX≠0 因为ADD影响 CF 循环. MOV SUM ,AX 控制计数循环 CODE ENDS INC SI INC SI END START