SHR ADD
BH, CL BH, 30H
;显示千位数
OUTPUT BH POP PUSH AND ADD
BX BX BH, 0FH BH, 30H
OUTPUT BH POP PUSH MOV SHR ADD
BX BX CL, 4 BL, CL BL, 30H
;显示百位数
OUTPUT BL POP AND ADD
BX BL, 0FH BL, 30H
;显示十位数
OUTPUT BL OUTPUT 0AH OUTPUT 0DH JMP
AGAIN
;显示个位数
INPUT PROC BEGIN: MOV MOV L: SHL SHL
BX, 0 SHL BX, 1 BX, 1
FAR CX, 4
;输入一个4位十进制数的过程
BX, 1
SHL MOV INT CMP JZ CMP JB CMP JA SUB XOR ADD LOOP RET
BX, 1 AH, 1 21H
;BX的值乘以16
;输入 ;ESC键退出
AL, 1BH DONE AL, '0' ERROR AL, '9' ERROR AL, 30H AH, AH BX, AX L
;非数字,出错
;非数字,出错
;将输入加到BX中
ERROR: LEA MOV INT JMP
AH, 9 21H BEGIN
DX, MSG3
DONE: MOV INT
21H
AH, 4CH
INPUT ENDP CODE END
7、在8086系统下,编写完整程序,实现两个32位带符号数相乘。假设被乘数存放在以字变量MUL1开始的连续4个字节中,乘数存放在以字变量MUL2开始的连续4个字节中中,相乘结果存放在以字变量RES开始的连续8个字节中。
ENDS MAIN
解:参考程序: DATA MUL1 MUL2 RES DATA CODE
SEGMENT
DW 0FFFFH,0FFFFH DW 5678H,1234H DW 4 DUP(0) ENDS SEGMENT
;被乘数 ;乘数 ;结果
ASSUME CS:CODE, DS:DATA MAIN PUSH MOV PUSH MOV MOV MOV MOV MOV MOV TEST JZ NOT NOT ADD ADC
PROC DS AX, 0 AX AX, DATA DS, AX CX, MUL1 BP, MUL1+2 SI, MUL2 DI, MUL2+2 BP, 8000H NEXT1 BP CX CX, 1 BP, 0
DI, 8000H
;乘数是否为负数
;为负数,则取反加1 ;被乘数是否为负数
FAR
NEXT1: TEST JZ NOT
NEXT2 SI
;为负数,则取反加1
NOT ADD ADC
DI SI, 1 DI, 0
NEXT2: MOV AX, SI
MUL CX MOV RES, AX
MOV RES+2, DX MOV AX, SI MUL BP ADD RES+2, AX ADC RES+4, DX MOV AX, DI MUL CX ADD RES+2, AX ADC RES+4, DX MOV AX, DI MUL BP ADD RES+4, AX ADC RES+6, DX MOV AX, MUL1+2 XOR AX, MUL2+2 JNS DONE NOT RES
NOT RES+2 NOT RES+4 NOT RES+6 ADD
RES, 1
;相乘过程
;判断被乘数和乘数是否同号 ;同号,则结果为正数,无须修改结果;不同号,则结果为负数,须取反加1