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

TASM汇编:如何修复循环打印字符串数组的输出错误?

问题:循环打印字符串数组时无法正确定位下一个单词

我定义了字符串数组:

fruitNames db "Apple$", "Mango$", "Orange$", "Kiwi$", "Watermelon$"

希望通过循环打印每个水果名称,编写的TASM代码如下:

MOV CX, 5 ; NUMBER OF FRUITS TO PRINT

MOV SI, 0 ; POINT TO THE FIRST ELEMENT IN THE ARRAY

ArrayString: 

LEA DX, fruitNames[SI]

MOV AH, 09H

INT 21H


CALL newLine
   
INC SI ; next index
   
LOOP ArrayString

但输出结果为:

Apple

pple

ple

le

e

我知道问题在于每次迭代时程序访问的是单个字符而非下一个单词,请问该如何修复这段代码?


修复方案

你的数组在内存中是连续存储的,实际布局为"Apple$Mango$Orange$Kiwi$Watermelon$"。原代码中INC SI每次仅移动1个字节,导致下一次打印时从当前字符串的第二个字符开始,而非下一个字符串的起始位置。

要解决这个问题,需要在打印完当前字符串后,遍历找到字符串结束符$,再将SI定位到$的下一个字节(即下一个字符串的开头)。修改后的代码如下:

MOV CX, 5 ; NUMBER OF FRUITS TO PRINT

MOV SI, 0 ; POINT TO THE FIRST ELEMENT IN THE ARRAY

ArrayString: 
LEA DX, fruitNames[SI]
MOV AH, 09H
INT 21H

CALL newLine

; 定位到下一个字符串的起始位置
FindNextString:
MOV AL, fruitNames[SI]
CMP AL, '$'       ; 检查当前字符是否为结束符
JE MoveToNext     ; 找到$则跳转到移动逻辑
INC SI            ; 没找到就继续向后遍历
JMP FindNextString

MoveToNext:
INC SI            ; 跳过$,指向下一个字符串的第一个字符
   
LOOP ArrayString

这段代码的核心逻辑是:

  • 打印完当前字符串后,启动子循环逐个检查SI指向的字符
  • 当找到结束符$时,跳出子循环并将SI加1,使其指向后续的下一个字符串开头
  • 回到主循环,打印下一个完整的水果名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:25:03