【发布时间】:2017-01-18 22:39:04
【问题描述】:
为 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
【问题讨论】:
-
最后一个字节为零:0x6100000000000000。当您读取 8 字节值时,您会在最后一个字节之后获得 7 个字节,并且您不需要将它们归零。
-
我正在使用带有小端序的 intel x64(i3)。所以看起来最重要的字节(0x61)应该在缓冲区的最后?或者我犯了错误,请纠正。
-
您需要使用
$rax + 1242来读取缓冲区的最后 8 个字节。现在您只读取缓冲区的最后一个字节加上缓冲区后的 7 个字节。这 7 个字节不需要为零。 -
Little-endian 表示最低有效字节在前(地址较小):0x($rax + 1256)61($rax +1255)00($rax +1254)00($rax +1253 )00($rax +1252)00($rax +1251)00($rax +1250)00($rax +1249)00.
-
现在我明白了,命令应该是
x/1c $rax + 1249,并且会准确显示最后一个字节。
标签: x86-64 memset yasm fencepost