cpu在顺序执行程序片时,按照指令先后次序执行指令,因此在顺序程序中,指令先后次序至关重要。
例:将一字节压缩BCD转换为两个ASCII码
DATA SEGMENT
BC_BUF DB 96H
ASC_BUF DB 2 DUP(?)
DATA ENDS
CODE SEGEMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV AL, BCD_BUF
MOV BL, AL
MOV CL, 4
SHR AL, CL
ADD AL, 30H
MOV ASC_BUF, AL
AND BL, 0FH
ADD BL, 30H
MOV ASC_BUF + 1, BL
CODE ENDS
END START
例:把一个16进制数字码转换为对应7段代码程序。
XLAT:该指令寄存器BX内容作为表(每项一个字节)的首地址,把寄存器AL值作为下标,取出表项内容,内容再送AL寄存器,也就是把寄存器AL中的内容转换为表中对应项的值。表最大为256项。
DSEG SEGMENT
TAB DB 1000000B, 1111001B, 0100100B, 0110000B
DB 0011001B, 0010010B, 0000010B, 1111000B
DB 0000000B, 0010000B, 0001000B, 0000011B
DB 1000110B, 0100001B, 0000110B, 0001110B
XCODE DB 8
YCODE DB ?
DSEG ENDS
CSEG SEGMENT
ASSUME CS: DSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
MOV BX, OFFSET TAB
MOV AL, XCODE
AND AL, 0FH
XLAT
MOV YCODE, AL
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
例:利用直接查表法编程完成将内存单元TAB首地址开始存放0~15的平方数表,求出A单元给定数(<=15)的平方值送B单元保存。
DATA SEGMENT
TAB DB 0,1,4,9,16,25,36,49,65,81,100,121,144,169,196,225
A DB 12
B DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
START: MOV AX, DATA
MOV DS, AX
MOV BX, OFFSET TAB
MOV AL, A
XLAT
MOV B, AL
CODE ENDS
END START
在汇编语言中,一般利用条件测试指令和条件转移指令等实现简单的分支。
例:比较两个无符号数的大小,把大数存入MAX单元
DATA SEGMENT
SOURCE DB X1, X2
MAX DB ?
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
MOV AX, DATA
MOV DS, AX
MOV AL, SOURCE
CMP AL, SOURCE+1
JNC ONE ;若没借位
MOV AL, SOURCE+1
ONE: MOV MAX, AL
CODE ENDS
END
例:由大到小排列三个数
DATAS SEGMENT
BUFFER DB 87, 234, 123
DATAS ENDS
CODES SEGMENT
ASSUME CS: CODES, DS: DATAS
START: MOV AX, DATAS
MOV DS, AX
MOV SI, OFFSET BUFFER
MOV AL, [SI]
MOV BL, [SI+1]
MOV CL,, [SI+2]
CMP AL, BL
JAE NEXT1
XCHG AL, BL
NEXT1: CMP AL, CL
JAE NEXT2
XCHG AL, CL
NEXT2: CMP BL, CL
JAE NEXT3
XCHG BL, CL
NEXT3: MOV [SI], AL
MOV [SI+1], BL
MOV [SI+2], CL
INT 21H
CODES ENDS
END START
循环通常由四部分组成:
(1)初始化部分
(2)循环体部分
(3)调整部分
(4)控制部分
例:在字符数组里找出第一个非0数据,并显示输出其所在数组的下标
DATA SEGMENT
ARRAY DB 0,0,016,0,88,66,0,44,33,99
COUNT EQU $-ARRAY
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:MOV AX, DATA
MOV DS, AX
MOV CX, COUNT
MOV DI, –1
AGAIN:
INC DI
CMP ARRAY[DI], 0
LOOPZ AGAIN
MOV DX, DI
OR DL, 30H ;转换为ascii
DISPLAY:
MOV AH, 02H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START
例:把字符串所有大写字母改为小写字母,设字符串以结尾。
DATA SEGMENT
STR DB ‘HOW are u !’, 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
MOV SI, OFFSET STR
AGAIN:
MOV AL, [SI]
OR AL, AL ;测试是否为0
JZ OK
CMP AL, ‘A’
JB NEXT
CMP AL, ‘Z’
JA NEXT
OR AL, 20H ;加20H
NEXT:
INC SI
NMP AGAIN
OK:
MOV AX, 4C00H
INT 21H
CODE ENDS
END START