汇编使用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
相关产品推荐
相关产品推荐

