prośba o wytłumaczenie co robi kod asemblera

0

Witam
Czytam dużo o asemblerze i im wiecej czytam tym mniej wiem. Otóż mam taki kod i nie wiem co on robi

mov ax, 4
mov bx, 3
sub ax,bx
or ax, 10h

co wyświetli ax ?
Ja to rozumiem tak do ax załaduj 4 (czyli sprawa wygląda tak że ta 2 jest tak naprawdę w al a w ah są same 0 czyli rejestr ax wygląda tak 00000000 00000100)
i tu już nie rozumiem mov bx,3 czyli do bx załaduj 3 (ale bx to przecież rejestr bazowy który służy do trzymania adresu nie chodzi chyba o 3 bit) czyli bx wygląda tak 00000000 00000011
sub ax, bx od ax odejmij bx wynik zostaw w ax czyli robie odejmowanie binarne wychodzi cos takiego w ax 00000000 00000001
następnie mam sumę logiczną czyli do ah dodaje 1 a do al 0 czyli ax wygląda tak 00000001 0000001
czyli ostatecznie ax to 00000001 000000001 co dziesiętnie stanowi 257
czy dobrze myślę?

1

To co wkładasz do rejestru zależy od ciebie i nie ma tu znaczenia że dany rejestr czasami jest używany do trzymania adresu czy indeksu. Jego zastosowanie zależy od operacji! Jak zrobisz mov bx, 3 to wpisujesz do bx liczbę 3 i tyle.
W efekcie ten twój kod robi:

ax = 4
bx = 3
ax = ax-bx = 4 - 3 = 1
ax = ax or 10h = 1 or 16 = 00001 or 10000 = 10001 = 17

Prawie dobrze to zrobiłaś, ale nie wiem skąd ci się wzięło że 10h to 00000001 0000000. Przecież każda "cyfra" szesnastkowa to 4 bity, więc liczbę 10h można wyrazić jako 0001 0000 czyli 16.

0

piękne dzięki za odpowiedź :> im wiecej czytałam tym mniej rozumiałam a mam jeszcze pytanie żeby do tego kodu na końcu dodać instrukcję add ah,4 to wtedy otrzymuje cos takiego
00000100 00010001 co dziesiętnie stanowi 1041 ? czyli w tym momencie ax jest 1041 ?

0

Tak.

0

piękne dzięki:>

0

a jeszcze jedno pytanie jeżeli mam instrukcję mow al, 9 to oznacza że ładuję 9 do al ? czy znaczy to że jest załadowana 9 funkcja dos-u ? kiedy wiadomo że chodzi o liczbe w rejestrze a kiedy wiadomo że chodzi o funkcje dos-u ?

2

Nie bardzo rozumiem o jakie "funkcje dosu" ci chodzi. mov to mov -> powoduje wpisanie danych z miejsca źródłowego do docelowego, nic więcej. mov al, 9 wpisze do al wartość 9.
Inna sprawa że wywołanie później przerwania jakimś int albo wywołanie funkcji call może korzystać z parametrów które są wpisane do rejestrów, ale w rejestrach są po prostu liczby. Ich interpretacja zależy tylko i wyłącznie od kodu który tych wartości używa. Jeśli wpiszesz do rejestru wartość 65 a potem wypiszesz jako znak ascii to pojawi się A, bo tak zostanie ta wartość zinterpretowana.

Jak wpiszesz do jakiegoś rejestru liczbę, to jest to liczba. A że potem jakiś interrupt handler na podstawie tej liczby uruchamia jakąś akcję, to jest jego sprawa. Patrząc na samo mov al, 9 nie da się stwierdzić jak ta wartość zostanie użyta.

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