2
votes

I wonder how do I have to pass pointer argument to procedure?

I have to create function who have 2 arguments:

  1. words array
  2. array's size

The function gets array that the array's size and sum the column.

That's what I've coded:

.MODEL  Small
.STACK  64

; +===============================+
; |             DATA              |
; +===============================+

.DATA 
array1      dw  1,2,3,4
array1size  dw  4
result      dw  ?
address     dw  ?
; print
TMP     dw  0 ; general temporary variable ..
.code

addNumbers proc
;   reset result
    lea di,result
;   use stack
    mov bp,sp
;   get num array
    mov bx,[bp+2]
;   get num of numbers
    mov cx,[bp+4]
; making additiontion
adding:
    add [di],bx
    inc bx; go to the next bx
loop adding
    ret 2
endp

; start
start:
    mov ax,@DATA
    mov ds,ax
; set strings
    push array1size
    push offset array1
    call addNumbers
; print
    mov dx:ax,result
    call printNumber
    mov ah,4ch
    mov al,0
    int 21H
end start

the problem - it's adding to result the offset pointer (here is cs:0000,cs:0001,cs:0002,cs:0003) and not the offset value (here is: 1,2,3,4).

Because of this, result will be 6 and not 10.

could someone help me?

1

1 Answers

2
votes
INC BX

will of course add 1 (byte) to the pointer in BX. If you need to move one WORD, you have to add the size of the word. Say that is 2 bytes, then you need

ADD BX, 2

instead of the INC.

Your other problem is that you don't add the values pointed-to, [BX], but the pointers themselves BX. You might use a spare register, like AX to compute the sum.

    MOV  AX,0
adding:
    ADD  AX,[BX]
    ADD  BX,2
    LOOP adding
    MOV  [result],AX

    RET  4