2015-06-04 2 views
0

Гибридная программа (ASM + СРР): (.. Intel x86 Turbo Assembler и BorlandC компиляторы, Turbo компоновщика) для отправки и получения указателя на массив

Мой вопрос будет о том, как изменить мой f1.asm (и, возможно, main1.cpp).

В вводе целочисленных значений main1.cpp I, которые я посылаю функционировать в 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 код смотреть, чтобы получить доступ к первому (и последующие) элементы массива?

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

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

... Или я, в данном конкретном случае, использовать что-то другое из стороны .cpp «s чем указатель?

+0

В маленькой модели, я думаю, это действительно смещение. Я предлагаю, если вы не будете вынуждены, быстро забыть об этих древних инструментах и ​​использовать что-то более недавнее ... – Jester

+0

Да, вынужден. : P Интересно, почему так много университетов не обновили. ... Наверное, потому что старшее поколение программистов отвечает за создание нашего учебного материала, и они не любят новизну? – dziadek1990

+0

@Jester Какой отладчик вы рекомендуете отлаживать дорожку, которую данные гибридной программы проходят через регистры во время выполнения программы? (В частности, отладчик, который будет работать со старым гибридом, подобным этому.) – dziadek1990

ответ

1

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

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

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

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

С ++

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 
+0

Спасибо. Какие программы вы рекомендуете отлаживать трек, данные гибридной программы проходят через регистры во время выполнения программы? (В частности, программа, которая будет работать со старым временным гибридом, подобным этому.) – dziadek1990

Смежные вопросы