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
Ассемблер может испускать местозаполнитель и заполнять его позже, когда он определяет адрес. Некоторые ассемблеры также используют несколько проходов. '0xa' - это только код ascii для фида строк. – Jester
Спасибо, теперь я понимаю! – Black
Вы можете собрать, затем разобрать объект, затем связать его с чем-то и скрыть, и вы увидите, что делают инструменты. иногда они оставляют заполнитель, который заполняется, иногда они заменяют инструкцию другим/другими. модификации, конечно, связаны по ссылке, связаны в другом месте или другом проекте, компоновщик может выбирать другие решения (в частности, в сравнении с удаленными внешними) –