0

为 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
$3 = 0x6030c0

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

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

检查第一个字节:

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

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

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

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

4

1 回答 1

2

您将内存解释为 64 位整数,但您忘记了 intel 的字节序是小字节序。所以字节被颠倒了。

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

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

0x00    0x00    0x00    0x00    0x00    0x00    0x61
于 2016-09-11T08:41:31.140 回答