assembly - 当我试图在给定的汇编代码下编译时,它给出了错误未定义的符号:AXSAVE
问题描述
这是msdos源代码的汇编代码,当我尝试编译代码时,它显示错误“MSDOS.ASM(329):错误A2006:未定义符号:AXSAVE”。请指导。请指导我哪里错了。我无法理解为什么它将变量 AXSAVE 声明为未定义符号,即使我已在结构“STKPTRS”下声明它。
CODE SEGMENT
CODE ENDS
CONSTANTS SEGMENT BYTE
CONSTANTS ENDS
DATA SEGMENT WORD
DATA ENDS
DOSGROUP GROUP CODE,CONSTANTS,DATA
SEGBIOS SEGMENT
SEGBIOS ENDS
; BOIS entry point definitions
IF IBM
BIOSSEG EQU 60H
ENDIF
IF NOT IBM
BIOSSEG EQU 40H
ENDIF
; Location of user registers relative user stack pointer
STKPTRS STRUC
AXSAVE DW ? <--MSDOS.ASM(329):error A2006:undefined symbol: AXSAVE
BXSAVE DW ?
CXSAVE DW ?
DXSAVE DW ?
SISAVE DW ?
DISAVE DW ?
BPSAVE DW ?
DSSAVE DW ?
ESSAVE DW ?
IPSAVE DW ?
CSSAVE DW ?
FSAVE DW ?
STKPTRS ENDS
LEAVE:
CLI
MOV SP,CS:[SPSAVE]
MOV SS,CS:[SSSAVE]
MOV BP,SP
MOV BYTE PTR [BP.AXSAVE],AL
IF DSKTEST
MOV AX,CS:[NSP]
MOV CS:[SPSAVE],AX
MOV AX,CS:[NSS]
MOV CS:[SSSAVE],AX
ENDIF
POP AX
POP BX
POP CX
POP DX
POP SI
POP DI
POP BP
POP DS
POP ES
IRET
DATA SEGMENT WORD
; Init code overlaps with data area below
ORG 0
SPSAVE DW ?
SSSAVE DW ?
IF DSKTEST
NSS DW ?
NSP DW ?
ENDIF
DATA ENDS
END
解决方案
多个问题。
对于初学者,您的代码不在代码段内。这可能会或可能不会混淆汇编程序。另外,FSAVE
是一个错字,你可能想要FSSAVE
. 这很重要,因为FSAVE
恰好是一条指令,至少 jwasm 不喜欢它作为结构字段。也是LEAVE
一个指令,您可能还必须更改该标签。使用 struct 需要强制转换或 anASSUME
并且您还使用了错误的大小。这个版本用 jwasm 组装,我没有 masm 来测试:
IBM=0
DSKTEST=1
CONSTANTS SEGMENT BYTE
CONSTANTS ENDS
DATA SEGMENT WORD
DATA ENDS
DOSGROUP GROUP CODE,CONSTANTS,DATA
SEGBIOS SEGMENT
SEGBIOS ENDS
; BOIS entry point definitions
IF IBM
BIOSSEG EQU 60H
ENDIF
IF NOT IBM
BIOSSEG EQU 40H
ENDIF
; Location of user registers relative user stack pointer
STKPTRS STRUC
AXSAVE DW ?
BXSAVE DW ?
CXSAVE DW ?
DXSAVE DW ?
SISAVE DW ?
DISAVE DW ?
BPSAVE DW ?
DSSAVE DW ?
ESSAVE DW ?
IPSAVE DW ?
CSSAVE DW ?
FSSAVE DW ?
STKPTRS ENDS
CODE SEGMENT
_LEAVE:
CLI
MOV SP,CS:[SPSAVE]
MOV SS,CS:[SSSAVE]
MOV BP,SP
MOV (STKPTRS PTR [BP]).AXSAVE,AX
IF DSKTEST
MOV AX,CS:[NSP]
MOV CS:[SPSAVE],AX
MOV AX,CS:[NSS]
MOV CS:[SSSAVE],AX
ENDIF
POP AX
POP BX
POP CX
POP DX
POP SI
POP DI
POP BP
POP DS
POP ES
IRET
CODE ENDS
DATA SEGMENT WORD
; Init code overlaps with data area below
ORG 0
SPSAVE DW ?
SSSAVE DW ?
IF DSKTEST
NSS DW ?
NSP DW ?
ENDIF
DATA ENDS
END
推荐阅读
- stored-procedures - Postgres 11存储过程不返回结果
- drop-down-menu - 下拉菜单 razor 页面中的 asp-page 标记
- spring - 'jpaAuditingHandler' 在使用 Spring Boot 启动应用程序时以 null 定义
- r - 按 id 将行聚合成多列,其中每个 id 的行数不同(R)
- amazon-web-services - 将带有过滤器的 AWS CLI 命令输出到不带 jq 的 CSV
- apache-spark - 如何使用张量流或火花分割高度不平衡的数据?
- keras - 使用 Keras(推理时间)有选择地禁用输入单元
- python - Python多处理 - 无法退出已完成的进程?
- xcode - 在 Xcode 中,为什么 LLDB 在我运行命令时只响应“(lldb)”而没有其他输出?
- php - 参数 3 传递给 Sonata\Twig\Extension\TemplateExtension::__construct()