Фатальная ошибка сборки 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.

Другие вопросы по тегам