porównywanie tekstu/znaku

0

Witam
Uczę się assembly w składnie at&t i próbowałem pobierać literkę (lub ciąg znaków) od użytkownika i następnie porównywać to ze znakiem przechowywanym w zmiennej. Niestety za każdym razem cmp ustawia flagę JZ = 0 więc cokolwiek podam zawsze mówi mi że znaki są różne. Co robię źle?

SYSEXIT = 1
EXIT_SUCCESS = 0
SYSREAD = 3
STDIN = 0

.text
msg: .ascii "Write text(1): \n"
msg_len = .-msg

msg2: .ascii "Rowne\n"
msg2_len = .-msg2

msg3: .ascii "Rozne\n"
msg3_len = .-msg3

#cmpTo: .ascii "aa"
#cmpTo_len = .-cmpTo

.data
buf: .ascii " "
buf_len = .-buf

cmpTo: .ascii "a"

.global _start

_start:

mov $4, %eax
mov $1, %ebx
mov $msg, %ecx
mov $msg_len, %edx
int $0x80

mov $SYSREAD, %eax
mov $STDIN, %ebx
mov $buf, %ecx
mov $buf_len, %edx
int $0x80

#mov $4, %eax
#mov $1, %ebx
#mov $buf, %ecx
#mov $buf_len, %edx
#int $0x80

mov $buf, %eax
mov $cmpTo, %ebx

cmp %eax, %ebx
jne wynik       #jump if not equal

mov $4, %eax
mov $1, %ebx
mov $msg2, %ecx
mov $msg2_len, %edx
int $0x80
jmp koniec

wynik:
mov $4, %eax
mov $1, %ebx
mov $msg3, %ecx
mov $msg3_len, %edx
int $0x80

koniec:
mov $SYSEXIT, %eax
mov $EXIT_SUCCESS, %ebx
int $0x80

Może robię źle że przekazuję podany znak i znak ze zmiennej do rejestrów eax i ebx i porównuje rejestry?
Proszę o pomoc.
Pozdr!

0

Tak na moje, porównujesz adresy, które zawsze będą różne, a nie wartości z pod adresów.

0

to w jaki sposób porównać bezpośrednio wartości?

0

W składni AT&T do adresu, dostęp jest za pomocą nawiasu:

mov ($buf), %eax
mov ($cmpTo), %ebx
cmp al,bl    ;porównujemy tylko 1 bajt

Nie wiem czy będzie działało, może należy
mov $buf,%eax
mov (%eax),%edx
wartosc w edx.

0
Bury Kartofel napisał(a):

W składni AT&T do adresu, dostęp jest za pomocą nawiasu:

mov ($buf), %eax
mov ($cmpTo), %ebx
cmp al,bl ;porównujemy tylko 1 bajt


To niestety nie działa, też tak próbowałem i zawsze linker wywala: "undefined reference to $msg".

 > ##### [Bury Kartofel napisał(a)](http://4programmers.net/Forum/1235083):
> Nie wiem czy będzie działało, może należy 
> mov $buf,%eax
> mov (%eax),%edx
> wartosc w edx.


i to jest rozwiązanie :) dzięki! rozumiem że potem porównujemy za pomocą tych rejestrów al, bl, ... bo char ma 1 bajt? a jak chcę porównać większy ciąg znaków?
0

Źle Cię oceniłem:
W asmie at&t, aby odwołać się do adresu labela uzywamy nawiasu i nazwy bez znaczka wartosci "$".

mov (buf), %al
mov (cmpTo), %bl
cmp %al,%bl    ;porównujemy tylko 1 bajt
 

lub pobierając całe 4 bajty naraz:

mov (buf), %eax
mov (cmpTo), %ebx
cmp %al,%bl    ;porównujemy tylko 1 bajt
 

Aby porównać większą ilość znaków zastosuj pętlę np: loop, lub zrób to na warunkach "jz" , "jne" ... .
Jeżeli wiesz ile znaków będzie porównywane wtedy wykorzystaj loop.

Pseudo kodzik, troszke do poprawienia:

mov ilosc_znaków,ecx    ;ile razy ma wykonac sie petla
mov $buf,%esi  ; adres buf do esi
mov $cmpTo, %edi ;adres cmpTo do edi
etykieta:
mov (%esi),%al
mov (%edi),%bl
cmp %al,%bl
jne ciagi_sa_rozne   ; jak wczesniej
inc %esi ;zwieksz edi o 1 aby pokazywal na kolejny znak do porównania w buf
inc %edi ; zwieksz edi o 1 aby pokazywal na kolejny znak do porównania w cmpTo
loop etykieta
ciagi_sa_sobie_rowne:

ciagi_sa_rozne:

 
0

Dzięki wielkie za takie wytłumaczenie! O coś takiego właśnie mi chodziło, bo chcę dokładnie zrozumieć jak to się wszystko odbywa, co gdzie ląduje i dlaczego. Jeszcze raz dzięki

PS. znasz jakąś DOBRĄ książkę z assembly AT&T?

0

"Professional Assembly Language"
Richard Blum Wydawnictwo Wrox
Tam była ta składnia, ale ręki za to nie dam sobie uciąć, miałem w ręku tylko wersję papierową.

Ewentualnie coś polskiego, typu tutorial z neta pierwszy lepszy z googl'a lub jakaś książka z wydawnicta Helion.
Zazwyczaj jest tam użyta składnia intelowska, lecz sam sposób programowania jest ten sam.
Można następnie sobie to pieknie przełożyć z jednej konwencji na drugą.
http://csiflabs.cs.ucdavis.edu/~ssdavis/50/att-syntax.htm

1 użytkowników online, w tym zalogowanych: 0, gości: 1