MOV CX,05 LOOP1: MOV AL,[SI]
AND AL,00001111B ;取被乘数DATA1,ASCII变十六进制数 INC SI ;指向被乘数1的下一字符单元 MUL BL ;相乘
AAM ;AAM调整
ADD AL,[DI] ;结果低位与前次计算的进位相加 AAA ;AAA调整 MOV [DI],AL
INC DI ;结果送存到下一单元 MOV [DI],AH
LOOP LOOP1 MOV CX,06 MOV SI,DI DISPL: MOV AH,02 MOV DL,[SI] ADD DL,30H INT 21H DEC SI
LOOP DISPL MOV AX,4C00H INT 21H CODE ENDS END START
;计算结果高位进位送存 ;显示结果 ;结束 20
实验三 BCD码相乘实验
一、实验要求:
实现BCD码的乘法,要求被乘数和乘数以组合的BCD码形式存放,各占一个内存单元,乘积存入在另外两个内存单元中,由于没有组合的BCD码乘法指令,程序中采用将乘数1作为计算器,累加另一个乘数的方法得到计算结果。 二、实验目的:
掌握用组合的BCD码表示数据,并熟悉怎样实现组合BCD码乘法运算。 三、实验程序框图:(附后) 四、实验程序:
DATA SEGMENT FIRST DB 99H SECOND DB 25H
THIRD DB 2 DUP(?) MES1 DB '*','$' MES2 DB '=','$' DATA ENDS
STACK SEGMENT PARA STACK 'STACK' STAPN DB 100 DUP(?) TOP EQU LENGTH STAPN STACK ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV BL,FIRST ;被乘数送BL MOV CL,SECOND ;乘数送CL MOV DX,0 ;部分积清0 MOV AL,BL
AGAIN: OR AL,AL JZ DONE ;被乘数减到0则转结果显示 MOV AL,DL ADD AL,CL DAA ;乘数于部分积低位相加后调整 MOV DL,AL MOV AL,DH ADC AL,0 DAA ;往部分积高位送进位后调整 MOV DH,AL MOV AL,BL DEC AL
21
DAS ;组合BCD码减法调整 MOV BL,AL JMP AGAIN DONE: LEA BX,THIRD MOV [BX],DX LEA SI,FIRST CALL DIS XOR AX,AX MOV AH,09H LEA DX,MES1 ;* INT 21H LEA SI,SECOND CALL DIS XOR AX,AX LEA DX,MES2 MOV AH,09H INT 21H LEA SI,THIRD INC SI CALL DIS DEC SI CALL DIS MOV AX,4C00H INT 21H
DIS PROC NEAR MOV AL,[SI] MOV CL,04H SHR AL,CL ADD AL,30H MOV DL,AL MOV AH,02H INT 21H MOV AL,[SI] AND AL,0FH ADD AL,30H MOV DL,AL MOV AH,02H INT 21H RET DIS ENDP CODE ENDS END START
;= ;返回DOS ;显示子程序 22
实验四 排 序 实 验
一、实验要求:使用DEBUG程序,从首址为1000H的内存区开始存放50个数,要求设计程序将这些数由小到大排序,排序后的数,仍放在该区域中。
二、实验目的:掌握用汇编语言编写气泡排序程序的思路和方法。 三、实验程序框图: 开始 初始化 读键盘输入的段址(ES)和偏移量(SI) 外循环数SORTNUX-1送CX,BX清0 [SE+BX]送AL 交换单元指针AH=BL CX入栈 计算内循环数送CX 内循环控制变量DX初始化 DX+1 AL>DX指示单元的值 DX指示单元的值送AL, 修改指针AH CX-1=0000 交换[SI+BX]单元和[AH]单元的值 显示提示信息 BX+1 显示排序信息 CX出栈
四、实验程序: CRLF MACRO
CX-1=0000 返回DOS 23
MOV AH,02H MOV DL,0DH INT 21H
MOV AH,02H MOV DL,0AH INT 21H ENDM
DATA SEGMENT SORTNUM EQU 50
MESS DB '1000:0起50个数由小到大排列如下:',0DH,0AH,'$' DATA ENDS
STACK SEGMENT STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX
MOV SP,TOP ;初始化 MOV SI,0 ;偏移量 MOV AX,1000H ;段址 MOV DS,AX
MOV CX,SORTNUM ;排序数的长度 DEC CX ;外循环次数 XOR BX,BX ;偏移指针清0 III: MOV AL,[SI+BX] ;取数
MOV AH,BL ;AH为交换单元指针 PUSH CX
MOV DX,BX ;初始化内循环控制变量 JJJ: INC DX ;内循环控制变量值增1 PUSH BX ;入栈保存 MOV BX,DX CMP AL,[SI+BX]
JBE UUU ;若AL较小,则不必交换,转UUU MOV AL,[SI+BX]
MOV AH,DL ;置AL为新的较小值并修改AH指针 UUU: POP BX
LOOP JJJ ;内循环 MOV CL,[SI+BX] MOV [SI+BX],AL MOV DL,AH PUSH BX MOV BX,DX MOV [SI+BX],CL
POP BX ;交换
INC BX ;偏移量加1
24