• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Assembler - Operacje dodawanie/odejmowanie/mnożenie/dzielenie

VPS Starter Arubacloud
0 głosów
1,991 wizyt
pytanie zadane 19 grudnia 2019 w Assembler przez progNewbie Obywatel (1,130 p.)

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]

	

 

1 odpowiedź

0 głosów
odpowiedź 29 marca 2020 przez wachor20 Użytkownik (640 p.)
Program wykonuje się od początku, czyli od samej góry. Najpierw wyjaśnię, że przerwanie 21h dzieli się na różne funkcje. Aby wybrać daną funkcję należy podać jej numer do rejestru AH. Funkcja 1 powoduje czekanie na to aż ktoś naciśnie znak z klawiatury, potem wyświetla go na ekranie, i podaje jego wartość do rejestru AL. Jak widać AL zostaje umieszczony w zmiennej [a]. Podobnie dzieje się ze zmienną [b]. Potem od tych zmiennych zostaje odjęta wartość '0'. Czyli jeżeli ktoś wcisnął np. trójkę na klawiaturze (51) i odejmiemy 48 to zostanie 3 czyli zamieniamy trójkę na wartość 3. Załóżmy że ktoś wybrał na klawiaturze czwórkę i piątkę. Zostanie to przekształcone na [a]=4 i [b]=5. Gdy do AL z podaną [a] dodamy [b] to AL wtedy będzie wynosił 9. Później dajemy wartość do DL i dodajemy 48. Powstanie dziewiątka (57). W AH jest wybrana funkcja 2, która powoduje wyświetlenie rejestru DL na ekranie. Podobnie jest w odejmowaniu. W mnożeniu przy rozkazie MUL jest poprawnie. Rozkaz MUL w tym kodzie działa tak, że mnoży rejestr w argumencie przez AL. Nie trzeba podawać drugiego argumentu. W dz jest dzielenie nie podpisałeś. Najpierw porównujemy [b] z 0 żeby potem nie podzielić przez zero. Jeśli [b] nie jest równe zero, można dzielić. Rozkaz DIV dzieli liczbę gdzie jej wyższa połowa jest w DX stąd trzeba go wyzerować, żeby nie wyszła jakaś kosmiczna liczba, a dolna połowa jest w AX. AX dzieli się na AH i AL. Jeśli liczba zajmuje tylko AL to jasne że pozostałe rejestry trzeba wyzerować. Wynik dzielenia jest umieszczony w AX, a reszta w DX.

Podobne pytania

+1 głos
2 odpowiedzi 595 wizyt
pytanie zadane 19 stycznia 2017 w Assembler przez niezalogowany
0 głosów
1 odpowiedź 953 wizyt
pytanie zadane 20 stycznia 2017 w Inne języki przez Radek Budnik 1 Obywatel (1,160 p.)
0 głosów
1 odpowiedź 448 wizyt
pytanie zadane 4 stycznia 2019 w Assembler przez niezalogowany

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...