Не удается получить доступ к метке через регистры сегментов, ошибка в сборке - PullRequest
3 голосов
/ 03 октября 2009
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 ]

2 голосов
/ 03 октября 2009

Я не уверен, что в Irvine16.inc, но держу пари, он говорит .model small,... в какой-то момент.

Если вы добавите

ASSUME DS:_DATA

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


Хорошо, у меня есть идея. Я думаю, что вы должны перейти к 32-битным примерам. Это плоская модель, в которой регистры сегментов устанавливаются ОС и не используются программами. Я только что скачал примеры irvine и пример проекта, который, как оказалось, 32-битный, собирался и запускался.

В странном и искривленном мире, представляющем собой машинный код x86, 16-разрядная модель немного сложнее, чем 32-разрядная модель, по крайней мере с точки зрения пользовательской программы.

1 голос
/ 21 декабря 2015

Эта ошибка вызвана попыткой собрать программу DOS (.model! = Flat) в файл 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 является частью комплекта библиотек Ирвина («Примеры программ и исходный код библиотеки ссылок ...»).

...