0%

8086汇编语言程序设计简要记录(三)

利用子程序对数据段NUM0db 11,12,13,14和NUM1db 12,13,14,15对应的各个数进行求和(即对NUM0[0]NUM1[0]进行求和,对NUM0[1]NUM1[1]进行求和······),将结果存储于以1000H起始的数据段中,并输出结果。

源程序:

DATA SEGMENT
NUM0 DB 11,12,13,14
NUM1 DB 12,13,14,15
ORG 1000H
SUM DB 4 DUP(?)
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,CS:CODE

START:
MOV AX,DATA
MOV DS,AX

MOV CX,4
LEA SI,NUM0 ;取段NUM0的偏移地址
LEA DI,NUM1 ;取段NUM1的偏移地址

L:
MOV BL,[SI]
MOV BH,[DI]
ADD BH,BL ;两数相加

PUSH SI ;将段NUM0的偏移地址SI压栈,避免与段SUM的偏移地址SI冲突
MOV SUM[SI],BH ;将两数相加的结果写入段SUM
INC SI
POP SI ;将段NUM0的偏移地址SI弹栈

CALL DISPLAY ;调用子程序DISPLAY实现输出功能
INC SI
INC DI
LOOP L

MOV AH,4CH
INT 21H

DISPLAY PROC ;子程序DISPLAY

MOV AL,BH ;将8位的两数相加之和转换为16位并写入AX作被除数
MOV AH,0H
MOV BL,10 ;8位的除数
DIV BL ;SUM/10,取得SUM的十位和个位
PUSH AX ;将商和余数压栈(商被写入AL,余数被写入AH)

MOV DL,AL
ADD DL,30H ;将SUM的十位转换为其ASCII值,使十位能以字符形式输出
MOV AH,2H ;输出结果
INT 21H

POP AX ;将商和余数弹栈
MOV DL,AH
ADD DL,30H ;将SUM的个位转换为其ASCII值,使个位能以字符形式输出
MOV AH,2H ;输出结果
INT 21H

MOV DL,'D' ;输出字符D
MOV AH,2H
INT 21H

MOV DL,10 ;输出“换行”
MOV AH,2H
INT 21H

RET ;子程序返回
DISPLAY ENDP

CODE ENDS
END START

调试结果:

运行结果: