MASM 5.1a: предупреждение A4057 Недопустимый размер для операнда и ссылки V2.0: Недопустимый объект Модуль - PullRequest
0 голосов
/ 30 октября 2019

Я пытался скомпилировать исходный код для himem.sys, который я нашел в интернете для DOS, но у меня не получилось с одним предупреждением и одной ошибкой ...

...Maked xm286 and xm386 objects without any problem...
H:\OEMSRC>MASM.EXE himem;
Microsoft (R) Macro Assembler Version 5.10A
Copyright (C) Microsoft Corp 1081, 1989. All rights reserved.

xm386.asm(342): warning A4057: Illegal size for operand

  48666 + 416309 Bytes symbol space free

      1 Warning Errors
      0 Severe  Errors

H:\OEMSRC>LINK.EXE HIMEM.OBJ XM286.OBJ XM386.OBJ;

Microsoft 8086 Object Linker
Version 3.00 (C) Copyright Microsoft Corp 1983, 1984, 1985

Invalid object module
Input File: HIMEM.OBJ(himem.ASM) pos: C98 Record type: A1 
H:\OEMSRC>

Кто-нибудь знает, какисправить их? Исходный код и инструменты для компиляции: Исходный код и инструменты

Заранее спасибо.

1 Ответ

2 голосов
/ 02 ноября 2019

В этом случае 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
...