assembly x86使用stack的值作为指针?

时间:2012-05-31 08:25:56

标签: assembly x86 x86-16

我想知道如何将指针参数传递给过程?

我必须创建具有2个参数的函数:

  1. words array
  2. 数组大小
  3. 该函数获取数组的大小并对列进行求和。

    这就是我编码的内容:

    .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
    
    

    问题 - 它向结果添加了偏移指针(这里是cs:0000cs:0001cs:0002cs:0003)而不是偏移值(这里是:{ {1}},123)。

    因此,结果将是6而不是10。

    有人能帮助我吗?

1 个答案:

答案 0 :(得分:2)

INC BX

当然会在BX中向指针添加1(字节)。如果你需要移动一个WORD,你必须添加单词的大小。假设这是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