汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx
《汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx》由会员分享,可在线阅读,更多相关《汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx(33页珍藏版)》请在冰豆网上搜索。
![汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx](https://file1.bdocx.com/fileroot1/2023-1/7/15a0dbd1-3ad9-4e72-9345-2534b89af58c/15a0dbd1-3ad9-4e72-9345-2534b89af58c1.gif)
利用硬件实现乘法的思想,通过判断第二个操作数的未判断的较低位决定是加被乘数还是加0的操作,然后将结果右移,直到将操作数的所有位判断完毕(最后一位不移位),将结果存入result内存单元中。
4)浮点数加法:
前面取了前8位归并后,将指针的位置保留下来,现在将其指针弹栈继续对剩下的输入的字符进行操作。
首先调用子程序将剩下的输入字符流存入内存以待使用(将字符流转变成数值并组成一个完整的数字,即浮点数有三个数:
1位的数符,8位的阶码,23位的数值)。
此次运算严格按照浮点数的运算进行,即先对阶(阶码小的向阶码大的对齐)->
取数运算(由于输入的是二进制字符流,因此在运算之前需根据数符对数值进行补码操作,而且由于有23位数值,通用寄存器只有16位,需调用两个寄存器来运算,注意低位是否有向高位的进位)->
规格化,最后将阶码存到float_jie内存,数值运算结果存入result单元。
并通过中断对阶码和数值进行输出显示。
5)浮点数减法:
及加法一样先调用中断将剩下的浮点数信息存入内存。
及加法不同的是由于只能用加法指令,在操作的时候同样需先对第二个浮点数进行求补操作(取反加1),然后在进行及加法一样的操作,最后将阶码存到float_jie内存,数值运算结果存入result单元。
6)浮点数乘法:
及前面两个浮点数的操作一样先将剩下的浮点数信息存入内存。
我们这里操作数均取得补码,因此用booth算法做乘法运算(通过移位取最低两位进行判断,如果相同则加0,如果ynyn-1=10,则加【x】补,如果为ynyn-1=01,则加【-x】补),通过23次的判断,进行加法操作和移位,最终得到结果,将阶码存到float_jie内存,数值运算结果存入result单元。
三、在此给出部分运行结果:
1.整数加法
输入:
注意:
指令P下面的二进制字符流严格按照要求的格式进行输入
输出:
由于我在存储的时候将result内存设为了dd型,而我在存的时候存在了高位,在内存中是以大端格式存储,对于此题我们只用到了三位数的加法,显然可以看出最后结果为02(001+001),正确。
2.整数减法
这里和整数加法是一样的输出设置,因此结果为01(010-001),正确。
4.整数乘法
输出为1(001*001),结果正确。
5.浮点数加法:
这里输入并未输入特别规范的移码表示其阶码的格式,这样输入比较简单,而且在两个阶码均正的情况下不会涉及到大小对阶时判断错误的情况。
阶码为0(浮点数1和2的阶码均为0的结果)
浮点数23位数值的计算结果为002,这里我将其设为十进制,但在用的时候还必须将其转变为二进制才可用,例如这个的最后结果应该为1.00000000000000000000010*2^0,可知结果正确。
附录:
代码
datasegment
user_stringdb75,?
72dup(?
)
float1_signdb?
float1_jiedb?
float1_figuredd?
float1_figure_budd?
float2_signdb?
float2_jiedb?
float2_figuredd?
float_jiedb?
'
$'
resultdd?
;
exittdw"
溢出$"
temprdw?
dataends
codesegment
mainprocfar
assumeds:
data,cs:
code
start:
movax,data
movds,ax
callinputBAndSelect8
pushbx;
将下一字符的地址放入堆栈
movbh,ah;
将输入的字符放到bh
rolbx,1;
取第一个操作码到cf
jncINTEGER;
CF=0
jcothers;
CF=1
INTEGER:
rolbx,1;
取第二个操作码到cf
jncINTEGERadd;
jcINTEGERsub;
INTEGERadd:
callINTEGER_ADD
INTEGERsub:
callINTEGER_SUB
others:
jncINTEGERmul;
jnzFLOAT;
INTEGERmul:
callINTEGER_MUL
FLOAT:
movbl,0
movcl,3
rolbx,cl;
取第一个定点数放到bl
movch,bl;
转存到ch
取第二个定点数放到bl
movcl,bl;
转存到cl
andcx,cx
jzFLOATadd
testcx,10h
jzFLOATsub
testcx,20h
jzFLOATmul
FLOATadd:
callFLOAT_ADD
FLOATsub:
callFLOAT_SUB
FLOATmul:
callFLOAT_MUL
ret
mainendp
-----------------------------------------------------
=====================================================
INPUTBINARYSTREAM(读入字符串,并取出前8个字符到ah寄存器中,bx指向字符串的下一字符)
inputBAndSelect8procnear
leabx,user_string
movah,0ah
int21h
movch,0
addbx,2;
指向真正字符串开始的位置
movah,0
movcl,8
addcl,255
beginin:
moval,[bx]
addal,208;
将字符串变为数值
mov[bx],al
addah,al;
将输入的字符串组成一个数
rolah,1
addbx,1
loopbeginin
moval,[bx];
最后一次不用移位
addbx,1;
指向下一个字符
inputBAndSelect8endp
==================================================
==================================================
整数加法,bh中只有两个操作数,各三位,最后结果存放到result内存
INTEGER_ADDprocnear
取第一个操作数放到bl
取第二个操作数放到bl
addch,cl;
第一个操作数和第二个操作数做加法
movresult,ch
callDISPLAY_RESULT
INTEGER_ADDendp
==================================================
整数减法,bh中只有两个操作数,各三位,最后结果存放到result内存
INTEGER_SUBprocnear
notcl;
将第二个操作数取反
addcl,1;
取反加1求补
第一个操作数和第二个操作数的补相加
INTEGER_SUBendp
====================================================
整数乘法,bh中只有两个操作数,各三位,最后结果存放到result内存
INTEGER_MULprocnear
moval,bl;
转存到al
movdx,0;
初始化结果为0
beginmu:
shrbx,1;
判断最后一位是否为1
jcadd1;
rordx,1;
将最后总和右移,为下一步做铺垫
loopbeginmu
roldx,cl;
将最后的结果放到dh保存
movresult,dh;
再移到result
add1:
adddh,al;
加第一操作数
ret
INTEGER_MULendp
浮点数的加法,取相应的数据进行对阶-运算-右归操作
FLOAT_ADDprocnear
callSAVE_FLOAT_DATA
movch,float1_jie
movcl,float2_jie
notch
addch,1
addcl,ch
cmpcl,0
jgDUI_JIE_a;
第二个浮点数的阶码比较大
jzDUI_JIE2_a
notcl
addcl,1
jgDUI_JIE1_a
DUI_JIE_a:
movch,float2_jie
movfloat_jie,ch
movax,float1_figure
movbx,float1_figure+2
xorch,ch
beginmove1_a:
shrbx,1
shrax,1
jcadjust_a
loopbeginmove1_a
movcx,float2_figure
movdx,float2_figure+2
jmpd_add
adjust_a:
addbx,10h
DUI_JIE1_a:
movax,float2_figure
movbx,float2_figure+2
beginmove2_a:
jcadjust1_a
loopbeginmove2_a
movcx,float1_figure
movdx,float1_figure+2
adjust1_a:
DUI_JIE2_a:
movax,float1_jie
movfloat_jie,ax
--------------------------------------
将各个数变为补码
d_add:
movah,float1_sign
testah,1
jzd_add1
notax
notbx
jncd_add1
addax,1
d_add1:
movch,float2_sign
testch,1
jzd_add2
notcx
notdx
adddx,1
jncd_add2
addcx,1
运算
d_add2:
addax,cx
addbx,dx
jcadjust2_a
testax,80h
jnzYOU_GUI_a
movresult,ax
movresult+2,bx
callDISPLAY_JIE
adjust2_a:
YOU_GUI_a:
jcadjust3_a
movcx,float_jie
cmpcx,0100h
jzexit_a
movfloat_jie,cx
adjust3_a:
addbx,8000h
exit_a:
;
callOVERFLOW
FLOAT_ADDendp
===================================================
将剩余数据存到相应内存
SAVE_FLOAT_DATAprocnear
popbx
将第一个浮点数的信息存入内存;
addal,208
mov[float1_sign],al
incbx
movcl,7
movax,0
beginf1_jie:
指向下一个字符
loopbeginf1_jie
rolah,1
pushbx
leabx,float1_jie
addbx,2
mov[bx],ah
movcl,15
movdx,0
beginf1_figure1:
adddx,al;
roldx,1
loopbeginf1_figure1
beginf1_figure2:
shldx,1
jcah1
shlah,1
addah,0
loopbeginf1_figure2
jmpshr1
ah1:
addah,1
loopbeginf1_figure2
shr1:
shrah,1
jcshr11
shrdx,1
jmpsave1
shr11:
adddx,80h
save1:
pushbx
leabx,float1_figure
movfloat1_figure+2,dx
movfloat1_figure,ah
将第二个浮点数的信息存入内存;
mov[float2_sign],al
beginf2_jie:
loopbeginf2_jie
leabx,float2_jie
beginf2_figure1:
loopbeginf2_figure1
beginf2_figure2:
jcah2
loopbeginf2_figure2
jmpshr2
ah2:
loopbeginf2_figure2
shr2:
jcshr21
jmpsave2
shr21:
save2:
leabx,float2_figure
movfloat2_figure+2,dx
movfloat2_figure,ah
SAVE_FLOAT_DATAendp
浮点数的减法,到相应内存取数进行对阶-运算-右归操作
FLOAT_SUBprocnear
jgDUI_JIE_s;
jzDUI_JIE2_s
cmpc