сборка x86 Использование значения стека в качестве указателя?

Интересно, как мне передать аргумент указателя в процедуру?

Мне нужно создать функцию с двумя аргументами:

  1. массив слов
  2. размер массива

Функция получает массив, равный размеру массива, и суммирует столбец.

Вот что я закодировал:

.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

проблема - это добавление к результату указателя смещения (здесь _1 _, _ 2 _, _ 3 _, _ 4_), а не значения смещения (здесь: _5 _, _ 6 _, _ 7 _, _ 8_).

Из-за этого результат будет 6, а не 10.

может кто-нибудь мне помочь?


person nimrod    schedule 31.05.2012    source источник


Ответы (1)


INC BX

конечно добавит 1 (байт) к указателю в BX. Если вам нужно переместить одно СЛОВО, вы должны добавить размер слова. Скажем, это 2 байта, тогда вам нужно

ADD BX, 2

вместо INC.

Другая проблема заключается в том, что вы добавляете не указанные значения [BX], а сами указатели BX. Вы можете использовать запасной регистр, например AX, для вычисления суммы.

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

    RET  4
person Bo Persson    schedule 31.05.2012