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

时间:2015-06-04 12:41:12

标签: c++ pointers assembly offset hybrid

(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方面的其他东西而不是指针吗?

1 个答案:

答案 0 :(得分:1)

很久以来,我还没有看到从16位C到汇编的电话......

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