8086 MS-DOS汇编下使用TASM5打印字符串数组问题求助
问题根因
你的代码存在两处核心语法与逻辑错误,直接导致仅第一个字符串可以正常打印:
- MASM/TASM默认规则下,
mov bx, dir_array会被解析为读取dir_array标号指向的内存单元存储的值,而非取dir_array本身的偏移地址。由于dir_array第一个元素恰好是dos_dir的偏移,所以bx最终存储的是第一个字符串的地址,和你调试观察到的现象完全一致。 - 循环内的
lea dx, [bx]逻辑错误:dir_array数组的每个元素存储的是对应打印字符串的偏移地址,你需要将bx指向的内存单元的内容赋值给dx,而非把bx本身的值作为字符串地址传入DOS中断。
兼容8086指令集的最优修复方案
仅需要修改两行核心代码即可,无需调整其他逻辑,修改后代码简洁且运行效率最高,无冗余指令:
main proc near ; 第一处修改:加offset明确取dir_array数组的首偏移地址 mov bx, offset dir_array mov ah,9 dirloop: ; 第二处修改:用mov而非lea,取出数组元素中存储的字符串偏移地址 mov dx, [bx] int 21h add bx,2 cmp bx, offset dir_array + dir_array_size jl dirloop mov ax,4C00h int 21h main endp
补充说明
你代码中其余部分的字符串定义、数组大小计算逻辑均符合要求,修改后即可依次打印数组中所有5个路径字符串,完全兼容8086指令集与MS-DOS平台的.COM程序格式。
内容的提问来源于stack exchange,提问作者Malcolm McCaffery
相关产品推荐
相关产品推荐

