基于MASM实现DOS下Int 21h/4Bh调用第三方程序的问题求助
MASM中使用Int 21h/4Bh调用程序的编译错误解决及可用代码
问题背景
现有一段可正常运行的FASM代码,用于调用带参数的程序,但转换为MASM后无法编译,报错如下:
error A2084: constant value too largeerror A2009: syntax error in expression
需求是获取一段可编译运行的简洁MASM代码,实现调用带参数的STARTAPP.COM/EXE(格式:STARTAPP Parameter1 Parameter2...)。
错误原因分析
- A2084错误:MASM不支持对十六进制立即数直接使用
shr操作符进行表达式计算。原FASM代码中的10010h shr 4需预先计算结果,10010h >> 4 = 1001h,直接使用计算后的值即可。 - 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
相关产品推荐
相关产品推荐

