为什么没有填零
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
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