汇编 —— 尾数、负数加法、标准浮点数

大小尾数

小尾数:低位字节存储在低内存位置或寄存器的低位地址,高位字节存储在高内存位置或寄存器的高位地址。
大尾数:和小尾数的存储顺序是相反的,低位字节存储在高位地址。

intel采用的是小尾数存储格式:
检测:

.section .data
value:
    .int 0x127
.section .text
.global main
main:
    nop
    movl $0x127,%ebx
    int $0x80

查看内存情况:

(gdb) x/x &value
0x8049664 <value>:  0x27
(gdb) x/4x &value
0x8049664 <value>:  0x27    0x01    0x00    0x00
(gdb) p/x $ebx
$1 = 0x127
(gdb) p/x $bx
$2 = 0x127
(gdb) p/x $bl
$3 = 0x27
(gdb) p/x $bh
$4 = 0x1

负数的数学计算

在计算机中,四则运算以加法为基础。理解负数在计算机中以补码表示,负数和非负数的加法计算,负数和负数的加法计算很重要。

使用gdb简单查看负数的加法操作:
汇编:

.section .text
.global main
main:
   nop
   movl $24,%edx
   movl $-35,%ecx
   addl %edx,%ecx
   movl $-24,%edx
   addl %edx,%ecx
   int $0x80

gdb调试:

Temporary breakpoint 1, main () at negtive.s:4
4      nop
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.192.el6.i686
(gdb) n
5      movl $24,%edx
(gdb) n
6      movl $-35,%ecx
(gdb) n
7      addl %edx,%ecx
(gdb) p/t $edx
$1 = 11000
(gdb) p/t $ecx
$2 = 11111111111111111111111111011101
(gdb) n
8      movl $-24,%edx
(gdb) p/t $ecx
$3 = 11111111111111111111111111110101
(gdb) p $ecx
$4 = -11
(gdb) n
9      addl %edx,%ecx
(gdb) p $edx
$5 = -24
(gdb) p/t $edx
$6 = 11111111111111111111111111101000
(gdb) n
10     int $0x80
(gdb) p $ecx
$7 = -35
(gdb) p/t $ecx
$8 = 11111111111111111111111111011101

整个过程简单地说是这样的:

00000000000000000000000000011000 + 
11111111111111111111111111011101 =
11111111111111111111111111110101
即是:24 + -35 = -11
11111111111111111111111111101000 +
11111111111111111111111111110101 =
11111111111111111111111111011101
即是:-24 + -11 = -35

标准浮点数据

标准浮点数据类型,IEEE标准754顶的浮点数

32位单精度浮点数

这里写图片描述
因为假设有效数字的整数值是1,并且不在有效数字值中使用它,所以精度就变成了23+1=24。
指数使用8位,那么它的范围应该是-128~127.
单精度浮点数最大绝对值是 1.9˙×21271.9˙×1.701×10383.4×1038

64位双精度浮点数

这里写图片描述
指数的位数是11,2^11=2048,那么指数的范围是-1024~1023.
双精度的最大绝对值估计为: 1.9˙210231.79×10308

拓展双精度

IA-32平台,拓展双精度格式使用在80位FPU寄存器中。
这里写图片描述
指数位是15,2^15=32768,那么指数的范围是-16384~16383,拓展双精度的最大绝对值是: 1.9˙×2163831.18×104932
由此我们得到下面这张表:

数据类型 长度 有效数字位 指数位 精度范围
单精度 32 23 8 1.18×10383.41038
双精度 64 53 11 2.23×103081.79×10308
拓展双精度 80 64 15 3.37×1049321.18×104932

最小的精度值我没能想通它是怎么算出来的。望交流。

浮点数转化成二进制

(例子讲解12.23转化成01000001010000111010111000010100):
1. 提取小数部分0.23,乘以2,如果整数部分是1,那么十分位是1,否则是0 0.23×2=0.46decimals:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值