混合程序(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