汇编语言两位数的乘法

宏汇编(两位数的乘法)

本人比较菜,第一次在CSDN上写博客,怕学过的东西忘记就写下了这篇关于汇编宏的使用的博客,以后还能找到。

具体题目如下:
定义宏,完成两个操作数相乘,乘积在第3个操作数中。并写一个简单的程序调用这个宏,完成2个从键盘输入数据的相乘及结果输出。

代码如下:

DATAS SEGMENT
    ;此处输入数据段代码
    x db 2 dup(?) 
    y db 2 dup(?)
    z dw ?
    mess1 db 'Please enter two double digits, each ending with enter:',0ah,0dh,'$'
    mess2 db 0ah,0dh,'result=$'
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
    ;只能支持两位数的乘法!!!
input1 macro opr1				;输入宏-X
	mov cx,1h
	mov si,0h
let1:
    mov ah,1h
    int 21h
    cmp al,0dh
    je let2
    sub al,30h
    mov opr1[si],al
    inc si
    jmp let1
let2:
	loop let1
endm
input2 macro opr2				;输入宏-Y
	mov cx,1h
	mov si,0h
let3:
    mov ah,1h
    int 21h
    cmp al,0dh
    je let4
    sub al,30h
    mov opr2[si],al
    inc si
    jmp let3
let4:
	loop let3
endm
mulxy macro op1,op2,op3			;运算宏
	mov bx,0h
	mov al,op1[0]
	mov bl,op1[1]
	mov cl,0ah
	mul cl
	add ax,bx					;ax中存的是x的真值
	push ax						;x暂存起来
	mov ax,0h
	mov bx,0h
	mov al,op1[0]
	mov bl,op1[1]
	mov cl,0ah
	mul cl
	add ax,bx					;目前ax存放y的真值
	mov bx,0h
	pop bx
	mul bx						;x*y运算结果放入ax中
	mov z,ax
endm
output1 macro op				;输出宏
	mov ax,0h
	mov bx,0h
	mov dx,0h
	mov cx,0h
	mov ax,op
	mov bx,0ah
let5:
	div bx
	push dx						;存余数
	mov dx,0h
	inc cx
	cmp ax,0h
	jnz let5
let6:
	mov ah,2h
	pop dx
	add dx,3030h
	int 21h
	loop let6
endm
	lea dx,mess1				;提示信息
	mov ah,9h
	int 21h
	
	input1 x
	input2 y
	mulxy x,y,z					;结果在Z中
	
	lea dx,mess2				;提示信息
	mov ah,9h
	int 21h
	;输出结果时是将运算结果除以十然后余数入栈
	;最后弹出余数调用dos系统2号功能依次输出结果
	output1 z
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

PS:
2021回头来看到这篇博客,把代码拿到软件上跑了一下,发现出BUG了!
很抱歉,当初没有调试出来,但现在已经忘得差不多了(枯),本文的代码仅供参考,并非标准程序,再次对曾经看到过这篇文章的同志们表示抱歉

你可能感兴趣的:(汇编语言,程序人生)