Фатальная ошибка сборки LNK1190: найдено недопустимое исправление, тип 0x0001
Я хочу написать 16-битный код сборки 8086 в Visual Studio 2010, но выдает ошибку: code:
.MODEL small
.STACK 100h
.data
message BYTE "Hello, world!","$"
.code
mov ah,9
mov dx,OFFSET message ; addr of buffer
int 21h
END
вывод дает мне эту ошибку:
fm.obj : fatal error LNK1190: invalid fixup found, type 0x0001
Я использовал masm32v11. Что я должен делать?
2 ответа
Откуда ассемблер знает, где находится начальный адрес? С помощью Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
(16-битный компоновщик) и добавил start
а также end start
Код собирает и ссылки просто отлично. MASM32 включает 16-битный компоновщик в каталоге bin. Вы должны передать различные параметры командной строки в ML, чтобы правильно собрать 16-битный код.
.MODEL small
.STACK 100h
.data
message BYTE "Hello, world!","$"
.code
start:
mov ah,9
mov dx,OFFSET message ; addr of buffer
int 21h
END start
Итак, подведем итог - вашему коду нужен начальный адрес и конец. Вы можете использовать текущий ML, который поставляется с MASM32, для сборки 16-битного и 32-битного кода. Чтобы связать 16-битный код, вы должны использовать 16-битный компоновщик, чтобы связать 32-битный код, вы должны использовать 32-битный компоновщик.
Из одного из моих 16-битных приложений для DOS:
ML.EXE /DMASM /DDOS /Zm /c /nologo /I"f:\masm32\Include" "dosdisplay.asm"
link16.exe /NOLOGO "dosdisplay.obj"
Скомпилируйте с этими командами:
ml.exe / omf filename.asm
link16.exe filename.obj
Информация:
когда вы вызываете ml.exe без каких-либо конкретных параметров, тип генерируемого им объектного файла будет в формате coff. Для искажения имени в формате coff требуется, чтобы в вашем коде были символы "_start" и "end _start". То, что вы написали, будет работать с объектными файлами omf от intel.