(Intel x86.Turbo Assembler和BorlandC编译器,Turbo Linker。)
我的问题是如何修改我的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
发送指向元素数组的指针,为任意数量的变量创建这样的函数。
问题:如果我将int f1(int, int, int)
中的main1.cpp
函数转换为int f1( int* )
,并将指向包含要成为的数组的指针放入其中-added值,那么我的.asm
代码应该如何访问第一个(和后续的)数组元素?
指针是如何存储的?因为我尝试将它视为一个offeset,并且偏移的偏移,我尝试了一些其他的东西,但我仍然无法访问数组的元素。
(如果我可以访问前几个,我可以解决剩下的问题。)
......或者,在这种特殊情况下,我应该使用.cpp
方面的其他东西而不是指针吗?
答案 0 :(得分:1)
C或C ++允许传递可变数量的参数,前提是被调用者可以确定数字,因为它在调用函数之前以相反的顺序推送所有参数,并且调用者在函数返回后清理堆栈。
但是传递数组是完全不同的:你只传递一个值,即数组的地址(指针......)
假设你传递了一个3个整数的数组--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