汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx

上传人:b****5 文档编号:19504949 上传时间:2023-01-07 格式:DOCX 页数:33 大小:42.85KB
下载 相关 举报
汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx_第1页
第1页 / 共33页
汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx_第2页
第2页 / 共33页
汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx_第3页
第3页 / 共33页
汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx_第4页
第4页 / 共33页
汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx

《汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx》由会员分享,可在线阅读,更多相关《汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx(33页珍藏版)》请在冰豆网上搜索。

汇编语言只用ADD指令实现整数和浮点数的加减乘法Word下载.docx

利用硬件实现乘法的思想,通过判断第二个操作数的未判断的较低位决定是加被乘数还是加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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1