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