Какова цель перемещения регистра к себе как в "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.