为什么没有填零

why did not fill with zeros

10000 位的分配数组 = 1250 字节 (10000/8):

mov edi, 1250
call malloc

测试指针:

cmp rax, 0
jz .error ; error handling at label down the code

已分配内存:

(gdb) p/x $rax
 = 0x6030c0

试图用零填充分配的内存:

mov rdi, rax
xor esi, esi
mov edx, 1250 ; 10000 bits
call memset

检查第一个字节:

(gdb) p/x $rax
 = 0x6030c0
(gdb) x/xg $rax + 0
0x6030c0: 0x0000000000000000

检查最后一个字节(0 - 第一个字节,1249 - 最后一个字节)

(gdb) p/x $rax + 1249
 = 0x6035a1
(gdb) x/xg $rax + 1249
0x6035a1: 0x6100000000000000

问题已解决 应该输入 x/1c $rax + 1249

你把内存解释成一个64位的整数,但是你忘了intel的字节序是little endian。所以字节被颠倒了。

0x6100000000000000 是 CPU 反序列化该地址内存时读取的值。由于是小端,0x61字节在内存中排在最后(以这种格式转储内存不是很方便,除非你有大端架构)

使用 x /10bx $rax + 1249 你会看到它在正确的位置为零。剩下的就是垃圾(刚好一会为零,然后就是垃圾)

0x00    0x00    0x00    0x00    0x00    0x00    0x61