2016-09-11 6 views
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

+1

Последний байт равен нулю: 0x61000000000000 ** 00 **. Когда вы читаете 8 байтов, вы получаете 7 байтов после последнего, и вы не просите об их обнулении. – PetSerAl

+0

Я использую intel x64 (i3) с небольшим количеством endian. Итак, похоже, что самый старший байт (0x61) должен быть последним в буфере? Или я ошибаюсь, правильно, пожалуйста. –

+1

Вам нужно использовать '$ rax + 1242' для чтения 8 последних байтов вашего буфера. Теперь вы читаете только 1 последний байт своего буфера плюс 7 байт после вашего буфера. Это 7 байт не должно быть равным нулю. – PetSerAl

ответ

2

Вы интерпретируемой памяти как 64-битное целое число, но вы забыли, что спецификация intel is litt ледиан. Таким образом, байты были отменены.

0x6100000000000000 - это значение, которое процессор считывает при де-сериализации памяти по этому адресу. Так как это маленький обратный порядок байт, то 0x61 байт является последним в памяти (не очень удобно сбрасывать память в этом формате, если у вас нет большой архитектуры Endian)

Использование x /10bx $rax + 1249 вы увидите, что это ноль в правильном месте. Остальное - это мусор (0)

0x00 0x00 0x00 0x00 0x00 0x00 0x61 
+0

Я получаю '0x6035a1: 0 '\ 000' 0 '\ 000' 0 '\ 000' '\ 000' 0 '\' 000 '0' \ '000' 0 '\' 000 '97' a'', очень странно –

+1

Этот формат отладки выдает значения + представление символа. Так что это нормально. И в этом формате вы получаете то, что находится в памяти, а не то, что CPU интерпретирует, когда он загружает данные в целочисленные регистры. –

 Смежные вопросы

  • Нет связанных вопросов^_^