mam napisać program wielomodułowy w taki sposób, by wykonywał operację bitową AND na dwóch liczbach całkowitych , np. gdy podam 7 i 11 ma dać w wyniku 3.
Main ma być w języku C, podobnie jak wejście i wyjście.
Zaś podprogram samej operacji AND (funkcja fAND) ma być w asemblerze.
Mam tu problem, w jaki sposób przesłać wynik który został umieszczony w rejestrze EAX, do jakieś zmiennej w programie w C.
Widzę gdy podglądam rejstry i pamięć na samym końcu wykonywania podprogramu w asemblerze, że w EAX siedzi dobra wartość, ale nie mogę jej jakoś wyciągnąć i wsadzić do progamu w C.
W moim przypadku chcę wysłać go do zmiennej "a".
Kompilator ( djgpp, devC, asembler-NASM), nie wyrzuca mi zadnego błędu.
oto kod w C :
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
#include "cdecl.h"
int fAND (int, int) __attribute__((cdecl)); /*tutaj deklaracja funkcji ,
która ma 2 argumenty */
int main(void)
{
int n,n2,a;
printf("Podaj liczbe 1 : ");
scanf("%d", &n); /*wczytaj pierwsza liczbe do n
printf("Podaj liczbe 2 : ");
scanf("%d", &n2); /* wczytaj druga liczbe do n2
a = fAND(n,n2); /* za zmienna "a" podstaw wynik
/* z funkcji
printf("AND: ",a);
system("PAUSE");
return 0;
}
a oto podprogram w asemblerze:
Kod: Zaznacz cały
segment .data
segment .bss
segment .text
global _fAND ; globalna deklaracja funkcji fAND
_fAND:
dump_regs 1 ; wyswietlenie rejestrów
; tutaj zobaczylem ze eax przyjmuje wartosc
; pierwszej liczby , a edx drugiej
dump_stack 1,2,4 ; wyswietlenie stosu
enter 4,0 ; miejsce w pamięci na stos
push ebx
mov dword [ebp-4],0 ; [ebp-4] traktuje jako licznik = 0
and edx , eax ;dlatego tak, ponieważ zauwazylem ze pierwsza liczba weszla do edx
; a druga do eax, wiec wykonuje operacje and , a wynik zostaje
; zapisany w rejestrze edx
mov eax, edx ; przenosze wynik z edx do eax,
end_fAND:
dump_regs 1 ; znow wyswietlam rejestry i pamiec (tylko dla wlasnego
; podgladu )
dump_stack 1,2,4
leave
ret ; powrot do C
; jak patrze w rejestry w miejscu o 7 linijek wyżej, to widze że eax zawiera odpowiedni wynik
, czyli to znaczy ze program dobrze liczy, ale mam problem, jak ten wynik który siedzi w eax, przenieść do C pod zmienną a :( , nie wiem czy brakuje tu jakiejś komendy, hmmm...
czytalem ze rejestr ebx oraz [ebp] nie moze byc modyfikowane, tzn. ze jesli cos biore z C, i cos robie na ebx i [ebp] w asemblerze, to potem musze w asemblerze gdzies na koncu umiescic chyba popa lub pop ebx, ale nie jestem pewien.