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

如何用汇编语言打印星号三角形?输出不符问题求助

汇编打印递增星号三角形的问题

问题描述

我想用汇编语言打印一个10行的星号三角形,每行星号数量从1个递增到10个,但现在输出的是每行星号从10个开始递增到20个,求修正方法。

期望输出

*
**
***
****
*****
******
*******
********
*********
**********

当前错误输出

**********
***********
************
*************
**************
***************
****************
*****************
******************
*******************

我的代码(未完成片段)

section .data 
char db ' ' 
trianglesize db 0; ;stars per line 
trianglerows db 10; 

section .text 
global _start 
_start 
mov rax, [triang

问题分析与解决方案

从你的错误输出能看出来,核心问题是当前行的星号起始值错设成了10,而不是1,导致每一行都从10个星号开始递增。我整理了一份完整的修正代码,还标注了关键调整点:

修正后的完整代码

section .data
    star        db  '*'
    newline     db  0xA
    rows        db  10          ; 总共要打印10行
    current_stars db 1          ; 第一行先打印1个星号,初始值设为1

section .text
    global _start

_start:
    mov     bl, [rows]          ; 用bl寄存器存剩余要打印的行数
print_row_loop:
    cmp     bl, 0
    je      exit_program        ; 行数打印完了就退出程序

    mov     cl, [current_stars] ; 用cl寄存器存当前行要打印的星号数
print_stars_loop:
    cmp     cl, 0
    je      print_newline       ; 这行星号打印完,就去打印换行

    ; 调用sys_write打印单个星号
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, star
    mov     rdx, 1
    syscall

    dec     cl                  ; 星号数减1,继续循环打印
    jmp     print_stars_loop

print_newline:
    ; 调用sys_write打印换行符
    mov     rax, 1
    mov     rdi, 1
    mov     rsi, newline
    mov     rdx, 1
    syscall

    inc     byte [current_stars] ; 下一行的星号数加1
    dec     bl                   ; 剩余行数减1
    jmp     print_row_loop

exit_program:
    ; 调用sys_exit退出程序
    mov     rax, 60
    mov     rdi, 0
    syscall

关键调整说明

  • 初始星号数修正:把current_stars的初始值设为1,让第一行从1个星号开始,而不是10个
  • 循环逻辑梳理:每次打印完一行后,星号数递增1,剩余行数递减1,确保循环10次后刚好完成从1到10的星号递增
  • 补充了完整的系统调用逻辑(打印星号、换行、退出程序),让代码可以直接运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:29:40