Не удается получить доступ к метке через регистры сегментов, ошибка в сборке
INCLUDE Irvine16.inc
.data
byteArray BYTE 6 DUP(?)
listSize = ($ - byteArray)
aSum WORD 0
soffset = 0
.code
main PROC
mov ax, @data
mov ds, ax
mov cx, listSize
Loop1:
mov ax, 0
movzx ax, [byteArray + soffset]
add aSum, ax
soffset = soffset + 1
loop Loop1
exit
main ENDP
END main
Я получаю сообщение об ошибке "A2074: невозможно получить доступ к метке через регистры сегментов"
Я пытаюсь использовать soffset, чтобы перебрать byteArray.
2 ответа
Я не уверен, что в Irvine16.inc, но держу пари, что это говорит .model small,...
в какой-то момент.
Если вы добавите
ASSUME DS:_DATA
тогда ваши сообщения об ошибках исчезнут, хотя я сомневаюсь, что этого достаточно для запуска программы.
Хорошо, у меня есть идея. Я думаю, что вы должны перейти к 32-битным примерам. Это плоская модель, в которой регистры сегментов устанавливаются ОС и не используются программами. Я только что скачал примеры irvine и пример проекта, который, как оказалось, 32-битный, собирался и запускался.
В странном и запутанном мире, представляющем собой машинный код x86, 16-разрядная модель немного сложнее, чем 32-разрядная модель, по крайней мере с точки зрения пользовательской программы.
Эта ошибка вызвана попыткой собрать программу DOS (.model
! = плоский) к COFF
файл.obj. Дополнительно бросает ML.EXE error A2006:undefined symbol : DGROUP
, Источник должен быть собран по старинке OMF
файл. Создайте файл с помощью следующих командных строк:
ml.exe /omf hello.asm
link16.exe hello.obj, hello.exe;
ml.exe
является частью установки Visual Studio. link16.exe
является частью набора библиотек Irvine ("Примеры программ и исходный код библиотеки ссылок...").