本人比较菜,第一次在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了!
很抱歉,当初没有调试出来,但现在已经忘得差不多了(枯),本文的代码仅供参考,并非标准程序,再次对曾经看到过这篇文章的同志们表示抱歉