【问题标题】:Cannot access label through segment registers, error in assembly无法通过段寄存器访问标签,汇编错误
【发布时间】:2009-10-03 03:48:37
【问题描述】:
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。

【问题讨论】:

  • 如果您包含收到的错误和您尝试执行的操作的描述,这可能会有所帮助。
  • soffset = soffset + 1 是汇编语句吗?如果是这样,它有什么作用?
  • 是的,它是一个汇编语句,虽然在这个程序中它没有做任何事情,因为它从未被使用过。汇编器在非常基本的级别处理符号,我认为 masm 可以定义它们,做算术,用符号测试条件汇编,通常的东西..
  • 它看起来确实是被添加的,期望它是某种运行时操作,但是,我同意......
  • 我也有这个错误,答案没有帮助:(

标签: assembly masm irvine16


【解决方案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 的一部分(“示例程序和链接库源代码...”)。

【讨论】:

    【解决方案2】:

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

    如果你添加

    ASSUME DS:_DATA
    

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


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

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

    【讨论】:

    • 我必须同意 Crashworks 和 JS,关于 soffset。碰巧的是,这在大多数汇编程序中是一个有效的声明,但它不会做我认为你认为它会做的事情。
    • 这是一个专门要求我使用 16 位示例的程序集类的作业。
    • 啊,好的。好吧,第一步必须是:让一个未经修改的示例正常工作。
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    相关资源
    最近更新 更多