微机原理第六章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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
相关文档
最新文档