输入如下代码
;==给DD数x赋值的宏==将DD型的两个数X,Y其中Y的值赋给X
give macro x,y
mov ax,y
mov x,ax
mov ax,y[2]
mov x[2],ax
endm
;**给DD数x赋值的宏**将DD型的两个数X,Y其中Y的值赋给X
;==判断正负宏== 判断DD型x,y的正负利用fhx、fhy两个常数记录下并将
; 他们都化为正数方便运算
judge macro x,y
local judge1,judge2,judge3,judge4;;标号注释,用于保证宏的重复调用
;;定位的标号不错乱
mov ax,x
cmp ax,0
jge judge1
mov fhx,1;;记录x的正负
neg x;;转换为正数
judge1:
mov ax,x[2]
cmp ax,0
jge judge2
mov fhx,1
neg x[2]
judge2:
mov ax,y
cmp ax,0
jge judge3
mov fhy,1
neg y
judge3:
mov ax,y[2]
cmp ax,0
jge judge4
mov fhy,1
neg y[2]
judge4:
endm
;**判断正负宏结束**
;==根据介入y值的0,1将x结果转为正或负==
change macro x,y
local change1
cmp y,0
je change1
neg x
neg x[2]
change1:
endm
;**根据介入y值的0,1将x结果转为正或负**
;==进位宏开始== 对小数部分除以100,将商进位,余数补回小数
carry macro x
push cx;;免除对宏外面的cx,dx值造成干扰
push dx
mov ax,x[2]
mov cx,100
mov dx,0
div cx
mov x[2],dx
add x,ax
pop dx
pop cx
endm
;**进位宏结束**
;==新的加法宏开始== 算法,同号相加,异号相减
newadd macro x,y
local subsub,endnewadd,returnadd1,xbig,endadd1,endadd2,endadd3,endadda,endaddc
judge number3,number4;;不能直接代用x,y.
;;x其实既number3,y既number4。原因,下面一条注释
mov ax,fhx
cmp fhy,ax
jnesubsub
;;------两个数符号相等则,直接两部分相加
mov ax,y
addx,ax
mov ax,y[2]
add x[2],ax
carry number3
change number3,fhx
jmp endnewadd
;;---如果符号相反则,大数减去小数
subsub:
mov ax,y
cmp x,ax
jaxbig
jne endadda
mov ax,y[2]
cmp x[2],ax
ja xbig
endadda:
mov ax,x
sub y,ax
add y[2],100
mov ax,x[2]
sub y[2],ax
cmp y[2],100
jnb endadd1
sub y,1
jmp endaddc
endadd1:
sub y[2],100
endaddc:
give number3,number4
change number3,fhy
jmp endnewadd
xbig:
mov ax,y
sub x,ax
add x[2],100
mov ax,y[2]
sub x[2],ax
cmp x[2],100
jnb endadd2
sub x,1
jmp endadd3
endadd2:
sub x[2],100
endadd3:
change number3,fhx
jmp endnewadd
endnewadd:
mov fhx,0
mov fhy,0
endm
;**新的加法宏结束**
;==新的减法宏==
newsub macro x,y
mov fhx,1
change number4,fhx
mov fhx,0
newadd number3,number4
endm
;**新的减法宏**
;==新的乘法宏==算法 (a1+b1)*(a2+b2)=a1*a2+a1*b2+a2*1+b1*b2
newmul macro x,y
judge number3,number4
push bx
push dx
mov bx,y
mov ax,x
mul bx
push ax;;压栈用于后面的加法
mov ax,x[2]
mul bx
push ax;;正数部分乘小数部分的结果可以直接加到小数部分
mov bx,y[2]
mov ax,x
mul bx
push ax
mov ax,x[2]
mul bx
mov dx,0
mov bx,100;;小数部分乘小数部分的结果必需再缩小100倍,才
;;能再加回小数位
div bx
mov x[2],ax
pop ax
add x[2],ax
pop ax
add x[2],ax
pop ax
mov x,ax
carry number3
mov ax,fhy
xor fhx,ax
change number3,fhx
mov fhx,0
mov fhy,0
pop dx
pop bx
endm
;**新的乘法宏**
;==新的除法宏== 利用减法完成除法运送,但是为了减少逐减次数,所以
;先用a1/(a2+1)得要一个商,这个商一定不会大于逐减
;次数,所以就可以从(a1+b1)-商*(a2+b2)开始逐减,
;直到减出负数后,回加一个(a2+b2)得(a3+b