2015-11-14 1 views
1

Я смущен, у меня есть эта простая программа мира, составленная и протестированная here. Как ассемблер знает, что писать в ecx, хотя команда msg db 'Hello, world!',0xa выполняется внизу? Ассемблер читает код снизу вверх или как это работает?Собирает ли сборку код снизу вверх?

И еще один вопрос. Почему 0xa за msg db 'Hello, world!?

mov edx, len ;message length 
mov ecx, msg ;message to write 
mov ebx, 1  ;file descriptor (stdout) 
mov eax, 4  ;system call number (sys_write) 
int 0x80  ;call kernel 
mov eax, 1  ;system call number (sys_exit) 
int 0x80  ;call kernel 

msg db 'Hello, world!',0xa  ;our dear string 
len equ $ - msg   ;length of our dear string 
+2

Ассемблер может испускать местозаполнитель и заполнять его позже, когда он определяет адрес. Некоторые ассемблеры также используют несколько проходов. '0xa' - это только код ascii для фида строк. – Jester

+0

Спасибо, теперь я понимаю! – Black

+1

Вы можете собрать, затем разобрать объект, затем связать его с чем-то и скрыть, и вы увидите, что делают инструменты. иногда они оставляют заполнитель, который заполняется, иногда они заменяют инструкцию другим/другими. модификации, конечно, связаны по ссылке, связаны в другом месте или другом проекте, компоновщик может выбирать другие решения (в частности, в сравнении с удаленными внешними) –

ответ

0

Ассемблер только производит код машины из кода сборки. Затем запускается машинный код.

Смежные вопросы