0%

第四章_基本汇编语言程序设计_1

顺序程序设计


举例:

利用学号查学生的数学成绩表

算法分析:首先在数据段中建立一个成绩表TABLE,在表中各学生的成绩按照学号从小到大的顺序存放。要查的学号存放在变量NUM中,查表的结果放在变量MATH中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
TITLE   TABLE LOOKUP

DATA SEGMENT
TABLE DB 81,78,90,64,85,76,93,82,57,80
DB 73,62,87,77,74,86,95,91,82,71
NUM DB 8
MATH DB ?
DATA ENDS

STACK1 SEGMENT PARA STACK
DW 20H DUP(0)
STACK1 ENDS

COSEG SEGMENT
ASSUME CS:COSEG, DS:DATA, SS:STACK1

START:
MOV AX, DATA
MOV DS, AX
MOV BX, OFFSET TABLE ; BX指向表首址
XOR AH, AH
MOV AL, NUM ; 找第8个学生,但是下标是7
DEC AL
ADD BX, AX ; BX加上学号指向要查的成绩
MOV AL, [BX] ; 查到成绩送AL
MOV MATH, AL ; 存结果
MOV AH, 4CH ; 返回DOS
INT 21H
COSEG ENDS

END START

视频讲解


分支程序设计

转移指令

格式: JMP 目标

1
2
3
4
5
6
7
:
JMP TARGET
:

TARGET:
...........
:

用比较/测试指令+条件转移指令实现分支

数据转移

当源块首地址<目的块首地址时,从数据块末地址开始传送。反之,则从首地址开始传送

注:跳转指令一览

用跳转表形成多路分支

LOOPZ/LOOPE

要用到LOOPE/LOOPZ:在ZF为1且CX不等于0时(条件成立或结果为零)继续循环。如果当前字符是空格,且字符串没有遍历完(CX初始化为字符串长度),就继续向下遍历

LOOPNZ/LOOPNE

编写程序,计算两个字节数组ARY1和ARY2对应元素之和,一直计算到两数之和为0或数组结束为止。并将和存入数组SUM中,将该数组的长度存放在NUM单元中

要用到LOOPNZ/LOOPNE,如果当前数组没有遍历完或者当前对应位置两数之和不是0

JCXZ

防止一开始做循环,CX里面的值就是0,那么0-1=0FFFFH先入死循环

1
2
3
4
5
6
7
程序结构为:
..........
MOV CX,COUNT
JCXZ NEXT
LOP: ..........
LOOP LOP
NEXT: ..............

选用CX计数控制循环

关键代码

条件控制循环

题干:

将字单元VARW 中含1的个数统计出来,存入CONT单元中

思想:

本例中通过将字单元各位逐位移入最高位来判断。为了减少循环次数,循环中加上了判断各位是否全为0,这样可使低位为全0时的循环次数减少。

多重循环

题干:

设计