asembler

lukasz18101988
Użytkownik
Użytkownik
Posty: 21
Rejestracja: 13 kwie 2008, o 22:37
Płeć: Mężczyzna
Lokalizacja: małogoszcz

asembler

Post autor: lukasz18101988 »

witam
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.
 

 

[/quote]
Ostatnio zmieniony 25 maja 2008, o 17:21 przez lukasz18101988, łącznie zmieniany 1 raz.
Awatar użytkownika
N4RQ5
Użytkownik
Użytkownik
Posty: 421
Rejestracja: 15 lis 2006, o 16:22
Płeć: Mężczyzna
Lokalizacja: Suwałki/Wawa
Pomógł: 104 razy

asembler

Post autor: N4RQ5 »

Nie wiem jaka jest konwencja w twoim kompilatorze C ale w gcc wartość zwracana przez funkcje znajduje się w EAX. Czyli wystarczy umieścić ją w rejestrze i wykonać RET.
Na oko w twoje assemblerowej funkcji coś jest nie tak z samym wyliczaniem wartości. Może przejrzyj jeszcze raz jej kod i postaraj się dopisać komentarze bo nie bardzo chce mi się dochodzić czemu mają służyć te instrukcje. Nie widzę w tym żadnego zamysłu. Dobre komentarze to podstawa przy assemblerze.
lukasz18101988
Użytkownik
Użytkownik
Posty: 21
Rejestracja: 13 kwie 2008, o 22:37
Płeć: Mężczyzna
Lokalizacja: małogoszcz

asembler

Post autor: lukasz18101988 »

ok, troche tam komentarzy zostawilem , w 1 poście
ODPOWIEDZ