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.
相关产品推荐
相关产品推荐

