我已经有了这段代码,但是我如何使用循环来实现它。基本上它的代码获取 x 数组中的第一个值并将其添加到下一个值,将其保存到 y 中的第一个值,然后从 x 中获取第二个值并将其添加到第三个值并将其存储在第二个值中y 等等。然后它获取 x 的最后一个值并将其添加到 x 的第一个值并将其保存到 y 的最后一个值。
.data
x sword 10,20,30,-10,-20, -30
y sword 6 dup (?)
mov ax,x
add x+2,ax
mov y,ax
mov ax,x+2
add x+4,ax
mov y+2,ax
mov ax,x+4
add x+6,ax
mov y+4,ax
mov ax,x+6
add x+8,ax
mov y+6,ax
mov ax,x+8
add x+10,ax
mov y+8,ax
mov ax,x+10
add x,ax
mov y+10,ax
首先,要读/写内存位置,需要使用[]。 [ax] 是 ax 处的内存位置,依此类推。也适用于数组:[x+2] 表示 x 的第二个元素(因为它们每个都是两个字节)。
继续前进。您可以使用索引或运行指针来完成数组的循环。让我们考虑第一个。
因此,您需要运行一个从 0 到 5 的索引 (
i
)。对于每个值,您需要将 x[1] + x[i+1]
的值分配给 y[i],最后一个值除外。您需要一个条件来处理最后一个。
在 Intel 中,有两个寄存器专门设计为索引 -
SI
和 DI
。您可以使用预乘的数组来寻址 - 像 [array+SI*2]
这样的结构。
为了执行循环,需要有条件跳回:如果索引小于数组大小,则再次执行循环。
因此,在伪代码中,故意使用变量名而不是寄存器:
i=0
Loop:
copy x[i] into y[i] (more than one command in assembly)
if i = array_size-1 then add x[0] to y[i] (conditional jump here)
else add x[i+1] to y[i]
increment i
if i = array_size then jump to loop