0

因此,作为我教科书的练习,我正在尝试为英特尔 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- 保存每个三角形高度的变量,由用户输入

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

4

1 回答 1

2

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

您可以在此处查看更多信息,但简而言之,dw,dddb,(定义已初始化的字/双字节/字节)或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在上面的代码中是'd over int。所以现在myvar(用括号引用)可以像普通单词一样使用。

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

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

于 2013-11-17T00:45:53.423 回答