Cześć,
1. Czy mógłby ktoś mi pomóc rozszyfrować co tu się dzieje w poniższym kodzie, mniej więcej w komentarzach zapisałem sobie co dana linia robi w oparciu o to co znalazłem w internecie (więc może też być tak że wszystko pomieszałem). W niektórych miejscach zadawałem pytania w komentarzach bo tam to już totalnie rozkładałem się.
2. Czy mógłby ktoś mi wyjaśnić czemu ten kod na jednym komputerze działa, a na drugim wywala dos'a? - to norma?
3. Czy byłby ktoś tak miły i na chłopski rozum wyjaśnił co tutaj mniej więcej się dzieje?
4. Skąd skrypt wie kiedy ma wykonać jakie działanie skoro pierwsze jumpy pojawiają się dopiero dla etykiety "dz", która jest bardzo nisko.
org 100h ; start skryptu
mov ah,1 ; prześlij do rejestru ah -> SOH start of heading
int 21h ; Przerwanie DOS'u 21h
mov [a],al ; prześlij do zmiennej [a] to co jest w rejestrze al
int 21h ; Przerwanie DOS'u 21h
mov [b],al ; prześlij do zmiennej [b] to co jest w rejestrze al
mov ah,48 ; prześlij do rejestru ah -> cyfrę 0
sub [a],ah ; prześlij do zmiennej [a] to co jest w rejestrze ah czyli 0
sub [b],ah ; prześlij do zmiennej [b] to co jest w rejestrze ah czyli 0
dod: ; DODAWANIE
mov ah,0 ; prześlij do rejestru ah -> NULL
mov al,[a] ; prześlij do rejestru al -> wartość zmiennej [a]
add al,[b] ; dodaj do rejestru al -> wartość zmiennej [b]
mov dl,al ; prześlij do DL to co jest w AL
add dl,48 ; dodaj do DL cyfrę 0
mov ah,2 ; prześlij do AH -> STX start of text
int 21h ; Przerwanie DOS'u 21h
od: ; ODEJMOWANIE
mov dl, [a] ; do DL prześlij wartość zmiennej [a]
sub dl, [b] ; odejmij od DL wartość zmiennej [b]
add dl,48 ; dodaj do DL cyfrę 0
mov ah,2 ; prześlij do AH -> STX start of text
int 21h ; Przerwanie DOS'u 21h
mn: ; MNOŻENIE
mov al,[a] ; do AL prześlij wartość zmiennej [a]
mov ah,[b] ; do AH prześlij wartość zmiennej [b]
mul ah ; ??? - mnożenie ale czemu tutaj jest jedna wartość ???
mov dl,al ; prześlij zawartość AL do DL
add dl,48 ; dodaj do DL cyfrę 0
mov ah,2 ; prześlij do AH -> STX start of text
int 21h ; Przerwanie DOS'u 21h
dz:
mov ah,0 ; prześlij do rejestru ah -> NULL
cmp [b],ah ; porównanie zmiennej [b] z ah
jne dal ; jump - przenosi nas do etykiety dal
mov ah,2 ; prześlij do AH -> STX start of text
mov dl,33 ; do rejestru DL przesyła znak '
int 21h ; Przerwanie DOS'u 21h
jmp koniec ; jump - przenosi nas do etykiety koniec
dal:
xor dx,dx ; dx = 0 -> po co zerowaliśmy dx skoro nigdzie dalej go nie używamy?
mov ah,0 ; prześlij do rejestru ah -> NULL
mov al,[a] ; prześlij do AL wartośćś zmiennej [a]
mov bh,[b] ; prześlij do BH watość zmiennej [bh]
div bh ; dzieli bh przez zmienną [a] ????
mov dl,al ; prześlij do DL zawartość AL
add dl,48 ; dodaj do DL cyfrę 0
mov ah,2 ; prześlij do AH -> STX start of text
int 21h ; Przerwanie DOS'u 21h
koniec:
mov ax, 4c00h ; koniec skryptu
int 21h ; Przerwanie DOS'u 21h
a db 0 ; deklaracja zmiennej [a]
b db 0 ; deklaracja zmiennej [b]