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

基于MASM实现DOS下Int 21h/4Bh调用第三方程序的问题求助

MASM中使用Int 21h/4Bh调用程序的编译错误解决及可用代码

问题背景

现有一段可正常运行的FASM代码,用于调用带参数的程序,但转换为MASM后无法编译,报错如下:

  • error A2084: constant value too large
  • error A2009: syntax error in expression
    需求是获取一段可编译运行的简洁MASM代码,实现调用带参数的STARTAPP.COM/EXE(格式:STARTAPP Parameter1 Parameter2...)。

错误原因分析

  1. A2084错误:MASM不支持对十六进制立即数直接使用shr操作符进行表达式计算。原FASM代码中的10010h shr 4需预先计算结果,10010h >> 4 = 1001h,直接使用计算后的值即可。
  2. A2009错误:访问[cmdline]时未明确数据类型,MASM无法判断是字还是双字访问。需用word ptr指定访问类型,明确操作的是双字中的低字(偏移)和高字(段地址)。

修正后的MASM代码

; MASM代码:调用带参数的程序
code    segment
        assume cs:code, ds:code
        org     100h
start:
        ; 释放未使用的常规内存,为被调用程序预留空间
        mov     ah, 4Ah                 ; 功能号:调整内存块大小
        mov     bx, 1001h               ; 仅保留.COM程序所需内存(原10010h shr4的计算结果)
        int     21h

        ; 设置参数块中的命令行指针
        mov     word ptr [cmdline], offset command  ; 命令行偏移地址
        mov     word ptr [cmdline+2], ds            ; 命令行段地址

        ; 加载并执行目标程序
        mov     ax, 4B00h               ; 功能号:加载并执行程序
        mov     dx, offset program      ; 目标程序的ASCIIZ路径
        mov     bx, params              ; 参数块起始地址
        int     21h

        int     20h                     ; 退出程序

; 目标程序路径(可替换为STARTAPP.COM/EXE)
program db 'c:\command.com', 0
; 带参数的命令行结构:第一个字节是参数长度(不含自身和末尾CR),末尾必须是CR(0Dh)
command db 5                           ; 示例:参数长度(对应后面" p1 p2"的5个字符)
        db ' p1 p2', 0Dh               ; 实际参数内容,末尾加回车符

params:
environment   dw 0       ; 环境段,0表示继承父进程环境
cmdline       dd ?       ; 命令行指针(偏移:段地址)
default_fcb1  dd 0       ; 默认文件控制块1指针
default_fcb2  dd 0       ; 默认文件控制块2指针

code    ends
end     start

代码说明

  • 内存调整:通过Int 21h/4Ah释放当前程序未使用的内存,确保被调用程序有足够运行空间。
  • 参数块:严格遵循DOS 4B00h功能调用的参数块结构,包含环境段、命令行指针、FCB指针。
  • 命令行格式:第一个字节为参数的字节长度(不包括自身和末尾的CR),后续为参数内容,必须以0Dh(回车符)结尾。若需修改参数,直接调整command中的内容和长度值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:16:09