endp 汇编start_汇编语言程序设计:[20]汇编计算器

输入如下代码

;==给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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值