使用Intel 8080的组件打印形状

时间:2013-11-16 19:36:03

标签: assembly intel-8080

因此,作为我教科书的练习,我正在尝试为英特尔8080的程序集编写一个程序,该程序将打印一个可缩放的图像,其中三个三角形面朝下放在上排,两个面朝上放在底行。确实如此:

*****************************
 *******   *******   *******
  *****     *****     *****
   ***   *   ***   *   ***
    *   ***   *   ***   *
       *****     *****
      *******   *******
     *******************
(when user selects the height variable = 5)

*****************************************  
 ***********   ***********   ***********
  *********     *********     *********  
   *******   *   *******   *   *******
    *****   ***   *****   ***   ***** 
     ***   *****   ***   *****   ***
      *   *******   *   *******   *
         *********     *********
        ***********   ***********
       ****************************
(when user selects the height variable = 7)

作为一个装配新手,我很难想象只使用六个寄存器来实现这样的东西,并且还要记住语言本身的不友好性。我能想到的最好的是:

我们知道第一行是6 * height-1所以没问题。然而问题在后来开始:似乎我们必须跟踪(为了简单,我会给它们一些名字):
- outer_margin - 外三角形左侧和右侧的空格数。它随着每一行递增但在绘制上三角形后它将无法工作,因此我们需要在寄存器中添加一个新值 - inner_spaces - 三角形之间的空格。首先,它们是3,5,然后是3,直到我们到达下三角形的底部 - 问题是它们必须在前两行之后更频繁地出现 - up_star_counter - 为行中每个上三角形打印星星的轨迹 - down_star_counter - 与底行中的三角形相同 - row - 跟踪行,以便我知道何时开始使用一组标签来打印底部三角形以及 - height - 保存每个三角形高度的变量,由用户输入

这为六个寄存器(和自由累加器)提供了六个值,这看起来并不太乐观。此外,这一点的实施似乎是一场噩梦。我在这里缺少什么会以某种方式简化任务,还是它看起来一样难?

1 个答案:

答案 0 :(得分:1)

这里缺少的是有空闲内存,你有足够的空间来存储可变数据。

您可以查看here以获取更多信息,但简而言之,dw, dd, and db, etc(定义初始化字/双字节/字节)或resb, resw, resq(定义未初始化字节/字/实数)将创建程序中变量的空间。例如,该程序将在开头为一个字节创建空间,该空格将被myvar引用,并且它将包含5。 (NASM语法)

[BITS 16]                           
[ORG 0x7C00]                        
jmp Start

myvar dw 5                  

Start:
    mov word bx, [myvar]

End:
    jmp $                   

times 510-($-$$) db 0           
dw 0xAA55   

这里要注意的一件重要事情是我们跳过实际上包含语句dw的代码。这句话在上面的代码中是jmp。所以现在myvar(用括号引用)可以像普通单词一样使用。

6个寄存器用于循环,计数,跳转等。内存中的可变空间可用于存储大量数据,包括您概述的变量等。

关于语言的不友好性,我发现通过在C中创建一个工作示例,然后创建一个类似的汇编代码示例,可以更容易地充实汇编代码。