Цитата(esaulenka @ May 16 2017, 18:30)

Вариант "в один регистр записывается номер data page, а в другой - 14-битное смещение внутри этой page" я в уме считаю с трудом.
...
Все статьи - про x86, 16-битный режим там лет 20 не в чести :-)
Если там страницы даже не перекрываются - что там сложного?
Как бы Вы жили на этом самом x86, где страницы перекрывались внахлёст и одна и та же переменная находилась сразу во многих страницах по разному смещению
И ничего - программировали в своё время без проблем и на асме в том числе.
Адресация шла через сегментные регистры. Для каждой команды были сегментные регистры по умолчанию (тогда они явно не указывались в коде команды) или можно было переопределить сегментный регистр (задавался соответствующим префиксом перед командой). Например: MOV AX, ES:[DI] - заменить сегментный регистр DS (default) на ES.
Или с прямой адресацией: MOV AX, CS:var1
Также перед кодом можно было определить какой сегментный регистр на какой сегмент указывает. Вот так:
ASSUME CS:text,DS:data,ES:NOTHING,SS:stackЭто говорит для последующего кода (до след. ASSUME), куда указывают каждый из приведённых сегментных регистров.
Тогда, если после этого скажем встретится команда: MOV AX, var2, а переменная var2 расположена в сегменте data, то будет сформирован код MOV AX, var2 без префикса переопределения сегментного регистра,
а если она находится в stack - то будет сформирован код: MOV AX, SS:var2 (с префиксом SS).
Можно было и везде явно указывать сегментный регистр для каждого имени.
PS: Эххх - давненько это было! Почти 20 лет назад уж...