汇编语言打印星号三角形出错求助:输出不符合预期
解决你的8086汇编星号三角形输出问题
我看了你的代码,能理解你想实现每行星号递增的三角形,但代码里有几个关键逻辑和定义错误,导致输出不符合预期,下面一步步给你拆解和修正:
原代码的核心问题
- 变量定义错误:你想用
space打印空格,但space db 10,"$"里的10是换行符(LF)的ASCII码,空格的ASCII码是32(或者直接写" "),这导致你原本的缩进逻辑变成了打印换行,直接打乱了输出结构。 - 循环逻辑混乱:
l1和l2的循环条件没有对应“每行星号数量递增”的需求,bl和al的计数逻辑和循环退出条件绑定错误,导致星号打印次数不符合预期。 - 初始化顺序不合理:你先给
cl赋值,再初始化数据段ds,虽然8086不会直接报错,但标准做法是先加载数据段,确保访问数据段变量时不会出现异常。 - 换行时机错误:你在每行星号打印前就执行换行,导致输出顺序颠倒,无法形成每行递增的三角形。
修正后的代码(左对齐星号三角形)
下面是实现你想要的* ** *** ****(每行递增)的代码,我加了详细注释:
.model small .stack 100h .data newline db 10, 13, "$" ; 换行+回车,确保光标移到下一行开头 asterisk db "*$" ; 单个星号+结束符 space db " $" ; 单个空格+结束符(如果需要缩进可以保留,左对齐可忽略) .code start: mov ax, @data mov ds, ax ; 先初始化数据段,这是8086汇编的标准操作 mov cx, 1 ; cx记录当前行要打印的星号数量,从1开始递增 mov dx, 4 ; dx记录总行数,对应你要的4行输出 print_line: ; 内层循环:打印当前行的cx个星号 mov bx, cx ; 用bx做星号计数器 print_asterisks: lea dx, asterisk mov ah, 09h ; DOS中断09h:打印字符串到$ int 21h dec bx jnz print_asterisks ; 计数器没到0就继续打印星号 ; 星号打印完成后换行 lea dx, newline int 21h ; 更新下一行的参数:星号数+1,剩余行数-1 inc cx dec dx jnz print_line ; 还有剩余行就继续循环 exit: mov ah, 4ch ; DOS中断4ch:程序退出 int 21h end start
代码运行效果
这段代码运行后会输出:
* ** *** ****
如果你的需求是同一行内输出* ** *** ****(用空格分隔各组星号),可以调整代码去掉换行,换成在每组星号后打印空格,修改后的核心逻辑如下:
; 替换原print_line部分 print_groups: mov bx, cx print_ast_group: lea dx, asterisk mov ah, 09h int 21h dec bx jnz print_ast_group ; 每组星号后打印空格(最后一组可以跳过) cmp dx, 1 je skip_space lea dx, space int 21h skip_space: inc cx dec dx jnz print_groups
这样运行后会在同一行输出:* ** *** ****
逻辑说明
- 先初始化数据段
ds,确保能正确访问.data里的变量。 - 用
cx控制当前组/行的星号数量,从1开始逐步递增。 - 内层循环负责打印当前数量的星号,用
bx作为计数器。 - 根据需求选择换行或打印空格,完成每组/行的输出。
- 最后调用DOS中断
4ch正常退出程序。
内容的提问来源于stack exchange,提问作者Zain UL Abdeen
相关产品推荐
相关产品推荐

