тут в примере однобайтовая команда по смещению ffff, а если двухбайтовая?
Опять же, я думаю, что в 8086 будет врапаться (прочитает байты по 0), как и с данными (про данные там вполне определённо сказано во втором абзаце), а в 286+ должен быть GPF (проверял, но на современном компе).
А я вот думаю, что будет врапаться только через мегабайтную границу
Ха! Однажды я написал некий софт на своем 386DX40. И применил хак: через 32 разрядную адресацию начал писать в видеопамять прямо из сегмента данных. Но на целевом компьютере был уже 486 процессор, где эту ошибку исправили, и память за мегабайтом заворачивалась а-ля настоящий 8086. Софт не заработал. #былое
.Model Tiny .Code .386 Org 100h Start: xor ax, ax mov es, ax mov ebx, 000B8000h mov al, '*' mov ah, 8Fh mov cx, 80 * 25 @@C: mov es: [ebx], ax inc ebx inc ebx loop @@C mov ah, 00h int 16h ret End Start тестовый код
Её не совсем исправили, а скорее добавили костыль в виде A20
И где тут заворот на мегабайт? Вообще, это даже на 386 не должно работать, если конечно какой-нибудь расширитель не попортил теневые части сегментных регистров огромным лимитом
Тут, как раз, нет заворота. А на целевом 486 компьютере он был.
Я вот тоже не вижу, где тут мегабайт, и почему всплыл разговор про A20.
Так у тебя тут до мегабайта не доходит, или ты имел ввиду 64к? Но в любом случае тот код должен был вызвать gp
64K здесь обходим.
Тебе @disba1ancer правильно объяснил. Скорее всего, в одном из вариантов запуска был нереальный режим от какого-то другого софта. Когда ты сегментные регистры перезагружаешь, лимит не меняется. Поэтому работало.
Тот код даже за границу 64к сегмента не заходит, что-то тут не чисто
А нет, заходит сегмент же 0
Он в видеопамять пишет при es=0.
На 486 должно было быть исключение
Обсуждают сегодня