资源描述
微机原理第五章: 程序设计
第五章 程序设计的基本方法
§5.1 基本源程序结构
一: 过程定义法 ( P137)
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA
START PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV ES, AX ; 上述为固定写法
程序正文
RET ; 过程返回到DOS
START ENDP ; 结束过程定义
CODE ENDS ; 结束代码段
END START ; 结束汇编
二: 主程序定义法 (P138)
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DAT
MAIN: MOV AX, DATA
MOV DS, AX
MOV ES, AX
程序正文
MOV AH, 4CH
INT 21H ; 21H号中断退出到DOS
CODE ENDS ; 结束代码段
END MAIN ; 结束汇编
§5.2 基本程序设计
一: 顺序程序设计
1: 特点: IP值线性增加
0
1
8
27
64
125
216
6
216
2:用查表法求Z= X的立方值 TABLE 0
A: 定义数据段 1
DATA SEGMENT 2
TABLE DB 0, 1, 8, 27, 64, 125, 216 3
XVAL DB 6 4
YVAL DB ? 5
DATA ENDS 6
B: 定义堆栈段
一般不定义, 由汇编程序自动生成
C: 定义代码段
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DATA
MOV DS, AX
LEA BX, TABLE
MOV AL, XVAL
XLAT
MOV YVAL, AL
RET
START ENDP
CODE ENDS
END START
3: 已知一个长度为100个字节的数据块存放在2000H:1000H开始的地址中,现要将该数据块移动到2000H:1010H开始的地址中,用串传送指令编写完整的汇编语言源程序。
DATA SEGMENT AT 2000H
ORG 1000H
AVR1 DB 100 DUP(?)
ORG 1010H
AVR2 DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, ES:DATA
MAIN PROC FAR
PUSH DS
MOV AX, 0
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV ES, AX
LEA SI, AVR1
LEA DI, AVR2
MOV CX, 100
ADD SI, 99
ADD DI, 99
STD ; DF = 1
REP MOVSB
RET
MAIN ENDP
CODE ENDS
END MAIN
二: 条件程序设计
1: 特点: IP值受条件转移指令的影响而跳变
2: 实现表达式 1 ( X> 0)
Y = 0 (X = 0) X在-128 ~ +127之间
-1 (X <0)
A: 波形图 Y
1
-1 X
B: 流程图
X → (AL)
X ≥ 0
Y
X = 0
N N
Y = -1
Y = 1
Y = 0
Y
C: 源程序
DATA SEGMENT
X DB -3
Y DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE; DS:DATA
MAIN PROC NEAR
PUSH DS
XOR AX, AX
PUSH AX
MOV AX, DATA
MOV DS, AX
MOV AL, X
CMP AL, 0
JGE BIGER
MOV AL, 0FFH ;-1的补码为FFH
MOV Y, AL ; Y = -1
JMP NEXT
BIGER: JE EQUL ; Y = 1 或Y = 0
MOV AL, 1
MOV Y, AL ; Y = 1
JMP NEXT
EQUL: MOV Y, AL ; Y = 0
NEXT: RET
MAIN ENDP
CODE ENDS
END MAIN
三: 循环程序设计
1: 特点: IP值受计数器CX中的值的变化而改变
2: 计算 100
S = ∑ i
i = 1
A: 流程图
和清0 → AX
计数初值100 →CX
SUM = (AX)
(CX) = 0
(CX) = (CX) - 1
(AX) = (AX) + (CX)
N
Y
B: 源程序
DATA SEGMENT
SUM DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE; DS: DATA
MAIN: MOV AX, DATA
MOV DS, AX
MOV AX, 0
MOV CX, 100
AGAIN: ADD AX, CX
DEC CX
JNZ AGAIN
MOV SUM, AX
MOV AH, 4CH
INT 21H
CODE ENDS
END MAIN
§5.5 实用程序设计
一: 代码转换程序
数的各种进制表示之间的转换
例5.19 输入十进制数, 输出转换后的十六进制数表示
例5.20 输入十六进制数, 输出转换后的十进制数表示
《例5.19》十进制数到十六进制数的转换
1: 功能
A: 从键盘输入小于65535的十进制数
B: 显示输入数的十六进制表示
注: 输入12(回车), 显示000C. 输入45678(回车), 显示B26E
2: 流程图(223页, 图5.33)
A: 调用过程KEYDTOB
将输入的十进制数转换为二进制数
B: 调用过程CRLF
将当前光标移动到下列首行
C: 调用过程BTOHSCR
将二进制数转换为十六进制字符并显示
D: 调用过程CRLF
将当前光标移动到下列首行
E: 跳转为死循环, Ctrl_break退出
3: 特点
A: 单模块(文件) 管理, 多过程外理
B: 无数据段定义
C: 代码段由多个过程组成
1): 一个主过程MAIN
2): 三个子过程KEYDTOB, BTOHSCR, CRLF
4: 主过程MAIN
MAIN PROC FAR
REPEAT: CALL KEYDTOB
CALL CRLF
CALL BTOHSCR
CALL CRLF
JMP REPEAT
MAIN ENDP
5: 子过程KEYDTOB
ü 入口参数: 输入0 ~ 9的ASCII码 → AL
ü 出口参数: 转换为二进制 → BX
KEYDTOB PROC NEAR
MOV BX, 0 ; 出口参数寄存器BX清0
KEYIN: MOV AH, 01H
INT 21H ; 键入字符ASCII码到AL
SUB AL, 30H ;30H ~ 39H减30H后为0 ~ 9
CMP AL, 0
JL EXIT ; 键入小于0的字符退出
CMP AL, 9
JG EXIT ; 键入大于9的字符退出
MOV AH, 0
XCHG AX, BX
MOV CX, 10
MUL CX
XCHG AX, BX
ADD BX, AX ; 完成(AX) = (AX) * 10
JMP KEYIN
EXIT: RET
KEYDTOB ENDP
ü 键入47(回车) 后, BX中值的分析
A: 键入4, (AL) = 4, (AX) = 4, (BX) = 0
XCHX AX, BX (AX) = 0, (BX) = 4
MUL CX (AX) = 0, (BX) = 4
XCHX AX, BX (AX) = 4, (BX) = 0
ADD BX , AX (AX) = 4, (BX) = 4
B: 键入7, (AL) = 7, (AX) = 7, (BX) = 4
XCHX AX, BX (AX) = 4, (BX) = 7
MUL CX (AX) = 40, (BX) = 7
XCHX AX, BX (AX) = 7, (BX) = 40
ADD BX , AX (AX) = 7, (BX) = 47 = 00101111B = 2FH
6: 子过程 BTOHSCR
¨ 入口参数: BX中的二进制数
¨ 出口参数: 十六进制数的ASCII码 → DL
BTOHSCR PROC NEAR
MOV CH, 4 ;BX中含4个十六进制数
ROTATE: MOV CL, 4 ; 位移值放CL
ROL BX , CL ;小循环4位,即BX中高4位移到低4位
P4
P3
P2
P1
;BX =
P3
P2
P1
P4
;BX =
P1
P4
MOV AL, BL ; AL =
00H
P4
AND AL, 0FH ; AL =
ADD AL, 30H ;十六进制数中,0~9的ASCII码为30H~39H
CMP AL, 3AH
JL PRINT ;于3AH, 为数0 ~ 9
ADD AL, 07H ;大于39H,为数A~F,ASCII码值为41H~ 46H
PRINT: MOV DL, AL
MOV AH, 02H
INT 21H ; 显示字符0 ~ 9及A ~ F
DEC CH
JNZ ROTATE ; 循环显示4次
RET
BTOHSCR ENDP
6: 子过程CRLF
ü 无入口, 出口参数, 功能为回车换行
CRLF PROC NEAR
MOV DL, 0DH ; 0DH为回车的ASCII码
MOV AH, 02H
INT 21H
MOV DL, 0AH ; 0AH为换行的ASCII码
MOV AH, 02H
INT 21H
RET
CRLF ENDP
7: 汇编源程序结构
DECTOHEX SEGMENT
ASSUME CS:DECTOHEX
MAIN PROC FAR
MAIN ENDP
KEYDTOB PROC NEAR
KEYDTOB ENDP
BTOHSCR PROC NEAR
BTOHSCR ENDP
CRLF PROC NEAR
CRLF ENDP
DECTOHEX ENDS
END MAIN
二: 数表的处理
数表中数的插入, 删除, 排序, 检索等处理
《例5.24》气泡法排序程序
1: 功能
表中数据从乱序25, 46, 3, 75, 5, 30到升序 3, 5, 25, 30, 46, 75
2: 方法
A: 全比较法
若表数据项为N
1): 第一次, 经比较将最小数放入表顶
2): 第二次, 经比较将次小数放入表次顶
.
3): 第N-1次, 经比较将最大数放入表底
注: N项数将进行N-1次排序操作
B: 标志位识别法
设排序标志F
1): 若标志F = -1, 进行比较排序程序
2): 若标志F = 0, 数已排好, 退出比较排序程序
注: 对N项数, 排序次数 ≤ N-1 (例5.24用此法)
(BL) = -1
(BL) = 0 标志
(CX) = N –1 计数
(SI) = N –1 指针
(BL) = 0
开 始
标志(BL) = -1
3: 流程
最初必排一次
结束
Y
N
Ej-1 < Ej
Y
比较两数大小
N
Ej-1 ↔ Ej
两数交换
有交换必再排一次
(SI)=(SI)-1
(CX)=(CX)-1
(CX) = 0
N
4: 数据段定义
SORTD SEGMENT
ARRAY DB 25, 46, 3, 75, 5, 30
COUNT EQU $ - ARRAY
SORTD ENDS
5: 代码段编程
CODE SEGMENT
ASSUME CS:CQDE, DS:SORTD
SORD PROC FAR
START: PUSH DS
MOV AX, 0
PUSH AX
MOV AX, SORTD
MOV DS, AX
MOV BL, 0FFH ;(BL) = -1
AG0: CMP BL, 0
JZ DONE
MOV BL, 0
MOV CX, COUNT
DEC CX ; (CX) = N – 1
MOV SI, COUNT
DEC SI ; SI指向表底
AG1: MOV AL, ARRAY[SI]
CMP AL, ARRAY[SI – 1]
JAE UNCH ;[SI] ≥ [SI-1] 不交换
XCHG AL, ARRAY[SI – 1]
MOV ARRAY[SI], AL ; [SI] < [SI-1]交换
MOV BL, 0FFH ; 有交换, 未排好, 重排
UNCH: DEC SI
DEC CX
JNZ AG1 ; 一个数排好
JMP AG0 ; 所有数排好
DONE: RET
SORD ENDP
CODE ENDS
END START
5: 汽泡图
原数据 第一次 第二次 第三次 重排一次
25
46
3
75
5
30
3
25
46
5
75
30
3
5
25
46
30
75
3
5
25
30
46
75
3
5
25
30
46
75
6: 在显示器观察排序过程
注:上述程序是否正确, 可用DEBUG调试程序看存储器内容,
也可将排序过程显示, 下述程序有此功能
A: 方法
在指令JNZ AG1与指令JMP AG0间插入显示程序
B: 显示程序
MOV DH, COUNT ; 显示COUNT个数据(本例为6个)
LEA DI, ARRAY ; 从表首址开始
ABC: MOV AL, [DI]
MOV AH, 0 ; 将AL扩展到AX
MOV BH, 10 ; 除数为10
DIV BH ; 数的十位 → (AL), 个位 → (AH)
MOV BH, AH ; BH暂存AH中数, AH下面要用
MOV AH, 2 ; INT 21H的2号功能为显示字符
MOV DL, AL
ADD DL, 30H ; AL中数的ASCII码入DL
INT 21H ; 显示十位数
MOV DL, BH
ADD DL, 30H
INT 21H ; 显示个位数
MOV DL, ‘ ‘
INT 21H ; 显示两数间的空格
INC DI ; 指向下一个数
DEC DH ; 计数器减一
CMP DH, 0
JA ABC ; 连续显示COUNT个数排序
MOV AH, 2
MOV DL, 0AH
INT 21H
MOV DL, 0DH
INT 21H ; 显示回车换行,进入下一次排序显示
C: 执行该程序的显示结果
原始数据表 25 46 3 75 5 30
第一次排序显示 03 25 46 05 75 30
第二次排序显示 03 05 25 46 30 75
第三次排序显示 03 05 25 30 46 75
重排显示 03 05 25 30 46 75
三: 算术运算程序
数的加减乘除, 加减简单, 乘除复杂,
《例5.28》两个组合十进制数的乘法
1: 功能
A: 25 * 25 = 625 十进制表示
B: 25H * 25H = 625H BCD表示
2: 方法
A: 无组合BCD乘法调整指令, 不能直接乘
B: 有组合BCD加法调整指令, 用连加代替乘
3: 数据段
FIRST DB 25H
SECOND DB 25H
THIRD DB 2DUP(?)
4: 代码段
MOV BL, FIRST ; 累加次数 (BL) = 25H, 计数器
MOV CL, SECOND ; 累加基数 (CL) = 25H
MOV DX, 0 ; 累加和初始值 (DX) = 0
MOV AL, BL ; 调整需在AL中进行
AG: CMP AL, 0
JZ DONE ; 若(AL) = 0, 即(BL) = 0, 累加完
MOV AL, DL ; 累加和的低8位 → (AL)
ADD AL, CL ; (DL) + (CL) → (AL)
DAA ; 对和(AL) 进行BCD调整
MOV DL, AL ; 和放入DL中
MOV AL, DH ; 累加和的高8位 → (AL)
ADC AL, 0 ; 完成(AL) + CF → (AL)
DAA
MOV DH, AL ; (DH) + CF → (DH)
MOV AL, BL
SUB AL, 1 ; (BL) – 1 → (AL)
DAS
MOV BL, AL ; 完成(BL) – 1 → (BL) 并调整
JMP AG
DONE:LEA BX, THIRD
MOV [BX], DX ; 存累加和
注: 调整必须在AL中进行, 因为组合BCD只有8位方式,
所以对和DX的调整分为对DH, DL的分别调整
四: 图形显示
l 类别 A: 字符图形 B: 点阵图形
l 方法 应用INT 10H中的功能
《例5.31》字符图形的显示
1: 字符的代码及属性
计算机中, 一个字符由两字节表示
A: 第一字节 字符的ASCII码
例 字符A的ASCII码为41H
B: 第二字节 字符的显示属性码
b7
b6
b5
b4
b3
b2
b1
b0
A
R
G
B
I
R
G
B
1) b3 ~ b0 字符前景色编码, 共有16种色
2) b6 ~ b4 字符背景色编码, 共有8种色
3) b7 字符闪烁编码, b7 = 0不闪, b7 = 1闪烁
注: 基色R(红)G(绿)B(兰) 可组合为八种色, 构成字符的基本前景和背景色, 若b4 = 1, 则前景色在原色上加亮
R
G
B
色
0
0
0
黑
0
0
1
兰
0
1
0
绿
0
1
1
天兰
1
0
0
红
1
0
1
洋红
1
1
0
综
1
1
1
白
2: 小人字符图形分析
A: 字符的ASCII码
Ö — 01H █ —DBH !! — 13H / — 2FH \ —5CH
B: 字符图形位置, ASCII码, 显示顺序
Ö
/
█
\
!!
01H
2FH
DBH
5CH
13H
0,0
-1,-1
1,0
0, 2
1,0
Ö 0, 0 DH = 0, DL = 0 起始位置
█ 1, 0 DH ← DH + 1, DL ← DL + 0 相对位移
!! 1, 0 DH ← DH + 1, DL ← DL + 0 相对位移
/ -1, -1 DH ← DH - 1, DL ← DL - 1 相对位移
\ 0, 2 DH ← DH + 0, DL ← DL + 2 相对位移
3: 数据段
CHRTAB DW 5 ; 五个字符构成此图
DB 01H, 0, 0 ; Ö
DB 0DBH, 1, 0 ; █
DB 13H, 1, 0 ; !!
DB 2FH, -1, -1 ; /
DB 5CH, 0, 2 ; \
注:字符图形含三个字节, 代码, 水平位移, 垂直位移, 未含属性
4: 代码段
MOV AL, 02H
MOV AH, 00H
INT 10H ; 设置显示器80 *25黑白字符模式
LEA DI, CHRTAB
MOV CX, [DI] ; 计数器(CX) = 5
MOV DH, 10H
MOV DL, 40H ; 当前光标设置为10行40列
ADD DI, 2 ; 指针DI指向字符Ö
MOV BH, 0 ; 当前显示页为0页
NEXT: ADD DH, [DI + 1]
ADD DL, [DI + 2] ; 当前显示位置值
MOV AH, 02H
INT 10H ; 移动光标到当前页及当前位置
MOV AL, [DI]
PUSH CX
MOV CX, 1
MOV AH, 10
INT 10H ; 在当前光标处显示(AL) 中的字符
POP CX ; 注意此处PUSH, POP的作用
ADD DI, 3 ; 指向下一个字符
DEC CX
JNZ NEXT
作 业 : 5.4, 5.7, 5.10, 5.14, 5.18, 5.28
16
微机原理 第 16 页
展开阅读全文