[Asembler] XOR AL, 0AAh

0

Witam!
Właśnie analizuję program zamieniający kolejnością bity w rejestrze w ten sposób, że pierwszy jest ostatnim, drugi przedostatnim, (...), czwarty piątym, (...), ostatni jest pierwszy. No i na początku napotkałem taką linijkę kodu:
XOR AL, 0AAh
co ona oznacza, a właściwie to jaka jest jej funkcja?
Z góry dzięki za odpowiedzi.

0

Xoruje rejestr AL przez AAh. A ogólnie o xorowaniu masz tutaj: http://pl.wikipedia.org/wiki/Alternatywa_wykluczająca

0

Wiem, że chodzi o XORowanie, ale nie wiem czemu akurat przez liczbę AA? ;)

0
itsverysimple napisał(a)

co ona oznacza, a właściwie to jaka jest jej funkcja

Otrzymałeś odpowiedź co ta funkcja robi. Jeżeli chcesz wiedzieć jaka jest tego funkcja w całym programem, to wypadałoby żebyś załączył ów program.

0

AA to na przemian zera i jedynki w zapisie binarnym.

0
ASSUME CS: CODE, SS:STACKREG
CODE SEGMENT
Begin:

MOV AL, 28
NEG AL
XOR AL, 0aah
INC AL

XOR BL, BL
XOR CL, CL

ety1:
RCL AL, 1
RCR BL, 1
INC CL
CMP CL, 7
JBE ety1

XOR CL, CL
MOV AL, BL
ety2:
INC CL
RCR BL, 1
ADC AL, 0
CMP CL, 8
JBE ety2

MOV AX, 4C00H
INT 21H
CODE ENDS

STACKREG SEGMENT STACK 'STACK'
db 64 DUP(0)
STACKREG ENDs

DATA SEGMENT
DATA ENDS
END Begin
0

ja nie widzę sensu tej operacji :

MOV AL, 28
NEG AL
XOR AL, 0aah
INC AL

zamiast tego lepiej po prostu napisać :

mov al, 79
0

No właśnie ja też nie za bardzo widzę sens. Moje zajęcia z asemblera wyglądają tak, że gościu podaje część kodu, a my mamy napisać resztę. Tą właśnie część kodu:

MOV AL, 28
NEG AL
XOR AL, 0aah
INC AL

nasz gościu od labek nam podał (oczywiście nic nie tłumacząc). :-/

0

To zwykle wyliczenia na rejestrze al nic poza tym .. dają one zawsze taką samą wartość przy takim zapisie jak tutaj. Pewnie gości nie chciał wam po prostu podać jak ma wyglądać rejestr al do odwrócenia? no chyba ze ma to być cześć kodu odwracającego bity?

0
_aduch napisał(a)

Pewnie gości nie chciał wam po prostu podać jak ma wyglądać rejestr al do odwrócenia?

To jest całkiem prawdopodobne. Jutro przeanalizuję dokładnie kod i zobaczę jak to wygląda. Teraz idę na piwo. :-) Dzięki wszystkim za pomoc!

0

_aduch napisał:

zamiast tego lepiej po prostu napisać :
mov al, 79

A nie czasem:

mov al, 73

:>

0
mov al, 28      ; al = 0x1C
neg al             ; al = 0xE4
xor al, 0xAA     ; al = 0x4E
inc al               ; al = 0x4F = 79

Chyba sie nie pomyliłem?

Już wiem za to gdzie ty sie pomyliłeś :) stwierdziłeś że 28 jest w HEX i wynik 73 też podałeś w HEX :] ale assembler domyślnie bierze liczby decymalne =P

0

ADuch napisał:

stwierdziłeś że 28 jest w HEX i wynik 73 też podałeś w HEX

Racja :-) Przyzwyczaiłem się do tego, że we wszystkich disassemblerach, debugerach i hexedytorach zawsze wartości są podane w hexach. ort! ten błąd, przepraszam za zamieszanie :-)

0

Miałem napisać wcześniej, ale mi trochę nie wyszło. ;] No ale lepiej późno niż wcale. Wygląda na to, że te linijki z XORami i INCami są tylko żeby zmienić liczbę. No i po analizie kodu wyszło, że poprzedni program nie do końca działa. Ten już jest OK:

ASSUME CS: CODE, SS:STACKREG
CODE SEGMENT
Begin:

MOV AL, 28

XOR BL, BL
XOR CL, CL

ety1:
INC CL
SHL AL, 1
ADC BL, 0
ROR BL, 1
CMP CL, 7
JBE ety1

MOV AX, 4C00H
INT 21H
CODE ENDS

STACKREG SEGMENT STACK 'STACK'
db 64 DUP(0)
STACKREG ENDS

DATA SEGMENT
DATA ENDS
END Begin

Skasowałem te wszystkie zabawy z rejestrem AX.

Jeszcze jedna małą prośba: mógłby ktoś mi wyjaśnić o co chodzi ze stosem? Instrukcja db 64 DUP(0) jest deklaracją 64-elementowego stosu, który jest ciągiem 64 zer oddzielonych przecinkiem. Tyle wiem. Ale po co jest ten stos? Czemu akurat 64 elementy i czemu są w nich same zera?

0

Na stos możesz wpisać co chcesz nie muszą to być zera, stos to po prostu wydzielony obszar pamięci na operacje PUSH i POP.

operacja pusz ax robi mniej więcej coś takiego :

sub sp, 2
mov [ss:sp], ax

a operacja pop ax

mov ax, [ss:sp]
add sp, 2

w przypadku eax postępowalibyśmy tak samo tylko ze trzeba by było odjąć/dodać 4 bajty a nie 2
w twoim przypadku stos ma miejsce na 64 bajty danych, im większa liczba tym wiecej danych zmieścisz na stosie to tyle

ss:sp to ten wydzielony obszar na stos, przy czym jest to jego koniec

0

No to teraz wszystko jest jasne. :-) Wielkie dzięki za pomoc! Pozostaje mi teraz życzyć wszystkim szampańskiej zabawy i szczęśliwego Nowego Roku! [soczek]

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