混合程序(asm+cpp):发送和接收一个数组指针

Hybrid program (asm+cpp): sending and receiving an array pointer

(Intel x86。Turbo 汇编器和 BorlandC 编译器,Turbo 链接器。)

我的问题是关于如何修改我的 f1.asm(可能还有 main1.cpp)代码。

main1.cpp 中,我输入了我发送给 f1.asm 函数的整数值,将它们相加,然后发回并在 main1.cpp 中显示结果。

main1.cpp:

#include <iostream.h>
#include <stdlib.h>
#include <math.h>

extern "C" int f1(int, int, int);

int main()
{
    int a,b,c;

    cout<<"W = a+b+c" << endl ;
    cout<<"a = " ;
    cin>> a;
    cout<<"b = " ;
    cin>>b;
    cout<<"c = " ;
    cin>>c;

    cout<<"\nW = "<< f1(a,b,c) ;

    return 0;    
}

f1.asm:

.model SMALL, C

.data

.code

PUBLIC f1
f1 PROC

    push    BP
    mov     BP, SP      

    mov ax,[bp+4]
    add ax,[bp+6]
    add ax,[bp+8]

    pop BP
    ret

f1 ENDP

.stack
db 100(?)

END

我想通过将指向元素数组的指针发送到 f1.asm 来为任意数量的变量创建这样的函数。

问题: 如果我将 main1.cpp 中的 int f1(int, int, int) 函数变成 int f1( int* ),并将指向数组的指针放入其中包含要添加的值,那么我的 .asm 代码应该如何访问第一个(和后续的)数组元素?

指针是如何存储的?因为我尝试将其视为偏移量和偏移量的偏移量,并且尝试了其他一些操作,但仍然无法访问数组的元素。

(如果我能访问前几个,我可以解决剩下的问题。)

...或者在这种特殊情况下,我应该使用 .cpp 方面的其他东西而不是指针吗?

哎呀,好久没看到16位C对汇编的调用了...

C 或 C++ 允许传递可变数量的参数,前提是被调用方可以确定数量,因为它在调用函数之前以相反的顺序压入所有参数,并且调用方在函数返回后清理堆栈。

但是传递数组是完全不同的事情:你只传递一个值,它是数组的地址(一个指针...)

假设你传递一个3个int的数组-16位小模型(int、数据指针、代码地址都是16位)

C++

int arr[3] = {1, 2, 3}
int cr;

cr = f1(arr);

ASM

push    BP
mov     BP, SP      

mov ax,[bp+4]     ; get the address of the array
mov bp, ax        ; BP now points to the array
mov ax, [bp]      ; get value of first element
add ax,[bp+2]     ;   add remaining elements
add ax,[bp+4]

pop BP
ret