[Toddler's Bottle]-memcpy

  • 让我们输入10个数,然后在experience 5报错了,gdb调试发现是movntps汇编语句报错,
[Toddler's Bottle]-memcpy_第1张图片
[Toddler's Bottle]-memcpy_第2张图片
  • 查阅之后发现,movaps必要要对齐16字节,而edx的地址是0x0804c4a8并没有对齐16字节,所以不行,而0x0804c4a8是分配的堆地址
movntps m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不经过cache,必须对齐16字节.
  • 所以我们要使所有的堆地址对齐16字节才能不报错,只需要所以malloc分配的堆块大小都对齐16字节,写个脚本计算一下符合的size

for i in range(3,13):

    num = pow(2,i)

    while True:
        
        tmp = num/8
        a = tmp if (tmp * 8 + 4) >= num else tmp+1

        malloc_size = 8 * (a+1)

        if malloc_size % 16 == 0:
            print num
            break

        num += 1
[Toddler's Bottle]-memcpy_第3张图片
[Toddler's Bottle]-memcpy_第4张图片
image.png

你可能感兴趣的:([Toddler's Bottle]-memcpy)