2015-12-04 2 views
0

Если обобщать, ссылку и запустить что-то вроде этого:Как работают JMP и CALL в ассемблере?

global _start 

section .text 

_start: 
jmp message 

proc: 
... 

message: 
    call proc 
    msg db " y0u sp34k 1337 ? " 

section .data 
  1. Как машина знает, где ему нужно прыгать? Я думаю, что «сообщение:» и «proc:» переведены на адреса.
  2. У "message:" и "proc:" есть абсолютные или относительные адреса?
  3. Если я скомпилировал программу на своем ПК и выполнил ее на другом ПК, как она может работать на другой машине? Я имею в виду адреса для «message:» и «proc:». Будет ли всегда другой адрес?
+1

В архитектуре Intel _jmp_ обычно микрокодируется как движение с двумя педалями, а _call_ - через вокальный субпроцессор. –

ответ

4
  1. Да, они будут переведены на адреса. Существуют различные инструкции jmp относительно относительных или абсолютных прыжков или далеких или близких прыжков. Ассемблер выберет один из них (например, самый короткий) и переводит мнемонику (jmp) в соответствующий машинный код.

  2. У них есть относительные адреса. Ассемблер создает объектный файл, который содержит перемещаемый код и данные. Он может быть объединен с другими объектными файлами компоновщиком, чтобы в итоге получить исполняемый файл. Исполняемый файл в конце имеет абсолютные адреса .

  3. № У каждого процесса есть свое виртуальное адресное пространство, поэтому самый первый адрес каждого процесса - 0x00. Адреса, используемые в исполняемом файле, также являются виртуальными, поэтому они сопоставляются с произвольными физическими адресами.
    Кроме того, это, очевидно, необходимо, чтобы ПК имеют

    • та же архитектура (PC обычно означает x86)
    • операционную систему, используя тот же формат исполняемого/объектный формат файла

Технически, это неправда. Изображение может быть relocated at load time.