[FASM] Porównywanie ciągów znaków

[FASM] Porównywanie ciągów znaków
P0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:4
0

Treść zadania:
Program ma zawierać procedurę, dokonującą porównania dwóch ciągów znaków. Oba ciągi znaków zakończone są '$'. Procedura otrzymuje OFFSET przeszukiwanego stringa w DX i szukanego w rejestrze BX. Procedura w AL zwraca dodatkowy parametr przekazany w AH jest nr elementu do końca stringa DX, od którego procedura ma przeszukiwać string DX i ostatecznie zwrócić indeks ostatniego wystąpienia stringu BX w DX.

Prosiłbym o nakierowanie gdzie robię błąd

Kopiuj
                 sts segment 'stack' stack                
    	db 512 dup(0)                    
sts ends                                 
                                         
dane segment                             
                         
napis1 db 100h DUP (?)  
napis2 db 100h DUP (?)                                          
                                                                
dlugosc1 dw 0      
dlugosc2 dw 0                                                   
                                                                
licznik dw 0       
indeks dw 0  
indeks2 dw 0     
l dw 0             
                   
tekst1 db "Podaj pierwszy ciag znakow", 0dh,0ah, "$"
tekst2 db 0dh,0ah, "Podaj drugi ciag znakow", 0dh,0ah, "$"
tekst3 db 0dh,0ah, "Podaj nr indeksu", 0dh,0ah, "$"
tekst4 db 0dh,0ah, "nr indeksu:", 0dh,0ah, "$"
tekst5 db 0dh,0ah, 0dh,0ah, "nacisnij dowolny klawisz...$"
                                                                
ends   	                                                        
                                                                
prog segment                                                    
 assume cs:prog,ds:dane,ss:sts                                  
P486N                                                           
                                                                
odczytaj1:                                                                                                              
                                                                
        mov     ah,0                                            
        int     16h                                             
                                                                
        cmp     al,'$'                                          
        je      koniec1                                                                                                 
                                                                          
        cmp     al,'A'                                                    
        jl      odczytaj1                                                    
                                                                          
        cmp     al,'Z'                                                    
        jle     wczytaj1                                         
                                                                          
        cmp     al,'a'                                                    
        jl      odczytaj1                                                    
                                                                          
        cmp     al,'z'                                                    
        jg     odczytaj1                                                                                 
                                                                
wczytaj1:                                                        
        mov     si,licznik                                                  
        add     [napis1+si],al                                  
                                                                
        add     dlugosc1,1                                       
                                                                
        mov     ah,0eh                                          
        int     10h                                             
                                                                
        add     licznik,1                                       
                                                                
powtorz1:                                                        
        jmp     odczytaj1                                        
                                                                
koniec1:                                                                                                                                   
        mov     si,licznik                                                
        add     [napis1+si],al                                  
                                                                                                                                
RET                                                             
                                                                
                                                                
                                                                
odczytaj2:   ;odczytaj druga liczbe                                                                                                                   
                                                                
        mov     ah,0                                            
        int     16h                                             
                                                                
        cmp     al,'$'                                          
        je      koniec2                                                                                                 
                                                                          
        cmp     al,'A'                                                    
        jl      odczytaj2                                                    
                                                                          
        cmp     al,'Z'                                                    
        jle     wczytaj2                                         
                                                                          
        cmp     al,'a'                                                    
        jl      odczytaj2                                                    
                                                                          
        cmp     al,'z'                                                    
        jg     odczytaj2                                                                                 
                                                                
wczytaj2:                                                        
        mov     si,licznik                                                  
        add     [napis2+si],al                                  
                                                                
        add     dlugosc2,1                                       
                                                                
        mov     ah,0eh                                          
        int     10h                                             
                                                                
        add     licznik,1                                       
                                                                
powtorz2:                                                        
        jmp     odczytaj2                                        
                                                                
koniec2:                                                                                                                                   
        mov     si,licznik                                               
        add     [napis2+si],al                                                                
RET                                
   
wczytaj_indeks:																									     																															   
   	mov	dx,0	                                                            
	mov     bx,10	    								                                                    
	mov	cx,3	                                               
										       			  			    
petl:		   								                                                    
    	mov	ax,dx                                                                   
	mul	bx	                                                                                       
	mov	dx,ax                                                     
		   			     
czytaj: 				     					       
	mov	ah,0                                                 
	int	16h								       
										       
	cmp	al,'0'	                                       
	jl	czytaj                           
			     											       
	cmp	al,'9'                                                
	jg	czytaj								        
			      							        
	sub	al,48	           
	mov	ah,0	                                      
										        
	add	dx,ax                         
		   									
	add	al,48 
	mov	ah,0eh          
	int	10h										  
		    		    							
	loop	petl 
RET                                 
                                    
porownaj:                           
        mov     l,0                            
        mov     bp,dx  
                                                                                 
        mov     cx,dlugosc1       
                                                                             
petla:                             
        mov     si,indeks ;
                                   
        mov     al,ds:[bp+si]
        mov     si,l                         
                                                                                            
        cmp     al,[bx+si]                                                                                                               	   
           	                     	                                                                                                                                    
        jne     nierowne                                        
                                                                
rowne:                                                          
        add     l,1                             
        mov     ax,l                            
                                                    
        cmp     ax,dlugosc2                                                                         
        jne     koniec_petli                                     
                                                                 
dodaj_licznik:                                                   
        mov     ax, indeks
        mov     indeks2,ax                                       
        mov     l,0                                              
        jmp     koniec_petli                                     
                                                                 
nierowne:                                                        
        mov     l,0                
        mov     si,l               
        cmp     al,[bx+si] 
        je      rowne                                                                                   
                                                                 
koniec_petli:                                                    
        add     indeks,1                                         
        loop    petla                                            
                          
        mov     ah,0                                                
        mov     ax,indeks2                      
kon:                                                                     
RET                       
                                                                                                 
wyswietl:	    						 				                            
	mov ah,0    			
	mov bl,10                       
	div bl                          
		                        
	mov dl,ah	
	add dl,30h                                        
	push dx 					       
							       
	mov ah,0					       
	div bl		
	add ax,3030h					       
	push ax 					       
	mov dl ,al					       
							       
	mov ah,2	 ;wyswielt setki
	int 21h 		        
				
	pop ax			     
	mov dl,ah	;wyswietl dziesiatki
	mov ah,2			    
	int 21h 			    
					    
	pop dx		       ;wyswietl jednostki
	mov ah,2			   
	int 21h                          
                               
RET	                                                                               
               	                                                 
start:                                                           
       	mov	ax,seg dane                                      
       	mov  	ds,ax                                            
       	                                                         
       	mov     ah,0                        
        mov     al,3                                             
        int     10h                                              
                                                                
        mov     dx,offset tekst1                                
	mov     ah,09h                                          
	int     21h                                             
                                                                                 
        mov     licznik,0                                                         
        call    odczytaj1                                
                                                                 
        mov     dx,offset tekst2                                
	mov     ah,09h                                          
	int     21h                                               
                                                                
        mov     licznik,0                                                        
        call    odczytaj2                                                   
                                     
        mov     dx,offset tekst3                                
	mov     ah,09h                                           
	int     21h                                              
                                                                 
        ;mov     ah,0                                   
        ;int     16h                                              
        ;mov     ah,0 
        call    wczytaj_indeks
        
        mov     bx,dlugosc1   
        ;sub     al,48                                     
        sub     bx,dx ;ax                                           
        mov     indeks,bx   
                                                                                     
        add     al,48                                                         
        mov     ah,0eh             
        int     10h                                              
                                                                 
        mov     ax,indeks                                        
        sub     dlugosc1,ax                                                       
                                                                 
        mov     dx,offset tekst4                                      
	mov     ah,09h                                                
	int     21h                                              
                                                                 
        mov     dx,offset napis1                                 
        mov     bx,offset napis2                                                              
        call    porownaj                                                                                                      
                                                                      
        call    wyswietl                                                        
                                                                       
        mov     dx,offset tekst5                                      
	mov     ah,09h                                                
	int     21h                                                   
                                                                                                                                                                                                                                                            
        mov     ah,0                            
        int     16h                                                   
       	                                                              
 	mov 	ah,4ch                    
	int    	21h                                                   
prog ends                                                             
end start       
edytowany 2x, ostatnio: phantoom007
codex
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:69
0

Nie czytałem twojego kodu ponieważ już w samym pytaniu jest dużo pomyłek i niedomówień co dopiero w kodzie się można spodziewać ?!

  1. Funkcja porównująca dwa stringi to nie to samo co funkcja wyszukująca jeden string w drugim.
  2. Z kąd ci przyszło do głowy, że funkcja wyszukująca jeden string w drugim ma zwracac index OSTATNIEGO wystąpienia ???
    Zwróć pierwsze znalezionwe wystąpienie, nastwepnie w zaleznosci od reakcji usera czy tam innych czynników kończysz przeszukiwanie lub szukasz nastepnego wystapienia.
  3. Od siebie dodam, że dobrze jest zrobić taki myk (nie zaawsze można) z funkcją zamieniającą duże litery na małe - wtedy wyszukujesz frazę bez względu na wielkość liter.
  4. Masz tu implementację w fasmie operacji na łańcuchach znaków. To jest dla ansi oraz unicode lecz możesz podpatrzeć techniki i zastosować je dla swoich dosowych stringów kończonych za pomocą znaku dolara.
    https://docs.google.com/open?id=0Bzkm-XARAFtnV0xDaHBaT3h3Y2M

Zwróć uwagę na funkcje ansiCmpx oraz unicodeCmpx porównują dwa łańcuchy znaków bez względu na wielkość liter.

P0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:4
0

No niestety taką treść zadania dostałem od prowadzącego, dzięki wielkie za odpowiedz zabieram sie do przeglądania link a.

codex
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:69
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)