У меня есть код ассемблера, который я читаю, и в нем есть следующая часть:
mov $0x28,%esi
mov %rax,%rdi
callq <strchr@plt>
mov %rax,%rbx
test %rax,%rax
jne somewhere
У меня возникли некоторые трудности в этом коде.Первый ход перемещается 0x28
для регистрации %esi
.Второй перемещается %rax
в %rdi
, а затем делает strchr(char *rdi, char *esi)
.Таким образом, в основном он возвращает указатель на первое вхождение после ascii 0x28
, которое равно '('
.Затем последний тест говорит мне, что он проверяет, имеет ли строка в rdi
символ '('
.Если нет, то test %rax, %rax
будет устанавливать ZeroFlags, а jne
не будет выполняться.Правильно ли мое понимание?
Еще один вопрос, который у меня возникает, - когда я пытаюсь проверить, что именно находится в %esi
после первого mov
, я использую команду p (char *)$esi
в gdb
, но получаювыход <error: Cannot access memory at address 0x28>
.Может кто-нибудь посоветовать мне, как я могу просмотреть содержимое $esi
?