Witam
Powiedzcie gdzie może tutaj być błąd bo ja już nie mam siły.Wywułuje tą funkcję w C pod takimi parametrami
extern void sub (unsigned int n,unsigned int *op,unsigned int *oper);
unsigned int op1[]={0x0,0x0,0x0,0x0,0x3,0x0};
unsigned int op2[]={0x0,0x0,0x0,0x0,0x0,0x3};
unsigned int op3[]={0,0,0,0,0,0};
unsigned int jeden[] = {0,0,0,0,0,1};
unsigned int wynik[] = {0,0,0,0,0,0};
_sub(n,op1,op2);
kompilalator ASM to NASM, kompilacja pod linuxem i linkowanie gcc
Program wysyje się dla takich danych
unsigned int op1[]={0x0,0x0,0x0,0x0,0x3,0x0};
unsigned int op2[]={0x0,0x0,0x0,0x0,0x0,0x3};
tzn zwracany wynik to 0 0 0 0 3 -3 czyli tak jakby nie uwzględniał pożyczki przy odejmowaniu a wg mnie powinien uwzględniać przynajmniej tak wynika ze specyfikacji funkcji SBB
; void sub (int n, int *op, int *oper)
_sub:
mov eax, [esp+8] ;*op
mov edx, [esp+12] ;*oper
mov ecx, [esp+4] ;licznik
clc
pushfd
odj:
;popfd ;ladujemy flage cf
push ecx ;licznik na stos
mov ecx, [edx] ;odejmowanie parti bitow
sbb [eax], ecx ;
pop ecx ;licznik do ecx
;pushfd ;zapamietujemy cf
add eax, 4 ;przesuwamy wskaznik na nastepna porcje danych
add edx, 4 ;
sub ecx, 1 ;zmniejszamy licznik
jnz odj ;skaczemy jesli licznik != 0 do dodawania
popfd ;przygotowujemy stos do wyjscia
ret