如何编写16位EXE汇编程序实现逐行递增输出字符串字符?
16位TINY模型EXE程序修正方案
你的代码存在几个关键问题,导致无法实现“逐行递增输出字符”的需求,下面直接说明问题并给出修正后的代码:
原代码的核心问题
- 循环逻辑完全反向:你从5个字符开始递减输出,结果是先出5个、再出4个…和要求的“第一行1个、第二行2个”完全相反。
int 21h ah=9的用法错误:这个DOS中断是输出到第一个$为止,原字符串末尾的$会让你每次输出从指定位置到结尾的所有字符,没法只输出前n个字符。
修正后的代码(逐个字符输出法)
这种方法用单个字符输出中断,逻辑直观,适合新手理解:
.MODEL TINY .STACK 100h code: mov cx, 0 ; cx记录当前行要输出的字符数,从1开始递增 next_line: inc cx ; 每行多输出一个字符 mov si, 0 ; si指向字符串起始位置 mov bx, cx ; bx保存当前行的字符数,作为内层循环计数器 print_char: mov dl, mess1[si] ; 取出当前要输出的字符 mov ah, 2 ; DOS中断:输出单个字符 int 21h inc si dec bx jnz print_char ; 内层循环:输出完当前行的所有字符 ; 输出回车换行 mov dl, 13 ; 回车符 mov ah, 2 int 21h mov dl, 10 ; 换行符 mov ah, 2 int 21h cmp cx, 5 ; 判断是否输出到最后一行(字符串长度为5) jl next_line ; 没到就继续下一行 ; 正常退出程序 mov ah, 4Ch mov al, 0 int 21h ; 数据定义 mess1 db "Artem" ; 这里不需要加$,因为逐个输出字符 end code
另一种方案(动态缓冲区法)
如果想沿用你原来用int 21h ah=9输出字符串的思路,可以通过临时缓冲区复制前n个字符并添加$来实现:
.MODEL TINY .STACK 100h code: mov cx, 0 ; 当前行要输出的字符数 lea di, temp_buf ; di指向临时缓冲区起始 next_line: inc cx mov si, 0 ; si指向原字符串起始 mov bx, cx ; bx保存要复制的字符数 copy_loop: mov al, mess1[si] mov [di], al inc si inc di dec bx jnz copy_loop mov byte ptr [di], '$' ; 在缓冲区末尾添加结束符$ ; 输出当前行内容 lea dx, temp_buf mov ah, 9 int 21h ; 输出回车换行 lea dx, crlf mov ah, 9 int 21h lea di, temp_buf ; 重置缓冲区指针 cmp cx, 5 jl next_line ; 正常退出程序 mov ah, 4Ch mov al, 0 int 21h ; 数据定义 mess1 db "Artem" crlf db 13, 10, "$" temp_buf db 10 dup(?) ; 临时缓冲区,足够容纳字符串和结束符 end code
补充说明
- 两种方案都是从1个字符开始,逐行递增到5个字符,完全符合需求。
- 第一个方案逻辑更简单,不需要处理字符串结束符,适合新手学习。
- 退出程序时
al设为0表示正常退出,原代码设为1是错误退出码,无特殊需求没必要设置。
内容的提问来源于stack exchange,提问作者Артем Лебідь
相关产品推荐
相关产品推荐

