Разница между значением reg и адресом reg - PullRequest
1 голос
/ 15 января 2020

Чем это отличается?:

movl 4(%esp), %eax # put old ptr into eax
9 popl 0(%eax)

Первая инструкция помещает содержимое первого аргумента в %eax, но вторая делает то же самое (самое верхнее содержимое стека), или это косвенная адресация? Не будут ли значения перекрывать друг друга в %eax?

Ответы [ 2 ]

3 голосов
/ 15 января 2020

0(%eax) - это ячейка памяти по адресу, сохраненному в eax. %eax является содержанием eax. Два не эквивалентны. Также обратите внимание, что x86 использует полностью нисходящий стек, поэтому pop 0(%eax) эквивалентен

mov (%esp), 0(%eax)
add $4, %esp

, т.е. он загружается из (%esp), а не 4(%esp) как ваша другая инструкция. pop также изменяет значение esp, которое mov 4(%esp), %eax не делает. (также обратите внимание, что mov (%esp), 0(%eax) на самом деле не является действительной инструкцией, это просто для иллюстрации принципа).

1 голос
/ 15 января 2020

Значение / содержимое регистра можно использовать при формировании адреса памяти для чтения или записи (иначе как разыменование ), в так называемых режимах адресации .

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


Регистры предлагают очень ограниченный доступ очень быстрое дополнительное хранение вне памяти. Сами регистры не имеют адресов, таких как ячейки памяти; они не могут быть проиндексированы или адресованы так, как память - они могут быть названы только в инструкциях. Регистр может содержать адрес памяти и использоваться для доступа к памяти (разыменование через режим адресации), но регистры не могут содержать адреса регистров (поскольку такой вещи нет).

...