首页
社区
课程
招聘
[求助]求1个转换浮点数十进制与二进制表示的软件
发表于: 2007-10-14 23:28 6602

[求助]求1个转换浮点数十进制与二进制表示的软件

2007-10-14 23:28
6602
如题,设计浮点数乘法指令,方便作转换

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 58782
活跃值: (21926)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
2007-10-15 09:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢kanxue佬大,前两天都在做浮点数乘法,最后是算法错了,时间有限,指令又没设计好,不得不放弃他做8位乘法算了,不过花了两天放弃一条100分选60分的题,感觉不值.

附我的浮点数乘法,在有限的几条指令做的,高手可以指点下,有效值相乘的算法怎样实现,书本讲得不清楚

.386
.model flat,stdcall
option casemap:none

.data
;CADC局部变量
adccy        db        1
temp        db        ?

;CSHL,CSHR变量
shac        dword        ?
shadd        dword        ?
shadd1        dword        ?

;test
test1        db        0B2H,0C3H,58H

;MUL23X23,FX变量
mulac        db        ?

fxsub        db        81H        ;-127

f1        db        3FH                ;浮点数1:f1,fac2-0
fac2        db        0C0H        ;被乘数:fac2-0
fac1        db        0
fac0        db        0

f0        db        3FH                ;浮点数2:f0,ier2-0
ier2        db        0C0H        ;乘数:ier2-0
ier1        db        0
ier0        db        0

s        db        ?        ;符号
e        db        ?        ;阶数                ;浮点数乘法结果:e,res5-3
res5        db        ?        ;23位乘法结果:res5-0
res4        db        ?
res3        db        ?
res2        db        ?
res1        db        ?
res0        db        ?

.code
FX        proc
        mov        al,f1        ;符号检查,结果存于s中的第一位
        test        cl,80h
        jnz        F1CY1
F1CY0:
        mov        al,f0
        test        al,80h
        jnz        S1
S0:
        mov        al,0
        mov        s,al
        jmp        SEND
F1CY1:
        mov        al,f0
        test        al,f0
        jnz        S0
S1:
        mov        al,1
        mov        s,1
SEND:
        lea        eax,f1        ;阶数相加,结果存于e中
        mov        ebx,4
        call        CSHL
        lea        eax,f0
        mov        ebx,4
        call        CSHL
        mov        al,f1
        add        al,f0
        add        al,fxsub
        mov        e,al
       
        lea        eax,fac2        ;有效值相乘,存于res5-res0中
        mov        ebx,3
        call        CSHR
        lea        eax,ier2
        mov        ebx,3
        call        CSHR
        call        MUL23X23
       
        lea        eax,res5        ;结果移位处理,浮点数乘法结果为:e,res5-3
        mov        ebx,3
        call        CSHL
        lea        eax,s
        mov        ebx,5
        call        CSHR
        ret

FX endp

MUL23X23 proc;23位无符号乘法,结果保存在res5-0的46-1位中

        mov        al,fac2
        and        al,7FH
        mov        fac2,al
        mov        al,0
        mov        res5,al
        mov        res4,al
        mov        res3,al
        mov        al,23
        mov        mulac,al
MULRET:
        mov        al,ier0
        test        al,1
        jnz        MULCY1
        jmp        MULCY0
MULCY1:
        mov        al,res3
        add        al,fac0
        mov        res3,al
       
        mov        bl,res4
        mov        cl,fac1
        call        CADC
        mov        res4,bl
       
        mov        bl,res5
        mov        cl,fac2
        call        CADC
        mov        res5,bl
MULCY0:
        lea        eax,res5
        mov        ebx,6
        call        CSHR
        lea        eax,ier2
        mov        ebx,3
        call        CSHR
        dec        mulac
        jnz        MULRET
        ret

MUL23X23 endp

CSHL proc;逻辑左移一位,eax:起始地址,ebx:移动字节数

        mov        shac,ebx
        add        eax,shac
        mov        shadd,eax
        mov        shadd1,eax
        dec        shadd
        dec        shadd1
SHLRET:
        mov        edx,shadd
        mov        al,[edx]
        rcl        al,1
        mov        edx,shadd
        mov        [edx],al
        dec        shadd
        dec        shac
        jnz        SHLRET
       
        mov        edx,shadd1
        mov        al,[edx]
        and        al,0FEH
        mov        edx,shadd1
        mov        [edx],al
        ret

CSHL endp

CSHR proc;逻辑右移一位,eax:起始地址,ebx:移动字节数

        mov        shac,ebx
        mov        shadd,eax
        mov        shadd1,eax
SHRRET:
        mov        ecx,shadd
        mov        al,[ecx]
        rcr        al,1
        mov        ecx,shadd
        mov        [ecx],al
        inc        shadd
        dec        shac
        jnz        SHRRET
       
        mov        ecx,shadd1
        mov        al,[ecx]
        and        al,7FH
        mov        ecx,shadd1
        mov        [ecx],al
        ret

CSHR endp

CADC proc;用子程序实现ADC指令,bl<--bl+cl+cy

        mov        temp,cl
        rcl        cl,1
        test        cl,1
        jnz        CY1
        jmp        CY0
CY1:
        add        bl,adccy
        jnz        CY0
        add        bl,temp
        mov        cl,0FFH
        add        cl,adccy
        ret
CY0:
        add        bl,temp
        ret
CADC endp

start:
        call        FX
        mov        eax,dword ptr e
        xor        edx,edx
       

end        start
2007-10-15 16:03
0
游客
登录 | 注册 方可回帖
返回