gpt4 book ai didi

c - float 到 double (IEEE754) 转换

转载 作者:太空宇宙 更新时间:2023-11-04 07:59:00 26 4
gpt4 key购买 nike

我试图在 x86 架构上的 asm 中将 32 位 float 转换为 64 位 double。转换是由用 asm 编写的函数完成的,然后我想从 C 调用它。我不知道我做错了什么,但是 dst 指向的内存似乎保持不变并且在 printf 程序崩溃。 我想在没有任何浮点指令的情况下执行此操作。这是代码:

.686 
.model flat
public _conv

.data
mantissa_mask dd 00000000011111111111111111111111b
exponent_mask dd 01111111100000000000000000000000b

.code

_conv PROC
pusha
mov ebp, esp

mov esi, dword ptr [ebp+8] ; src
mov edi, dword ptr [ebp+12]; dst

mov dword ptr [edi], 0
mov dword ptr [edi+4], 0

mov eax, dword ptr [esi]
and eax, dword ptr mantissa_mask
mov dword ptr [edi], eax
xor edx, edx ; zero edx
mov ecx, 1
shl ecx, 29 ;ecx == 2^29
mul ecx ;so it's like `shl edx:eax, 29`
mov dword ptr [edi], eax
mov dword ptr [edi+4], edx

mov eax, dword ptr [esi]
and eax, dword ptr exponent_mask
shr eax, 23 ;put exponent on lowest bits
sub eax, 127 ;exponent in float is coded enlarged by 127
add eax, 1023 ;in double it's enlarged by 1023
shl eax, 20 ;exponent in double starts on 20bit of 2nd byte
or dword ptr [edi], eax

;sign bit:
bt dword ptr [esi], 31
jc set_sign_bit
btr dword ptr [edi+4], 31
jmp endthis
set_sign_bit:
bts dword ptr [edi+4], 31
endthis:

popa
ret
_conv ENDP

END

C 代码:

void conv(float * src, double * dst);

int main()
{
float src = 4.5f;
double dst = 0.;
conv(&src, &dst);
printf("%f\n", dst);
return 0;
}

最佳答案

您的主要问题是访问参数。由于您执行了 pusha,因此参数位于 [ebp+8][ebp+12],而是在 [ebp+36][ebp+40]。调试器会立即向您展示这一点。即使进行了这些更改,您的代码仍然存在问题。

关于c - float 到 double (IEEE754) 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48036967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com