[Assembler] Pomoc w zrozumieniu...

0

Witam :)

Mam prośbę do społeczności Assemblerowej :)

Ostatnio na zajęciach z kumplem pisaliśmy program, ja część podstawową on funkcję którą ma wykonywać program z niektórymi moimi pomysłami :)

Po złożeniu programu w całość niestety jest parę momentów których nie mogę zrozumieć :/ a kumpel wyjechał i aktualnie nie ma mi kto i jak wytłumaczyć tych części.

Program ma za zadnie sprawdzić ile razy wstąpi litera w podanym zdaniu.

Oto on:

Assume CS:Kod,DS:Dane

Dane segment
sNapisZnak   db 13,10,'Wprowadz znak: $'				
sNapisZdanie db 13,10,'Wprowadz zdanie: $'
sWynik       db 13,10,'Wynik: '
pWynik       db '                ',13,10,'$'

pBufor       db 33,'                                 '		 
Dane ends

Kod segment
Start:
			MOV AX,Dane
			MOV DS,AX
			MOV AH,09h
			LEA DX, sNapisZnak
			INT 21h
			MOV AH, 01h
			INT 21h	   
			MOV CL, AL
			MOV AH,09h
			LEA DX, sNapisZdanie
			INT 21h	
			MOV AH,0ah
			LEA DX,pBufor
			INT 21h
			MOV BX, DX
			INC BX
			MOV DL, CL
			MOV CH, 0
			MOV CL, pBufor+1
		    INC CL
			MOV SI, 0;
			MOV DH, 0;
et:			CMP SI, CX
			JE koniec
			MOV AL, [BX][SI]
			INC SI			
			CMP AL, DL
			JNE et
			INC DH
			JMP et
koniec:
			
			MOV AH,0
			MOV AL,DH
			MOV DX,0
			MOV CH,0
			MOV CL,10
			MOV DL, '$'
			PUSH DX
et2:		TEST AX,AX
			JZ koniec2
			MOV DX,0
			DIV CX
			PUSH DX
			JMP et2
koniec2:
			MOV DL,0
			LEA BP, pWynik
			
et3:		POP AX
			CMP AL,'$'
			JZ koniec3
			ADD AL, 48
			MOV [BP][DI], AL
			INC DI
			JMP et3
koniec3:	
			CMP DI,0
			JNE et4
			MOV [BP][DI], 48
et4:		MOV AH, 09h
			LEA DX, sWynik;
			INT 21h
			

			MOV AX,4c00h
			INT 21h
Kod ends
end start

A oto których części nie rozumiem:

MOV BX, DX
			INC BX
			MOV DL, CL
			MOV CH, 0
			MOV CL, pBufor+1
		    INC CL
			MOV SI, 0;
			MOV DH, 0;
et:			CMP SI, CX
			JE koniec
			MOV AL, [BX][SI]
			INC SI			
			CMP AL, DL
			JNE et
			INC DH
			JMP et

oraz

et3:		POP AX
			CMP AL,'$'
			JZ koniec3
			ADD AL, 48
			MOV [BP][DI], AL
			INC DI
			JMP et3
koniec3:	
			CMP DI,0
			JNE et4
			MOV [BP][DI], 48

Będę wdzięczny za każdą pomoc :)

0

część pierwsza:

;;;wchodzimy po wykonaniu odczytu zdania, które mamy badać
;;;zdanie to jest w buforze pod adresem DS:DX
                        MOV BX, DX  ;;;przepisanie offsetu zdania do BX
                        INC BX  ;;;ustawienie offsetu w BX aby wskazywał na pierwszą literę zdania
                        MOV DL, CL  ;;;zapamietanie CL w DL (DL=kod szukanego znaku)
                        MOV CH, 0
                        MOV CL, pBufor+1  ;;;pobierz do CL dlugosc zdania...
                    INC CL  ;;;...i dodaj jeden (wykonane aby program nie omijał ostatniego znaku zdania)
                        MOV SI, 0;  ;;;ustawienie SI na zero (później SI jest licznikiem petli)
                        MOV DH, 0;  ;;;pomocnicze (konwersja w stylu DX=word(DL))
et:                        CMP SI, CX  ;;;warunek petli SI=dlugosc zdania
                        JE koniec  ;;;jeżeli tak to wyjdź
                        MOV AL, [BX][SI]  ;;;AL=kod znaku o numerze SI ze zdania
                        INC SI  ;;;przesun na nastepny znak zdania
                        CMP AL, DL  ;;;jeżeli odczytany znak (AL) jest różny szukanemu (DL)...
                        JNE et  ;;;...to badaj na nastepny znak
                        INC DH  ;;;zwieksz ilosc znalezionych znaków
                        JMP et  ;;;badaj nastepny znak

część druga:

;;;nie czytałem źródła wcześniej ale zapewne poniższa część (pętla) ma zamieniać ciąg cyfr (0..9)ze stosu
;;;na ciąg znaków ('0'..'9') w buforze pod adresem SS:[BP]

;;;te dwie linie są potrzenbe do zrozumienia tej części:
                        MOV DL, 0  ;;;ustawienie początkowej wartości dla licznika pętli
                        LEA BP, pWynik  ;;;BP=offset bufora docelowego
et3:                POP AX  ;;;pobierz cyfre
                        CMP AL,'$'  ;;;sprawdź czy ta "cyfra" nie jest końcem zdania
                        JZ koniec3  ;;;jeśli jest to wyjdź z petli
                        ADD AL, 48  ;;;zamień kod cyfry na ASCII ('0' ma kod 48; '1' ma kod 49 itd.)
                        MOV [BP][DI], AL  ;;;zapisz zmienioną cyfrę
                        INC DI  ;;;przesuń wskaźnik bufora na miejsce na następną cyfre
                        JMP et3  ;;;następny krok petli
koniec3:       
                        CMP DI,0  ;;;jeżeli LICZBA ma długość!=0 cyfr (w pierwszym kroku petli było al='$')
                        JNE et4  ;;;to wypisz wynik
                        MOV [BP][DI], 48  ;;;ustaw pierwszy znak LICZBY na '0'
et4...

uwagi:
1.staraj się przeanalizować kod i wtedy "wyciągnąć" wszystkie linijki interesującego cię kawałka (gdybyś nie umieścił całego źródła to za nic nie byłoby wiadomo co jest w DL w drugiej części)
2.zwróć uwagę, że podkreśliłem różnicę między cyfra a LICZBA

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