Какова цель перемещения регистра к себе как в "mov (%eax), eax"?

Разбирая простой код C с помощью GCC, я наткнулся на:

mov (%eax), eax

Мое понимание сборки таково, что когда у вас есть () окружая регистр, вы добавляете какое-то число к адресу памяти, т.е. 0x4(%eax) будет означать 4 байта выше регистра %eax,

Здесь, однако, нет номера до ()Таким образом, он, похоже, копирует значение из регистра в себя.

Я заметил, что %eax регистр используется довольно часто, чтобы возвращать переменные, и эта строка происходит сразу после вызова функции, так что я предполагаю, что эта инструкция на самом деле говорит машине брать то, что было в %eax зарегистрироваться для вызываемой функции (т. е. возвращаемого значения) и положить в %eax зарегистрироваться для текущей функции.

Это правильно? Если нет, то в чем я ошибся и что он на самом деле делает?

1 ответ

Решение

() в синтаксисе at&t обозначает разыменование памяти, вы, вероятно, должны прочитать об эффективном синтаксисе адресов. Эквивалентный код C будет eax=*eax; то есть, загрузить 4 байта из памяти, используя текущее значение eax как адрес, так и перезаписать eax с извлеченным значением.

Вызовы и возвраты функций не влияют на значения регистров (кроме, конечно, стека и указателя инструкций), понятия не существует eax звонящего или вызываемого.

PS: вы можете переключиться gdb в режим синтаксиса Intel с помощью set disassembly-flavor intel, если вы не довольны AT & T.

Другие вопросы по тегам