Witam,
Panowie, mam następujący problem. Piszę program do zamiany liczb z jednego systemu na drugi, który zamierzam wywoływać w ten sposób, np. zamiana -d -b 123, co oznaczałoby : zamień liczbę 123 z dziesiętnego na binarny. Problem pojawia się już przy sprawdzeniu opcji, a konkretnie : czy argument programu zaczyna się od '-'. Jeśli nie, to chcę wyświetlić użytkownikowi poprawny sposób użycia (tak samo później z następnym argumentem, ale problem jest już przy pierwszym). Oto kod :
## definicje stalych
READ = 3
WRITE = 4
OPEN = 5
CLOSE = 6
STDIN = 0
STDOUT = 1
EXIT = 1
SYSCALL = 0x80
EXIT_SUCCES = 0
## koniec definicji stalych
.data
argc: .byte 0
argcDl = . - argc
arg1: .skip 3
arg1Dl = . - arg1
nap1: .asciz "----------------- Program konwertujacy z/na popularne systemy liczbowe -----------------\n"
nap1Dl = . - nap1
nap2: .asciz "\tPrzyklad uzycia :\tconv <system wejsciowy> <system wyjsciowy> <liczba> \n"
nap2Dl = . - nap2
nap3: .asciz "\tObslugiwane systemy:
\t-b binarny
\t-o osemkowy
\t-d dziesietny
\t-h szesnastkowy\n\n"
nap3Dl = . - nap3
nap4: .asciz "binarnie: "
nap4Dl = . - nap4
nap5: .asciz "osemkowo: "
nap5Dl = . - nap5
nap6: .asciz "dziesietnie: "
nap6Dl = . - nap6
nap7: .asciz "szesnastkowo: "
nap7Dl = . - nap7
mysln: .asciz "Myslnik.\n"
myslnDl = . - mysln
pom: .skip 1
// makro do wypisywania tekstu
.macro wypisz tekst, dlugosc
mov $WRITE, %eax
mov $STDOUT, %ebx
mov \tekst, %ecx
mov \dlugosc, %edx
int $SYSCALL
.endm
// koniec makra
znak: .byte 0
.text
.global _start
_start:
push %ebp
mov %esp, %ebp
// jesli liczba argumentow jest != 4 to pokaz uzycie i wyjdz
mov 4(%ebp), %eax
//mov %eax, argc
cmp $4, %eax
jne uzycie
mov 12(%ebp), %eax
mov %eax, arg1
xor %edi, %edi
// sprawdzamy, czy pierwszy znak opcji to myslnik, a jesli nie, to wyswietlamy
// prawidlowy sposob uzycia
mov arg1(, %edi, 1), %eax
mov %eax, znak
cmpb $'-', znak // <-- tu pojawia sie problem
jne uzycie
// tu jakies dalsze dzialanie, np. sprawdzenie nastepnego argumentu, itp.
//wyjscie
jmp koniec
// pokazuje prawidlowe uzycie programu
uzycie:
wypisz $nap1, $nap1Dl
wypisz $nap2, $nap2Dl
wypisz $nap3, $nap3Dl
// procedura konczaca
koniec:
mov %ebp, %esp
pop %ebp
mov $EXIT, %eax
mov $EXIT_SUCCES, %ebx
int $SYSCALL
Jak widać, piszę w składni AT&T (z przymusu). W zaznaczonej linii, program testuje warunek, jednak nie ustawia flagi ZF - krótko mówiąc, nie działa tak, jak powinien (sprawdzalem gdb). Ma ktoś pomysł, dlaczego tak się dzieje ?
Byłbym wdzięczny za pomoc, bo męczę się z tym już którąś godzinę i nie mogę dojśc, dlaczego.
Pozdrawiam,
Zbychu