无法通过段寄存器访问标签,汇编时出错

时间:2009-10-03 03:48:37

标签: assembly masm irvine16

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 个答案:

答案 0 :(得分:2)

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

如果你添加

ASSUME DS:_DATA

然后你的错误消息就会消失,虽然我怀疑这是否足以使程序运行。


好的,我有个主意。我认为你应该切换到32位的例子。这是一个扁平模型,其中段寄存器由OS设置,不由程序使用。我刚下载了irvine示例和示例项目,它恰好是32位的汇编并运行。

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

答案 1 :(得分:1)

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