You need to enable JavaScript to run this app. 汇编使用Irvine32打印字符串报A2004、A2022错误如何解决?
优惠活动
大模型
产品
解决方案
定价
更多

汇编使用Irvine32打印字符串报A2004、A2022错误如何解决?

汇编代码报错修复方案

错误原因

  • 你混用了32位Irvine32汇编库和16位DOS系统调用语法:Irvine32是用于开发32位Windows保护模式程序的库,而seg、int 21h、16位寄存器传参都是16位实模式DOS程序的语法,二者不兼容。
  • 第12行mov ax, seg message报错A2004:32位保护模式采用平坦内存模型,不需要手动设置段寄存器,seg操作符在32位场景下和16位寄存器ax类型不匹配。
  • 第14行mov dx, offset message报错A2022:32位模式下字符串偏移是4字节长度,而dx是2字节的16位寄存器,操作数大小不一致。

修复方案

方案1:使用Irvine32库的原生函数打印字符串

这是最适合你当前开发环境的方案,直接调用Irvine32封装好的打印接口即可:

INCLUDE Irvine32.inc

.data
    message db "Hello",0  ; Irvine32要求字符串以0结尾,不是$
.code
main PROC
    mov edx, offset message  ; 32位偏移用32位寄存器edx存储
    call WriteString  ; Irvine32提供的打印字符串函数
    exit  ; 调用Irvine32封装的程序退出接口
main ENDP
END main

方案2:运行16位DOS教程的代码

如果你要按照你参考的16位DOS教程编写代码,就不要引入Irvine32库,改用16位汇编配置,代码如下:

.model small
.stack 100h
.data
    message db "Hello $"  ; DOS下int 21h的9号功能要求$结尾
.code
main PROC
    mov ax, @data  ; 获取数据段基地址
    mov ds, ax
    mov dx, offset message
    mov ah, 9h
    int 21h  ; 调用DOS中断打印字符串
    mov ah, 4ch
    int 21h  ; 调用DOS中断退出程序
main ENDP
END main

注意:16位DOS程序无法直接在现代64位Windows系统运行,需要安装DOSBox等模拟器运行。

内容的提问来源于stack exchange,提问作者Romin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 00:24:04