2015-03-24 38 views
0

我正在嘗試使用x86程序集(TASM)創建一個程序,該程序橫貫兩組數組,並使用for循環在兩個數組之間進行基本的添加。但是,我從來沒有在彙編中使用for循環或數組,所以我很困惑我將如何去實現它。對於循環和穿過x86中的數組彙編代碼

所以我們說,我有這個pusodo代碼:

for i := 0 to n-1 do 
     s := a[ i] + b[ i]; 
     ... 
endfor; 

的,這是我到目前爲止的代碼這需要在si and di分別array a and b和大小ncx,我如何實現上述pusodo代碼我的代碼?

m dw ? 
s dw ? 


    .code 

    extrn putint: proc 

    public maxp_ip 

maxp_ip proc ;(n) 

; computes the max-plus inner product between two vectors a and b of length n 
; input: CX = n 
;  SI = a 
;  DI = b 
; output: AX = m 

; save regs 
    push si 
    push di 
    push ax ; assigned to m 
    push bx ; assigned to s 
    push cx 

; m := -32768 
    mov m, -32768 

; for i := 0 to n-1 do 

請注意,上述代碼不是我的整個代碼,只是我想要實現for循環和添加的部分。另外,你能否解釋我將如何做到這一點,與示例代碼(我是一個視覺學習者,所以我需要看看怎麼做,對不起)。謝謝。

+0

首先用'if'和'goto'重寫'for'循環。這應該直接映射到稍後的程序集。如果你是一個視覺學習者,畫一個流程圖。 – Jester 2015-03-24 22:00:11

回答

0

接下來是你想要的代碼。由具有EMU8086,只需複製,粘貼和運行:

.stack 100h 
.data 

array1 dw 2,4,6,8,10,12,14,16,18 
array2 dw 2,3,5,7,11,13,17,19,23 

.code   
;INITILIZE DATA SEGMENT. 
    mov ax,@data 
    mov ds,ax 

;SUM ARRAY ELEMENTS.        
    mov si, offset array1 
    mov di, offset array2 
    mov cx, 9 ;LENGHT OF ARRAYS. 
for: 
    mov ax, [ si ] 
    mov bx, [ di ] 
    add ax, bx ;SUM BOTH ELEMENTS. 
    ;HERE WE DO SOMETHING WITH THE SUM, LIKE DISPLAY IT. 
    add si, 2 ;NEXT ELEMENT OF ARRAY 1 (DW = 2 BYTES). 
    add di, 2 ;NEXT ELEMENT OF ARRAY 2 (DW = 2 BYTES). 
    loop for ;DECREASE CX. JUMP IF NOT ZERO. 

;FINISH THE PROGRAM PROPERLY. 
    mov ax,4c00h 
    int 21h   

它走在陣列中的每個元素上,加入每對元素融入AX的。注意CX已被用作反向計數器(從9到0),但數組元素在0到8之間訪問。指向數組SI和DI的指針都增加2,因爲這兩個數組的類型都是DW(兩個字節長)。

你可以玩指針來改變你訪問數組元素的順序。例如:

mov di, offset array2 + 8 
... 
dec di, 2 ;PREVIOUS ELEMENT OF ARRAY 2 (DW = 2 BYTES). 

這種方式可以以與陣列2的相反順序的元素求和陣列1的元件。

希望它有幫助。

+0

si和di都已經包含一個數組,所以我仍然需要做mov si,爲兩個數組都偏移array1? – ShadowViper 2015-03-25 03:23:59

+0

是的,因爲我們有兩個不同的數組,SI必須指向數組1,DI指向數組2。您需要OFFSET指向每個數組的第一個元素。 – 2015-03-25 14:07:46