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

如何用NASM在Linux终端中使用文本字符绘制圆形?

用NASM在终端打印字符组成的圆形

核心思路

要在终端用*绘制圆形,核心是利用圆的整数近似方程计算坐标点是否属于圆的边缘。把终端视为简单坐标系:行对应Y轴,列对应X轴,设定圆心(cx, cy)和半径r后,逐行逐列遍历每个点,判断当前点(x,y)是否满足近似圆的条件,满足则打印*,否则打印空格,每行结束后换行。

圆的整数近似判断逻辑:
计算(x - cx)² + (y - cy)²,当该值落在r² ± r的范围内时,就认为这个点属于圆的边缘(加入误差范围是为了让圆的边缘更平滑,避免字符过于稀疏)。

完整NASM代码示例

; 用*字符在终端绘制圆形
section .data
    ; 定义基础字符
    star        db '*'
    space       db ' '
    newline     db 0xA
    ; 圆的参数:可自行调整
    cx          equ 15     ; X轴圆心(列数)
    cy          equ 10     ; Y轴圆心(行数)
    r           equ 8      ; 半径
    r_squared   equ r*r    ; 提前计算半径平方,减少重复运算
    max_y       equ cy + r ; 绘制的最大行数
    min_y       equ cy - r ; 绘制的最小行数
    max_x       equ cx + r ; 每行的最大列数
    min_x       equ cx - r ; 每行的最小列数

section .text
global _start
_start:
    mov ebx, min_y         ; 初始化当前行Y为最小行数
draw_row:
    cmp ebx, max_y         ; 判断是否超出最大行数
    jg exit_program        ; 超出则退出程序

    mov ecx, min_x         ; 初始化当前列X为最小列数
draw_col:
    cmp ecx, max_x         ; 判断是否超出当前行的最大列数
    jg end_row             ; 超出则换行,处理下一行

    ; 计算(x - cx)的平方
    mov eax, ecx
    sub eax, cx
    imul eax, eax
    mov esi, eax           ; 暂存到esi

    ; 计算(y - cy)的平方并求和
    mov eax, ebx
    sub eax, cy
    imul eax, eax
    add eax, esi           ; 得到(x-cx)² + (y-cy)²

    ; 判断是否在圆的边缘范围内
    mov edi, r_squared
    sub edi, r             ; 下限:r² - r
    cmp eax, edi
    jl print_space         ; 小于下限,打印空格

    mov edi, r_squared
    add edi, r             ; 上限:r² + r
    cmp eax, edi
    jg print_space         ; 大于上限,打印空格

    ; 满足条件,打印*
    mov eax, 4
    mov edi, 1
    mov ecx, star
    mov edx, 1
    int 0x80
    jmp next_col

print_space:
    ; 打印空格
    mov eax, 4
    mov edi, 1
    mov ecx, space
    mov edx, 1
    int 0x80

next_col:
    inc ecx                ; 当前列+1
    jmp draw_col

end_row:
    ; 打印换行符
    mov eax, 4
    mov edi, 1
    mov ecx, newline
    mov edx, 1
    int 0x80

    inc ebx                ; 当前行+1
    jmp draw_row

exit_program:
    ; 退出程序
    mov eax, 1
    mov ebx, 0
    int 0x80

代码说明

  • 参数调整:修改cx、cy、r的值可以改变圆的位置和大小,比如增大r会让圆的直径变大。
  • 整数运算:全程用imul指令计算平方,避免浮点运算,符合汇编的高效特性。
  • 平滑边缘:加入±r的误差范围,避免严格匹配r²导致的边缘字符稀疏问题,让圆形看起来更自然。
  • 遍历逻辑:逐行逐列扫描坐标系内的每个点,根据判断结果打印对应字符,最终形成完整的圆形。

编译运行步骤

  1. 将代码保存为circle.asm
  2. 用NASM编译:nasm -f elf32 circle.asm -o circle.o
  3. 链接生成可执行文件:ld -m elf_i386 circle.o -o circle
  4. 运行程序:./circle

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 17:43:31