我是一名大学生,我不知道如何画圆形或矩形。我在终端窗口中打印文本,而不是使用线条,因此从技术上讲,它看起来像一个由
*
字符制成的圆圈。
我不能使用Python或预先制作形状。我需要使用 NASM 计算星星绕圆的位置,并绘制它们。
这是在终端上打印一个
*
的示例:
;print a star (asterisk)
section .data
star db '*', 0xA, 0
section .bss
;uninitialized variable
section .text
global _start
_start:
mov eax, 4 ; system call for print
mov ebx, 1 ; standard output
mov ecx, star ; memory location
mov edx, 2 ; length
int 0x80
mov eax, 1 ; system call for exit
mov ebx, 0 ; exit
int 0x80
如何将星星打印成整圆的形状?
由于您显然已经知道如何产生输出,可以使用
.data
并区分内存和值操作数,所以这个问题似乎与过程有关。
使用您选择的高级编程语言完成任务。 既然你提到了,我猜你精通Python; Python 似乎很合适。
这一步只是为了确保您设计的算法能够实现任务。 在汇编中直接编辑和修改算法是可能的,但需要更长的时间(并且可能会让初学者感到沮丧)。
完成后,创建修订版(
git commit
或您喜欢的任何源代码修订系统),但这是可选的。
使用内联汇编翻译算法中可能困难的部分。 如果您选择了允许轻松内联使用汇编的编程语言,请使用此功能作为中间步骤。
所谓“舒适使用”,我的意思是,例如,您可以使用已经声明的高级编程语言标识符,或者编译器会抱怨数据大小不匹配(例如,将 64 位变量加载到 32 位寄存器↯),除非被覆盖。 您可能会注意到,某些高级语言结构并不像您希望的那样直接转换为汇编。 有了这些知识,您就可以返回第一步并简化算法。 确保简化后一切仍然正常工作,然后再次关注装配实现。
一旦您对程序感到满意,请创建新的源代码修订版。 您可能不小心引入了一些(新的)编程错误(“bug”),因此参考功能版本可能会派上用场。
。 从样板程序开始,一点一点地添加代码。 例如,首先在屏幕上的特定“常量”位置打印一个星号,然后将代码推广到在“变量”位置打印星号。 这使您可以区分一次/如果您遇到错误,什么有效与什么无效。 备注:
。 另一种更复杂的方法是发出可识别的
console_codes(4)
来定位书写光标。
如果您只想 显示 形状,这很有效,如果输出重定向到常规文件,则效果不佳(除非您再次 cat
该文件到足够尺寸的 Linux 终端)。 优点实际上只是您不必处理逐行(从上到下)打印/“绘制”形状的限制。
正如我提到的,字符单元通常比宽高。 此外,图像元素(“像素”)不一定是正方形(尤其是具有高条
虽然在技术上可以检查当前加载的字体(对于以像素为单位的字形尺寸,setfont
‑o /dev/stdout
)、EDID信息(对于以米为单位的屏幕尺寸)以及屏幕上的列数和行数。屏幕(以像素为单位推断屏幕尺寸[假设全屏幕利用率]),据我所知没有
方便界面;出于教育目的,大部分源代码应重点关注形状绘制
任务。我认为你能做的最好的事情就是插入一个“校准步骤”,即。 e.提示用户“这个星号水平条有多长(以毫米为单位)?”、“……这个垂直条……?”在显示圆(或其最接近的可能近似值)之前。 在
制作程序中,您将使用类似libcaca
caca_draw_circle
。 重新发明轮子是没有意义的。