能力值:
( 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
|