使用循环代码的汇编语言

问题描述 投票:0回答:1

我已经有了这段代码,但是我如何使用循环来实现它。基本上它的代码获取 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
loops assembly x86 addition nested-loops
1个回答
0
投票

首先,要读/写内存位置,需要使用[]。 [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
© www.soinside.com 2019 - 2024. All rights reserved.