2014-02-20 80 views
0

我已經得到了這段代碼,但是我怎樣才能使用循環。基本上它是一個代碼,它接受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 

回答

0

我假設它是功課,所以沒有完整的答案。

首先,要讀取/寫入內存位置,您需要使用[]。 [ax]是斧頭的內存位置,依此類推。也適用於數組:[x + 2]表示x的第二個元素(因爲它們每個都是兩個字節)。

繼續前進。您可以使用索引或運行指針完成數組上的循環。我們先考慮一下。

所以你需要運行一個從0到5的索引(i)。對於每個值,除了最後一個值外,你需要給y [i]賦值x[1] + x[i+1]。你需要一個條件來照顧最後一個。

在英特爾,有兩個專門設計爲索引的寄存器 - 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 

是否可以從後面?