欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言两位数的乘法

程序员文章站 2024-02-01 21:46:52
...

宏汇编(两位数的乘法)

本人比较菜,第一次在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