为什么没有用零填充

时间:2016-09-11 08:33:37

标签: x86-64 memset yasm fencepost

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

1 个答案:

答案 0 :(得分:2)

您将内存解释为64位整数,但您忘记了英特尔的字节序是小端。所以字节反转了。

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

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

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