【问题标题】:Why do I get "symbol not defined" error for 32-bit register names?为什么我会收到 32 位寄存器名称的“未定义符号”错误?
【发布时间】:2015-12-03 04:04:38
【问题描述】:

当我尝试使用 masm32 组装它时,我在使用 32 位寄存器名称的每一行(以 MOV EAX, 05h 开头)(第 3、5、8、9、10 行)收到“符号未定义”错误, 11, 12)。为什么是这样?我用来组装它的命令是ml.exe /Zm /Bl link.exe filepath\filename

如果我删除/Zmswitch,我仍然会在同一行收到错误,只是在这种情况下,它是"Instruction or register not accepted in current CPU-mode"

完整完整的代码:

code SEGMENT
MOV AX, 05h ;MOV B8+
MOV EAX, 05h
MOV BX, 06h
MOV EBX, 06h
MOV CX, 07h
MOV DX, 08h
MOV CR0, EAX ; 0F 22 /r
MOV CR0, EBX
MOV CR0, ECX
MOV CR0, EDX
MOV CR0, ESP
code ENDS
END

注意:代码的目的是查看不同指令被翻译成什么操作码。

【问题讨论】:

  • 也许你告诉它是 8086 指令。如果在代码顶部使用 .686 指令会发生什么?
  • 如果你展示了你的整个汇编文件,它可能会给我们更多的帮助。
  • 还有一点很难说是你是否应该使用/Zm 选项,它可以让你与旧版本的 MASM 兼容。你使用/Zm是有原因的吗?
  • 我拿了你的代码,使用了 MASM32,用 /Zm 编译它并且在所有 32 位寄存器上都出错了。当我将.686 添加到文件顶部时,这些错误消失了。

标签: assembly masm32


【解决方案1】:

您实际上并未向我们展示您的所有代码。我强烈怀疑您在开始时发送了一个指令,告诉它您要生成 16 位代码。显然,32 位寄存器在 16 位模式下不可用,因此 MASM 抱怨。

尝试在汇编代码的顶部插入.386.486.586.686。您可以找到更多信息here in the documentation.

【讨论】:

    【解决方案2】:

    在代码顶部使用 .386 给你举个简单的例子

    .386
    .model flate,c
    .stack 100h
    .data 
    .code
    
    main proc
    
    mov eax,2
    
    mov ebx,3
    
    mul ebx
    add eax,30h
    mov ah,2
    
    mov dl,eax
    int 21h
    
    mov ah,4ch
    int 21h
    
    
    main endp
    end main
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多