📄 32060624_王克_asmhomework_2.asm
字号:
;----------------------------------------------------------------
; ╭══════┤ 32060624___王克 ├═════╮
; ║ ║
; ║ ║
; ║ ★ 汇编语言 第二次作业 ★ ║
; ║ |---------------------------------------------| ║
; ║ ║
; ║ ;双字相乘(32位) X3 = X1 * X2 ║
; ║ ;以16进制显示结果 ║
; ║ ;以10进制显示结果 ║
; ║ 2004.10.30 ║
; ║ ║
; ╰ ════════════════════════════╯
;━┅━┅━┅━┅━┅━┅━┅━┅━━┅━┅━┅━┅━┅━┅━┅━━┅━┅━━┅━
.model small
.stack 100h
.DATA
X1 Dword 0ffffffffH
X2 Dword 0ffffffffH
X3 WORD 4 DUP(0),'$' ;X1 * X2 = 0ffff fffe 0000 0001h
RESULT10 BYTE 25 DUP(0),'$'
DISP16_MSG BYTE 'The result in Hex is: ','$'
DISP10_MSG BYTE 0DH,0AH,'The result in DEC is: ','$'
.code
.startup
;-------------------------------------------------
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
CALL DMUL ;双字乘法
MOV DX,OFFSET DISP16_MSG
MOV AH,09H
INT 21H
CALL DISPLAY16 ;以16进制输出
MOV DX,OFFSET DISP10_MSG
MOV AH,09H
INT 21H
CALL DISPLAY10 ;以10进制输出
.exit
MAIN ENDP
;------------------;双字乘法-------------------------
DMUL PROC NEAR
;两低字相乘
mov bx,word ptr x1
mov ax,word ptr x2
mul bx
mov X3,ax
mov X3+2,dx
mov ax,word ptr x2+2 ;低字乘*高字
mul bx
add X3+2,ax
adc X3+4,dx
adc X3+6,0 ;加进位
mov bx,word ptr x1+2 ;高字乘*低字
mov ax,word ptr x2
mul bx
add X3+2,ax
adc X3+4,dx
adc X3+6,0 ;加进位
mov ax,word ptr x2+2 ;两高位相乘
mul bx
add X3+4,ax
adc X3+6,dx
RET
DMUL ENDP
;------------------;以16进制输出---拷贝EXP51.asm-----------------
DISPLAY16 PROC NEAR
MOV CX,4 ;外层计数器,4个字
LEA SI,X3+6
NEXTWORD:
PUSH CX ;保存计数器值
MOV BX,[SI]
MOV CX,4
;;;;;;;;;;;;;;;;;;;
CONVERT:
PUSH CX ;保存内层计数器
MOV CL,4
ROL BX,CL
MOV AL,BL
AND AL,0FH
or AL,30H ;转化为ASCII码
CMP AL,39H
JBE DISP
ADD AL,'A'-'9'-1 ;大于9则用ABCDEF表示
DISP:
MOV DL,AL
MOV AH,2
INT 21H ;显示一个字符
POP CX
LOOP CONVERT
;;;;;;;;;;;;;;;;;;;;
DEC SI
DEC SI
POP CX
LOOP NEXTWORD ;开始第二个字的显示
RET
DISPLAY16 ENDP
;---------------------;以10进制输出------------------------
DISPLAY10 PROC NEAR
LEA SI,RESULT10+24
MOV CX,25
MOV BX,10
DIV10: ;一个循环求一位值,先得到最低位
MOV AX,X3+6
XOR DX,DX
DIV BX
MOV X3+6,AX
MOV AX,X3+4
DIV BX
MOV X3+4,AX
MOV AX,X3+2
DIV BX
MOV X3+2,AX
mov AX,X3
DIV BX
MOV X3,AX
XOR DL,30H
MOV [SI],DL ;此时余数即为实际值,最低位
DEC SI
LOOP DIV10
MOV SI,OFFSET RESULT10
NEXT: ;跳过前边无用的0
MOV AL,[SI]
CMP AL,30H
JNE PRINT
INC SI
JMP NEXT
PRINT:
MOV DX,SI ;从不为0的位开始全部打印
MOV AH,09
INT 21H
RET
DISPLAY10 ENDP
;------------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -