Не удается получить доступ к метке через регистры сегментов, ошибка в сборке

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 ("Примеры программ и исходный код библиотеки ссылок...").

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