(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
сторона, чем указатель?
Ой, давненько я не видел звонка с 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