В этом случае ldgt загружает 6-байтовый ptr (fword). Чтобы избавиться от предупреждения MASM:
GDTPtr equ ($+MEM3_Offset) ; no need to declare ptr type here
GDT386 <GDTLen,0,0>
; ...
lgdt fword ptr cs:[GDTPtr] ; use fword ptr
Инициализированные данные не разрешены для сегментов с фиксированным адресом, так что используйте? вместо 0. MASM 5.10a будет игнорировать 0, но не MASM 6.11.
BiosSeg SEGMENT USE16 AT 40h ; Used to ...
org 00A2h
RealLoc1 dd ? ; change from 0 to ?
BiosSeg ends
Ошибка канала 3.0 вызвана 32-битными смещениями для двух ссылок (см. ниже) на Int13Vector, которые обусловлены«use32» с нулевым сегментом:
Zero segment use32 at 0
org 13*4
Int13Vector label dword
Zero ends
Изменение «use32» на «use16» устраняет ошибку ссылки 3.0 и приводит к более коротким инструкциям:
Zero segment use16 at 0
org 13*4
Int13Vector label dword
Zero ends
; ... use16 use32
xchg eax, [Int13Vector] ; 6 bytes versus 9 bytes
; ...
mov [Int13Vector], eax ; 5 bytes versus 8 bytes
Ссылка 5.6 не делаетУ него нет проблем с 32-битными смещениями, но himem.sys будет на 6 байт длиннее, а переключение на «use16» позволит вам использовать вашу текущую версию ссылки 3.0.
Параметр «help» для ссылки3.0 - это «ссылка / помощь», а не «ссылка /?», Но она мало что показывает.
Использование MASM 6.11 и Link 5.6, (/ AT = tiny, / Zm = MASM 5.0синтаксис):
ml /AT /Zm himem.asm
ren himem.com himem.sys
MASM 6.11 оптимизировал условный переход к короткой позиции 114 в xm386.asm. Изменение кода для использования коротких результатов в одном и том же файле размера с использованием MASM 5.10 / Link 3.0 или MASM 6.11 / Link 5.6, но есть некоторые незначительные различия, такие как порядок префиксов размера сегмента и операнда (ES: и DB 066H (для 32битовый операнд) меняем местами).
jz short MEM3_Exit ; Exit immediately if zero