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

Program działa tylko dla Ciągów tej samej długości- Dlaczego?

Object Storage Arubacloud
0 głosów
306 wizyt
pytanie zadane 18 stycznia 2021 w Assembler przez Kamil147 Nowicjusz (150 p.)

Zadanie wyglądało następująco: Napisać program, który pobiera z wejścia dwa łańcuchy znakowe, a następnie sprawdza, czy sumy ich kodów ASCII są równe, wypisując na ekran stosowny komunikat.

Mój problem polega na tym że program poprawnie liczy sumę znaków ASCII z ciągu, ale gdy ciągi są różnej długości nie wiadomo dlaczego zawsze podaje że suma nie jest równa.

	org 100h     ;Przesuniecie

	xor si,si
	xor dx,dx
czysto:	
	cmp si,30
	je oczysz
	mov ah,2
	mov dl,10
	int 21h
	mov dl,13
	int 21h
	inc si
	jmp czysto

oczysz:
	
	mov ah,9
	mov dx,kom1
	int 21h

	mov ah,9
	mov dx,kom11	;komunikat poczatkowy o dzialaniu programu
	int 21h

	mov ah,9
	mov dx,kom12
	int 21h

jeszcze:
	call ent
	
	mov ah,9
	mov dx,kom2	;komentarz o podanie pierwszego ciagu
	int 21h

	call ent																																											
	
	call pobierz	;pobranie pierwszego ciagu

	call suma	;liczenie sumy kodow jego znakow ascii

	mov dx,[wynik]
	mov [wynik1],dx		;wrzucanie pierwszego wyniku do zmiennej 
				;drugi wynik zostanie w zmiennej z procedury
	call ent
	
	mov ah,9
	mov dx,kom3	;kompentrz o podanie drugiego ciagu
	int 21h
	call ent

	inc si
	call pobierz	;pobranie drugiego ciagu

	call suma	;liczenie drugiej sumy
	
	call ent
	

	call porownaj		;porownanie sum znakow ASCII z ciagow

	call powt		;zapetlenie

koniec:
	mov ax,4C00h	;Koniec Programu
	int 21h	

ilosc	db 	0
wynik	dw 	0
wynik1	dw	0

kom1	db	"       Program pobiera dwa lancuchy znakowe",10,13,36
kom11	db	"       i sprawdza czy suma numerow ASCII ciagow jest rowna",10,13,36
kom12	db	"       ENTER konczy dzialanie programu",10,13,36
kom2	db	"Podaj pierwszy ciag znakow (zakoncz ciag spacja):$"
kom3 	db	"Podaj drugi ciag znakow (zakoncz ciag spacja):$"																																																												
kom4	db	"       Suma kodow ASCII podanych ciagow jest rowna",10,13,36
kom5	db	"       Suma kodow ASCII podanych ciagow NIE jest rowna",10,13,36
kom6	db	"              Wynik sumy pierwszego ciagu:",36
kom7	db	"              Wynik sumy drugiego ciagu:",36
kom8	db	"Czy chcesz porownac kolejne ciagi? TAK-t  NIE-ENTER ",10,13,36
kom9	db	"Podales niewlasciwy symbol",10,13,36

ent:
	mov ah,2
	mov dl,10
	int 21h	
	mov dl,13
	int 21h
ret

pobierz:
	xor di,di
	xor ax,ax
	xor bx,bx
	xor cx,cx
	pop cx
	
		
petla1:
	mov ah,1
	int 21h
	
	cmp al,13
	je koniec	

	cmp al,32
	je  dalej
		
	push ax
	inc di
	jmp petla1
dalej:
	mov [ilosc],di
	push cx																																												
ret

suma:
	xor cx,cx
	xor dx,dx
	xor ax,ax
	xor di,di
	pop cx

	
	mov [wynik],dx
	

petla2:
	inc di	
	cmp di,[ilosc]
	jg dalej1

	pop dx
	add ax,dx
	jmp petla2	

dalej1:
	mov [wynik],ax
	push cx
ret

porownaj:
	xor ax,ax	
	xor bx,bx
	xor cx,cx
	pop cx
	
	
	mov ax,[wynik1]
	mov bx,[wynik]
		
		
	cmp ax,bx
	je tak
	jne nie

	

tak:
	mov ah,9
	mov dx,kom6
	int 21h

	mov ah,2
	mov dx,[wynik1]
	int 21h
	
	call ent
	
	mov ah,9
	mov dx,kom7
	int 21h
	
	mov ah,2
	mov dx,[wynik]
	int 21h
	
	call ent
	
	mov ah,9
	mov dx,kom4
	int 21h
	jmp po
nie:
	mov ah,9
	mov dx,kom6
	int 21h

	mov ah,2
	mov dx,[wynik1]
	int 21h
	
	call ent
	
	mov ah,9
	mov dx,kom7
	int 21h
	
	mov ah,2
	mov dx,[wynik]
	int 21h
	
	call ent

	mov ah,9
	mov dx,kom5
	int 21h
po:
	push cx
ret

powt:
	
	call ent

	mov ah,9
	mov dx,kom8
	int 21h
	
	mov ah,1
	int 21h
	
	cmp al,116
	je jeszcze
	
	cmp al,13
	je koniec
	
	call ent
	mov ah,9
	mov dx,kom9
	int 21h
	
	jmp powt
	
ret	
	

 

1 odpowiedź

0 głosów
odpowiedź 19 stycznia 2021 przez akasei Obywatel (1,620 p.)
wybrane 19 stycznia 2021 przez Kamil147
 
Najlepsza

Przeanalizuj ten prosty kod:

PS: podaj mi te dwa ciągi dla których zgłasza Ci nierówność

;===============================================================================
; Copyright (C) Andrzej Adamczyk (at https://blackdev.org/). All rights reserved.
; GPL-3.0 License
;===============================================================================

	xor	eax,	eax

	; pierwszy ciąg
	mov	ecx,	kom1_end - kom1
	mov	esi,	kom1

    ; pierwsza suma
	xor	ebx,	ebx

.first_loop:
	lodsb
	add	ebx,	eax
	loop	.first_loop

	; drugi ciąg
	mov	ecx,	kom8_end - kom8
	mov	esi,	kom8

    ; druga suma
	xor	edx,	edx

.second_loop:
	lodsb
	add	edx,	eax
	loop	.second_loop

	;-----------------------------------------------------------------------

	cmp	ebx,	edx
	jne	.diff

	; takie same sumy
	nop

    ; koniec obsługi ciągów
    jmp .end

.diff:
	; sumy różne

.end:
    ; koniec
    jmp $

kom1	db	"       Program pobiera dwa lancuchy znakowe",10,13,36
kom1_end:
kom8	db	"Czy chcesz porownac kolejne ciagi? TAK-t  NIE-ENTER ",10,13,36
kom8_end:

 

komentarz 19 stycznia 2021 przez Kamil147 Nowicjusz (150 p.)
Tamten program dawał zły wynik dla każdych ciągów różnej długości jak 222 KK , 22 d itp

Podobne pytania

+1 głos
2 odpowiedzi 294 wizyt
pytanie zadane 13 lipca 2020 w Assembler przez tonn204 Mądrala (7,440 p.)
0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 18 stycznia 2017 w Assembler przez Philip Bywalec (2,320 p.)
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 21 listopada 2016 w Assembler przez Philip Bywalec (2,320 p.)

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...