Гибридная программа (asm + cpp): отправка и получение указателя массива

(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* )и поместите в него указатель на массив, содержащий добавляемые значения, тогда как мой .asm смотреть код для доступа к первым (и последующим) элементам массива?

Как хранится указатель? Потому что я пытался рассматривать его как смещение и смещение смещения, и я попробовал несколько других вещей, но я все еще не мог получить доступ к элементам массива.

(Если я смогу получить доступ к первым нескольким, я смогу решить остальную часть проблемы.)

…Или я должен, в данном конкретном случае, использовать что-то еще из .cppсторона, чем указатель?

0

Решение

Ой, давненько я не видел звонка с 16 бит C на сборку …

C или C ++ позволяет передавать переменное число аргументов, при условии, что вызываемый может определить число, потому что он помещает все аргументы в обратном порядке перед вызовом функции, а вызывающий очищает стек после того, как функция вернулась.

Но передача массива — это нечто совершенно другое: вы просто передаете одно значение, которое является адресом (указателем …) массива.

Предполагая, что вы передаете массив из 3-х — 16-битных маленьких моделей (int, указатели данных и кодовые адреса — все 16-битные)

C ++

int arr[3] = {1, 2, 3}
int cr;

cr = f1(arr);

КАК М

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
1

Другие решения


По вопросам рекламы [email protected]