http://life-prog.ru/2_17076_odno--i-mno … mbler.html

1) выделение имён в тексте программы (в качестве меток и в составе операндов команд)
2) вычисление адресов имён
3) генерирование кода

Вычисление адресов имён раскрыто не вполне, так как помимо ссылок одних EQU на другие имена существует ещё задача определения применимости команд длинных и коротких переходов, которые занимают разное количество байтов в памяти и таким образом влияют на адреса последующих меток (чем длиннее команда перехода, тем дальше располагается метка).

https://stackoverflow.com/questions/293 … t-jump-x86
three types of JMP instructions; short, near and far (long).

https://stackoverflow.com/questions/148 … jmp-in-x86
    Intel® 64 and IA-32 Architectures Software Developer’s Manual: Vol. 2A 3-423
    A near jump where the jump range is limited to –128 to +127 from the current EIP value.
    смещение в операнде инструкции = destination - source + sizeof(opcode)
    the fact that once the cpu has performed the instruction fetch stage, the instruction pointer will then
    point to the instruction that comes after the branch.

https://stackoverflow.com/questions/294 … n-assembly
If you don't specify the jump 'distance', it is up to the assembler whether you get a short, long or far jump. Most modern assemblers will use a short jump if possible, or a long or far jump otherwise - the latter only if required.

short jump is encoded as jmp rel8 (EB XX) where the relative distance (dest-source) is less than 0x80
   (a one byte operand, which is sign extended and added to EIP)
The other one is called long jump, which is encoded as jmp rel32 (E9 XXXXXXXX).
Note that this can be encoded with the 66H prefix, which changes the operand to rel16.

https://stackoverflow.com/questions/315 … r-relative

Что-то нигде не описывается, как именно ассемблер выбирает какую инструкцию перехода использовать - подлиннее или покороче.
Можно предположить, что он сначала использует самые длинные, а если расстояния хватает, то заменяет их на короткие и дополняет nop-ами.
Код при этом получается не самым оптимальным по размеру.

http://users.cis.fiu.edu/~downeyt/cop3402/two-pass.htm
такое описание недостаточно, потому что не описан случай, когда между командой перехода и меткой цели находятся другие команды перехода неизвестной длины.

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

http://baxincc.cc/questions/418474/how- … -assembler

Отредактировано Лис (2017-06-09 06:56:37)