MASM汇编循环打印姓名程序报错求助:含A4011等错误及MSB3721
问题分析与修复方案
你的代码存在几个关键语法和环境冲突问题,导致编译报错,以下是逐个问题的解决:
错误原因拆解
- 环境冲突:
INCLUDE Irvine32.inc是32位Windows汇编的库,而你使用的是.model small(16位DOS模式),两者完全不兼容,必须移除该引用。 - 保留字误用:
name是MASM的保留字,不能用作自定义变量名,会导致语法错误。 - 计数器赋值语法错误:
mov cx,5 count是无效指令,MASM无法解析这种写法;另外count定义为db(8位字节),而cx是16位寄存器,直接赋值会有类型冲突。 - DOS中断与模式匹配:你使用的是DOS 21h中断,属于16位程序范畴,必须保持整个程序的16位模式一致性。
修正后的代码
.model small .stack 100h .data myName db 'YourName', 0Dh, 0Ah, '$' ; 替换保留字name为myName count db 5 .code main proc mov ax, @data mov ds, ax ; 正确初始化循环计数器cx:将8位的count扩展为16位 mov cl, count mov ch, 0 ; cx = ch(0) + cl(count) = 5 print_name: mov ah, 9 ; DOS功能号:打印以$结尾的字符串 lea dx, myName int 21h ; 调用DOS中断 loop print_name ; 循环直到cx减为0 mov ah, 4Ch ; DOS功能号:程序退出 int 21h ; 调用DOS中断 main endp end main
关键修改说明
- 移除
INCLUDE Irvine32.inc:避免32位库与16位DOS模式冲突。 - 变量名从
name改为myName:规避MASM保留字。 - 正确初始化
cx:先将8位的count赋值给cl,再把ch置0,确保cx是完整的16位计数器(也可以直接写mov cx, 5,如果不需要通过变量控制循环次数)。 - 保持所有指令与16位DOS模式兼容:确保DOS中断调用的正确性。
编译运行修正后的代码,就能实现循环打印YourName5次的需求。
内容的提问来源于stack exchange,提问作者Lily DuBois
相关产品推荐
相关产品推荐

