You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修改说明

  1. 移除INCLUDE Irvine32.inc:避免32位库与16位DOS模式冲突。
  2. 变量名从name改为myName:规避MASM保留字。
  3. 正确初始化cx:先将8位的count赋值给cl,再把ch置0,确保cx是完整的16位计数器(也可以直接写mov cx, 5,如果不需要通过变量控制循环次数)。
  4. 保持所有指令与16位DOS模式兼容:确保DOS中断调用的正确性。

编译运行修正后的代码,就能实现循环打印YourName5次的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:02:12