4
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。

4

2 回答 2

3

此错误是由于尝试将 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.exeIrvine 库套件的一部分(“示例程序和链接库源代码...”)。

于 2015-12-21T19:47:21.383 回答
2

我不确定 Irvine16.inc 中有什么,但我敢打赌它.model small,...在某些时候会说。

如果你添加

ASSUME DS:_DATA

那么您的错误消息将消失,尽管我怀疑这是否足以使程序运行。


好的,我有个主意。我认为您应该切换到 32 位示例。这是一个平面模型,其中段寄存器由操作系统设置,而不是由程序使用。我刚刚下载了 irvine 示例和示例项目,它恰好是 32 位的,它确实组装并运行了。

在 x86 机器代码这个奇怪而扭曲的世界中,16 位模型比 32 位模型复杂得多,至少从用户程序的角度来看是这样。

于 2009-10-03T04:47:56.853 回答