2015-03-24 71 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