mov
явно перемещает данные; В случае сбоя ваша программа перестанет работать.
Размер по умолчанию для символов без отладочной информации составляет 4 байта. Вы можете использовать ptype h_vals
, чтобы проверить, что об этом думает gdb.
Помните, что синтаксис gdb работает как C, даже если вы отлаживаете asm. В C добавление чего-либо к указателю смещает такое количество элементов, а не столько байтов.
&h_vals &h_vals + 8 * $rax
не выполняет оценку в GDB по адресу, который вы ожидаете. (Кроме того, я думаю, что &h_vals &h_vals
- это опечатка, а не то, что вы на самом деле использовали.)
Так как gdb считает, что &h_vals
является int*
, &h_vals + offset
создаст байтовое смещение 4 * смещение, точно так же, как h_vals[offset]
в C. Таким образом, адрес, который вы ex
amining в gdb, на самом деле [h_vals + 8 * 4 * rax]
.
Другой способ проверки: p /x &h_vals
и p /x $rax
по отдельности. Вы можете вычислить сами и сравнить с адресом, который вы видели в выходных данных x/
.
Самым безопасным решением здесь является преобразование в char*
:
x /dg 8 * $rax + (char*)&h_vals
Или: определите свои символы в .c
, чтобы компилятор сгенерировал для них отладочную информацию (потому что вы не хотите делать это вручную).
например поместите unsigned long h_vals[99999];
в .c, который вы компилируете с gcc -c -g vars.c
, и свяжите полученный .o с .o, созданным YASM из вашего .asm.
person
Peter Cordes
schedule
04.09.2016