【问题标题】:Assembly Language using loop for a code汇编语言使用循环代码
【发布时间】:2014-02-20 02:42:00
【问题描述】:

我有这段代码,但我将如何使用循环来制作它。基本上它是一个代码,它获取 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 add nested-loops


    【解决方案1】:

    我假设这是家庭作业,所以没有完整的答案。

    首先,要读取/写入内存位置,您需要使用 []。 [ax] 是 ax 的内存位置,以此类推。也适用于数组:[x+2] 表示 x 的第二个元素(因为它们每个都是两个字节)。

    继续前进。您可以使用索引或运行指针完成对数组的循环。让我们考虑第一个。

    因此您需要运行一个从 0 到 5 的索引 (i)。对于每个值,您需要将 x[1] + x[i+1] 的值分配给 y[i],最后一个除外。你需要一个条件来处理最后一个。

    在 Intel 中,有两个专门设计为索引的寄存器 - SIDI。您可以使用它们预乘来寻址数组 - 像 [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
    

    你能理解吗?

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多