Assembler, zmenit vystup

Programovacie jazyky, rady, poradňa...
andrealovasova
Novice
Novice
Príspevky: 4
Registrovaný: 29 apr 2009, 16:52
Bydlisko: Košice

Assembler, zmenit vystup

Príspevok od používateľa andrealovasova »

Nevie niekto ako by som zmenila tento program...stale mi to vypisuje vysledok osmickovo...ale potrebujem aby to bolo sestnastkovo...neviete to niekto zmenit?

Kód: Vybrať všetko


.model small
.stack 100h

; -----------------------------------------------------------------------------------------------
; -----------------------------------------------------------------------------------------------
; ### data ###
 
.data 
str1		DB	"Zadaj retazec: ",'$'
str2		DB	"Pocet vyhovujucich slov je ",'$'
str3		DB	"(c) --= XXXXXXXXX =-- 2oo9",'$'
str4		DB	"Zadanie c.308 - Strojovo orientovane jazyky",'$'
buffer		DB	201 dup(200)

; -----------------------------------------------------------------------------------------------
; -----------------------------------------------------------------------------------------------
; ### code ###

.code

; -----------------------------------------------------------------------------------------------
; ### procedury ###


; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## getStr
; # - nacita retazec z klavesnice ukonceny znakom '\n' a ulozi ho do buffera
; -----------------

getStr		proc	near
		mov	ah,01h			; vstup z klavesnice
getLoop:	int	21h
		cmp	al,0dh			; testujeme koncovy znak (\n)
		je	getEnd			; ak bol, tak koniec nacitavania
		mov	[bx],al			; inak ulozime znak do buffera
		inc	bx			; BX nastavime na dalsi znak
		jmp	getLoop			; nacitaj dalsi znak
getEnd:		mov	byte ptr [bx],'$'	; CR skonvertujem na '$'
		ret
getStr		endp

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## putStr
; # - vypise retazec na ktory ukazuje BX a je ukonceny znakom '$'
; -----------------

putStr		proc	near
		mov	ah,2h			; zobraz znak
nextChar:	cmp	byte ptr [bx],'$'	; testujeme koncovy znak
		je	foundEnd		; ak bol, tak koniec
		mov	dl,[bx]			; inak ho vypiseme
		int	21h
		inc	bx			; BX nastavime na dalsi znak
		jmp	nextChar		; vypis dalsieho znaku
foundEnd:	ret 
putStr		endp

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## newLine
; # - vypise znak CR a LF (odriadkuje)
; -----------------

newLine		proc	near
		mov	ah,02h			; zobraz znak
		mov	dl,0dh			; CR
		int	21h
		mov	dl,0ah			; LF
		int	21h
		ret
newLine 	endp

; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ## testChar
; # - zisti ci je znak [bx] male/velke pismeno, obsluzi pocitadla znakov
; # CL = pocet malych pismen, CH = pocet velkych pismen
; -----------------

testChar	proc	near

	; +++++++++ rozoznavanie malych/velkych pismen +++++++++

		cmp	byte ptr [bx],'A'		; kontrolujeme velke pismeno - dolna hranica
		jl	Tend				; <'A' (nebude to pismeno)
		cmp	byte ptr [bx],'Z'		; kontrolujeme velke pismeno - horna hranica
		jle	Tinc1				; <='Z' (je to velke pismeno)

		cmp	byte ptr [bx],'a'		; kontrolujeme male pismeno - dolna hranica
		jl	Tend				; <'a' (nebude to male pismeno)
		cmp	byte ptr [bx],'z'		; kontrolujeme male pismeno - horna hranica
		jle	Tinc2				; <='z' (je to male pismeno)

		jmp	tend				; >'Z' (nieje to male pismeno)
	
	; +++++++++ pocitanie malych/velkych +++++++++

Tinc1:		inc	ch				; velke pismeno
		jmp	tend

Tinc2:		inc	cl				; male pismeno
		jmp	tend

Tend:		ret
testChar	endp


; -----------------------------------------------------------------------------------------------
; -----------------------------------------------------------------------------------------------
; ### source ###

start:
	mov	ax,@DATA
	mov	ds,ax

	mov	bx,offset str4			; nazov programu
	call	putStr
	call	newLine
	call	newLine


; +++++++++ vstup od pouzivatela +++++++++

	mov	bx,offset str1			; vyzva na zadanie retazca
	call	putStr
	mov	bx,offset buffer		; nacitame retazec do 'buffer'
	call	getStr
	call	newLine				; odriadkujem


; +++++++++ analyza zadanych udajov +++++++++

	mov	bx,offset buffer		; prvy znak
	mov	cx,0				; znulujeme pocitadla znakov
	mov	dx,0
	push	dx				; odlozime DX (pocitadlo vyhovujucich slov)

nextCh:	cmp	byte ptr [bx],'$'		; testujeme koncovy znak
	je	space				; ak bol, tak kontrola posledneho slova a koniec
	cmp	byte ptr [bx],' '		; testujeme medzeru = zaciatok/koniec slova
	je	space

	call	testChar

	inc	bx				; dalsi znak
	jmp	nextCh


; +++++++++ zaciatok/koniec slova +++++++++

space:	sub	cl,ch				; (pocet malych) - 2*(pocet velkych)
	sub	cl,ch				; ak vyhovuje, vysledok je 0 (CX=0)

	cmp	cl,0				; testujeme ci je spravny pocet malych/velkych
	jne	chWend				; ak nie, tak skok

	pop	dx				; obnovime pocitadlo spravnych slov
	inc	dx				; aktualne slovo vyhovovalo
	push	dx				; odlozime spat

chWend:	cmp	byte ptr [bx],'$'		; testujeme koncovy znak
	je	finish				; ak bol, tak konec analyzy slov

	mov	cx,0				; znulujeme pocitadlo znakov
	inc	bx				; dalsi znak
	jmp	nextCh


; +++++++++ vypisanie vysledku v osmickovej sustave +++++++++

finish:	mov	bx,offset str2			; vypis o vysledkoch
	call	putStr

	pop	dx				; obnovime DX (pocitadlo vyhovujucich slov)
	mov	dh,dl				; do DH odlozime pocitadlo (DL potrebujeme na vystup)

	rol	dl,2				; najvyssi rad
	and	dl,00000011b
	add	dl,30h				; prevedieme na ASCII kod
	int	21h

	mov	dl,dh				; stredny rad
	ror	dl,3
	and	dl,00000111b
	add	dl,30h				; prevedieme na ASCII kod
	int	21h

	mov	dl,dh				; najnizsi rad
	and	dl,00000111b
	add	dl,30h				; prevedieme na ASCII kod
	int	21h


; +++++++++ copyright a koniec programu +++++++++

	call	newLine
	call	newLine
	mov	bx,offset str3			; vypis copyrightu
	call	putStr

	mov	ax,4c00h			; ukoncenie programu (0=koniec bez chyby)
	int	21h

end	start

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

programator
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 18 apr 2005, 8:31
Bydlisko: Papua new Guinea
Kontaktovať používateľa:

Príspevok od používateľa programator »

Staci ak zoberies cislo a budes ho delit cislom 16 a vysledne cisla davat na zasobnik, samozrejme je potrebne pamatat si, kolko cisiel bolo na zasobnik vlozenych, pretoze inak to nemusi dopadnut dobre :)
Nasledne budes cisla zo zasobnika vyberat a pre cisla od 0 po 9 pripocitas ordinalnu hodnotu 0 (teda kde v ASCII tabulke zacina znak '0') a k cislam od 10 do 15 priradis znaky 'A' az 'F'...

Vysledok:

Kód: Vybrať všetko

xor cx, cx   
xor ax, ax   
; base
mov bl, 10h
; store count in ax 
mov al, count 

STORE:      
   ; al = ax div src, ah = ax mod src
   div bl   
   ; al = mod, ah = div
   xchg al, ah
      
   push ax   
   
   xchg al, ah          
    
   inc cx     
   xor ah, ah   
   ; if (al div 10) == 0 => jump to end
   cmp al, 00h    
jne STORE   
          
; dos function print char 
mov ah, 02h 

WRITE_NUM:  
   ; get char from stack and output it
   pop dx     

   cmp dl, 09h  
   ja ELSE_CHARS
      add dl, '0'  
      jmp END_OF_CHARS

   ELSE_CHARS:
      sub dl, 0ah
      add dl, 'A' 

   END_OF_CHARS: 

   int 21h

loop WRITE_NUM
Vstup:
ax = cislo, kt. pozadujeme zobrazit v hexa sustave
bl = zaklad sustavy
andrealovasova
Novice
Novice
Príspevky: 4
Registrovaný: 29 apr 2009, 16:52
Bydlisko: Košice

Príspevok od používateľa andrealovasova »

no ja neviem ci som blba, alebo to je tym ze som blondina :D ale mne to stale nejak nejde...neskusis mi to napisat cely program ako to ma byt? :(
picuge
Expert
Expert
Príspevky: 167
Registrovaný: 17 dec 2005, 20:38
Bydlisko: Bratislava/Martin

Príspevok od používateľa picuge »

Skus nahradit tu cast "vypisanie vysledku v osmickovej sustave" tymto:

Kód: Vybrať všetko

; +++++++++ vypisanie vysledku v hexadecimalnej sustave +++++++++

finish:   mov   bx,offset str2         ; vypis o vysledkoch
   call   putStr

   pop   dx            ; obnovime DX (pocitadlo vyhovujucich slov)
   mov   dh,dl            ; do DH odlozime pocitadlo (DL potrebujeme na vystup)

   mov   dl,dh            ; stredny rad
   ror   dl,4
   and   dl,00001111b
   add   dl,30h            ; prevedieme na ASCII kod
   cmp   dl,57						; porovna, ci je hodnota 10-15
   jng   skok
   add   dl,7h						; zmeni na A-E
skok:    int   21h

   mov   dl,dh            ; najnizsi rad
   and   dl,00001111b
   add   dl,30h            ; prevedieme na ASCII kod
   cmp   dl,57
   jng   skok2
   add   dl,7h
skok2:   int   21h
Napísať odpoveď