2016-10-11 5 views
4

Я немного смущен тем, как переменные реализованы в Assembly. Я знаю, что следующее объявление создает именованный ячейку памяти в data разделе программы:Как реализованы переменные сборки?

.section .data 
     var: 
       .long 23 

Затем вы можете получить доступ к переменной, такие как:

movl var, %eax //read from var location 

То, что я не ясно, на то, как выше инструкции фактически реализованы. У меня создалось впечатление, что ссылку на память, даже ссылку на абсолютную память, необходимо было загрузить в регистр до того, как он сможет быть использован.

нужен ли ассемблеру для преобразования выше указаний на нескольких команд, такие как:

leal var, %ebx 
movl (%ebx), %eax 

Или же ассемблер отслеживать адреса var и доступ к этому месту, как если бы это были абсолютным немедленный доступ , например:

movl ($addr_of_var), %eax 
+0

Нет. У вас есть непонимание требований. Вам не нужно загружать адрес в регистр. Посмотрите инструкцию по инструкции для семейства команд MOV. –

ответ

8

набор команд x86 не требует памяти адреса для загрузки в регистры, прежде чем они могут быть использованы - почти все команды могут использовать ссылки на прямые или косвенные памяти в инструкция. См. Intel architecture manual для более подробной информации.

Требование сначала загружать адреса в регистры является характеристикой некоторого RISC-процессора, такого как MIPS.

+0

Спасибо! Является ли второе утверждение выше точным? (Ассемблер отслеживает абсолютные ссылки на переменные?) – David

+2

@David: assmebler символически символически относится к символьным ссылкам, оставляя его до компоновщика, чтобы определить конечные местоположения всего, и исправить код по мере необходимости. –

+0

Имеет смысл, спасибо за вашу помощь! – David