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

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

本文关键字:一个 数组 指针 asm+cpp 程序 混合      更新时间:2023-10-16

(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
相关文章: