汇编语言中Float的二进制表示

时间:2017-07-13 13:19:27

标签: assembly floating-point

我正在学习汇编语言及其数据类型并遇到.float。我声明了一个名为.float的{​​{1}}变量,并将其值指定为Float。我使用GNU汇编程序v2.28来组装它,然后使用GNU Linker v2.28链接目标文件以创建可执行二进制文件。这是我的计划:

10.23

我使用GDB调试器设置了一个断点。

.data HelloWorld: .ascii "Hello World!\n" ByteLocation: .byte 10 Int32: .int 2 Int16: .short 5 Float: .float 10.23 IntArr: .int 3,6,7,8,10 .bss .comm LargeBuffer, 1000 .text .globl _start _start: nop movl $1, %eax movl $0, %ebx int $0x80

当我查看(gdb) break *_start+1 Breakpoint 1 at 0x4000b1: file 03 VariableDemo.s, line 22.的十进制表示和二进制表示时。我发现了这个:

Float

我引用Can anyone explain representation of float in memory?将二进制表示转换回10.23。这是我的计算:

第一位= 1 =>浮点是积极的。

接下来的8位= 10000010 =>表示+2作为有效数的乘数。

next 23 bits = 01000111010111000010100 =>当使用2的负幂转换时,给出0.278749943

但是0.278749943 * 2不是10.23。所以现在我想到了两个问题。

  1. 为什么文本中的10.23在内存中表示为10.2299995。
  2. 我的计算在哪里出错了?

2 个答案:

答案 0 :(得分:3)

  1. 转换错误,而不是基础10中“好”的所有内容在基础2中都会很好。
  2. 指数偏差为127而不是128,因此是+3而不是+2
  3. 您实际上需要使用指数,因此*2^3不仅仅是*2
  4. 您忘记了隐含的前导1位,因此您需要将1添加到尾数中,这意味着您有1.278749943*2^3=10.2299995

答案 1 :(得分:0)

尾数有一个隐含的前导1,所以它总是二进制1.xxxxxxx。然后根据指数进行左移或右移(指数偏置而不是二进制补码二进制数,因此127等于零移位,或1.xxxxx,128表示1x.x​​xxx等等)。

最后,二进制转换为denary以便输出。