1、利用硬件实现乘法的思想,通过判断第二个操作数的未判断的较低位决定是加被乘数还是加0的操作,然后将结果右移,直到将操作数的所有位判断完毕(最后一位不移位),将结果存入result内存单元中。4)浮点数加法:前面取了前8位归并后,将指针的位置保留下来,现在将其指针弹栈继续对剩下的输入的字符进行操作。首先调用子程序将剩下的输入字符流存入内存以待使用(将字符流转变成数值并组成一个完整的数字,即浮点数有三个数:1位的数符,8位的阶码,23位的数值)。此次运算严格按照浮点数的运算进行,即先对阶(阶码小的向阶码大的对齐)-取数运算(由于输入的是二进制字符流,因此在运算之前需根据数符对数值进行补码操作,而且由
2、于有23位数值,通用寄存器只有16位,需调用两个寄存器来运算,注意低位是否有向高位的进位)-规格化,最后将阶码存到float_jie内存,数值运算结果存入result单元。并通过中断对阶码和数值进行输出显示。5)浮点数减法:及加法一样先调用中断将剩下的浮点数信息存入内存。及加法不同的是由于只能用加法指令,在操作的时候同样需先对第二个浮点数进行求补操作(取反加1),然后在进行及加法一样的操作,最后将阶码存到float_jie内存,数值运算结果存入result单元。6)浮点数乘法:及前面两个浮点数的操作一样先将剩下的浮点数信息存入内存。我们这里操作数均取得补码,因此用booth算法做乘法运算(通过
3、移位取最低两位进行判断,如果相同则加0,如果ynyn-1=10,则加【x】补,如果为ynyn-1=01,则加【-x】补),通过23次的判断,进行加法操作和移位,最终得到结果,将阶码存到float_jie内存,数值运算结果存入result单元。三、在此给出部分运行结果:1.整数加法输入:注意:指令P下面的二进制字符流严格按照要求的格式进行输入输出:由于我在存储的时候将result内存设为了dd型,而我在存的时候存在了高位,在内存中是以大端格式存储,对于此题我们只用到了三位数的加法,显然可以看出最后结果为02(001+001),正确。2.整数减法这里和整数加法是一样的输出设置,因此结果为01(01
4、0-001),正确。4.整数乘法输出为1(001*001),结果正确。5.浮点数加法:这里输入并未输入特别规范的移码表示其阶码的格式,这样输入比较简单,而且在两个阶码均正的情况下不会涉及到大小对阶时判断错误的情况。阶码为0(浮点数1和2的阶码均为0的结果)浮点数23位数值的计算结果为002,这里我将其设为十进制,但在用的时候还必须将其转变为二进制才可用,例如这个的最后结果应该为1.00000000000000000000010*20,可知结果正确。附录:代码data segmentuser_string db 75,?,72 dup(?)float1_sign db ?float1_jie d
5、b ?float1_figure dd ?float1_figure_bu dd ?float2_sign db ?float2_jie db ?float2_figure dd ?float_jie db ?,$result dd ?;exitt dw 溢出$tempr dw ?data endscode segmentmain proc farassume ds:data,cs:codestart:mov ax,data mov ds,ax call inputBAndSelect8 push bx;将下一字符的地址放入堆栈 mov bh,ah;将输入的字符放到bh rol bx,1;取第
6、一个操作码到cf jnc INTEGER;CF=0 jc others;CF=1INTEGER: rol bx,1;取第二个操作码到cf jnc INTEGERadd; jc INTEGERsub;INTEGERadd: call INTEGER_ADDINTEGERsub: call INTEGER_SUBothers: jnc INTEGERmul; jnz FLOAT;INTEGERmul: call INTEGER_MULFLOAT: mov bl,0 mov cl,3 rol bx,cl;取第一个定点数放到bl mov ch,bl;转存到ch取第二个定点数放到bl mov cl,bl
7、;转存到cl and cx,cx jz FLOATadd test cx,10h jz FLOATsub test cx,20h jz FLOATmulFLOATadd: call FLOAT_ADDFLOATsub: call FLOAT_SUBFLOATmul: call FLOAT_MUL ret main endp-=INPUT BINARY STREAM(读入字符串,并取出前8个字符到ah寄存器中,bx指向字符串的下一字符)inputBAndSelect8 proc near lea bx,user_string mov ah,0ah int 21h mov ch,0 add bx,
8、2;指向真正字符串开始的位置 mov ah,0 mov cl,8 add cl,255beginin: mov al,bx add al,208;将字符串变为数值 mov bx,al add ah,al;将输入的字符串组成一个数 rol ah,1 add bx,1 loop beginin mov al,bx;最后一次不用移位 add bx,1;指向下一个字符 inputBAndSelect8 endp = =整数加法,bh中只有两个操作数,各三位,最后结果存放到result内存INTEGER_ADD proc near取第一个操作数放到bl取第二个操作数放到bl add ch,cl;第一个操
9、作数和第二个操作数做加法 mov result,ch call DISPLAY_RESULTINTEGER_ADD endp= 整数减法,bh中只有两个操作数,各三位,最后结果存放到result内存INTEGER_SUB proc near not cl;将第二个操作数取反 add cl,1;取反加1求补 第一个操作数和第二个操作数的补相加INTEGER_SUB endp=整数乘法,bh中只有两个操作数,各三位,最后结果存放到result内存INTEGER_MUL proc near mov al,bl;转存到al mov dx,0;初始化结果为0 beginmu: shr bx,1;判断最后
10、一位是否为1 jc add1; ror dx,1;将最后总和右移,为下一步做铺垫 loop beginmu rol dx,cl;将最后的结果放到dh保存 mov result,dh;再移到result add1: add dh,al ;加第一操作数 retINTEGER_MUL endp浮点数的加法,取相应的数据进行对阶-运算-右归操作FLOAT_ADD proc near call SAVE_FLOAT_DATA mov ch,float1_jie mov cl,float2_jie not ch add ch,1 add cl,ch cmp cl,0 jg DUI_JIE_a;第二个浮点数
11、的阶码比较大 jz DUI_JIE2_a not cl add cl,1 jg DUI_JIE1_aDUI_JIE_a: mov ch,float2_jie mov float_jie,ch mov ax,float1_figure mov bx,float1_figure+2 xor ch,chbeginmove1_a: shr bx,1 shr ax,1 jc adjust_a loop beginmove1_a mov cx,float2_figure mov dx,float2_figure+2 jmp d_addadjust_a: add bx,10hDUI_JIE1_a: mov
12、ax,float2_figure mov bx,float2_figure+2beginmove2_a: jc adjust1_a loop beginmove2_a mov cx,float1_figure mov dx,float1_figure+2adjust1_a:DUI_JIE2_a: mov ax,float1_jie mov float_jie,ax-将各个数变为补码d_add: mov ah,float1_sign test ah,1 jz d_add1 not ax not bx jnc d_add1 add ax,1d_add1: mov ch,float2_sign te
13、st ch,1 jz d_add2 not cx not dx add dx,1 jnc d_add2 add cx,1运算d_add2: add ax,cx add bx,dx jc adjust2_a test ax,80h jnz YOU_GUI_a mov result,ax mov result+2,bx call DISPLAY_JIEadjust2_a:YOU_GUI_a: jc adjust3_a mov cx,float_jie cmp cx,0100h jz exit_a mov float_jie,cxadjust3_a: add bx,8000hexit_a: ;cal
14、l OVERFLOWFLOAT_ADD endp=将剩余数据存到相应内存SAVE_FLOAT_DATA proc near pop bx将第一个浮点数的信息存入内存; add al,208 mov float1_sign,al inc bx mov cl,7 mov ax,0beginf1_jie:指向下一个字符 loop beginf1_jierol ah,1 push bx lea bx,float1_jie add bx,2 mov bx,ah mov cl,15 mov dx,0beginf1_figure1: add dx,al; rol dx,1 loop beginf1_figu
15、re1beginf1_figure2: shl dx,1 jc ah1 shl ah,1 add ah,0 loop beginf1_figure2 jmp shr1 ah1: add ah,1 loop beginf1_figure2 shr1: shr ah,1 jc shr11 shr dx,1 jmp save1shr11: add dx,80hsave1:push bxlea bx,float1_figure mov float1_figure+2,dx mov float1_figure,ah 将第二个浮点数的信息存入内存; mov float2_sign,albeginf2_ji
16、e: loop beginf2_jie lea bx,float2_jiebeginf2_figure1: loop beginf2_figure1beginf2_figure2: jc ah2 loop beginf2_figure2 jmp shr2 ah2: loop beginf2_figure2 shr2: jc shr21 jmp save2shr21:save2:lea bx,float2_figure mov float2_figure+2,dx mov float2_figure,ahSAVE_FLOAT_DATA endp浮点数的减法,到相应内存取数进行对阶-运算-右归操作FLOAT_SUB proc near jg DUI_JIE_s; jz DUI_JIE2_s cmp c
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1