Код операции x86 cmp, указатели и встроенные литералы - PullRequest
2 голосов
/ 23 января 2012

Я использую GDB для изучения программы.В сборке код выполняет:

cmp $0x5, %eax

Однако, когда я проверяю содержимое %eax, я получаю: \020\343\377\377\377\177 при проверке в виде строки.

Как это \020\343\377\377\377\177 по сравнению с $ 0x5 в сборке?

1 Ответ

2 голосов
/ 23 января 2012

cmp в этом случае сравнивает значение в eax с константой 5.Значение, на которое указывает eax, если вы думаете, что это фактически указатель, вообще не сравнивается с константой.

Сравнение выполняется путем вычитания - в вашем случае это означает 5 вычитается из значения в eax, и несколько флагов (CF, OF, SF, ZF, AF и PF, согласно документации ) устанавливаются соответствующим образом.Обычно за инструкцией cmp следует условная инструкция некоторого вида (часто с переходом) для выполнения различных действий в зависимости от результатов сравнения.

Если вы сообщите нам значение в eax,вместо того, чтобы интерпретировать eax как указатель, я мог бы дать вам больше информации.Вы можете использовать p $eax или info registers, чтобы получить значение eax в GDB.

...