因此,作为我教科书的练习,我正在尝试为英特尔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
- 保存每个三角形高度的变量,由用户输入
这为六个寄存器(和自由累加器)提供了六个值,这看起来并不太乐观。此外,这一点的实施似乎是一场噩梦。我在这里缺少什么会以某种方式简化任务,还是它看起来一样难?
答案 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中创建一个工作示例,然后创建一个类似的汇编代码示例,可以更容易地充实汇编代码。