How to create an assembly program that will allow the user to enter somer characters and group the characters according to the following: alphabets, numbers, and special characters.


ASAP.

thanks.

How to create an assembly program that will allow the user to enter somer characters and group the characters according to the following: alphabets, numbers, and special characters.


ASAP.

thanks.

You want your free advice/pointers - ASAP.

Any particular processor?
Here's some fun code:

; CHRGRP.ASM : Compiled with A86 (http://eji.com/a86/)
; Do not use the Ampersand (&) (special char to separate commands in DOS.
; ------------------------------------------------------------------------
; This program will take bytes from the COMMAND-LINE & evaluate them for
; their TYPE (Numbers, Characters, Punctuation).
; ----------------------------- ;
; Print the title for Numbers	;
	mov ah, 09h		;
	mov dx, ttlNumbers	; NUMBERS header
	int 21h			; Write String
				;
	mov si, 0080h		; Address of the COUNT of command-line bytes
	mov cx, [si]		; Count of command-line bytes
	mov ch, 0h		; ...don't need/want this
	mov si, 0082h 		; put the address of chars in SI
chkNumLoop:
	mov bl, [si]		; move the current byte into BL
	call isANum		; check for NUM
	cmp bh, 1h		; if not a num...
	jne noPrintNum		; ...go to next char
printNum:			; else
	push si			; 
	mov si, printSpot	; put the byte in the STRING printing spot
	mov [si], bl		;
	mov ah, 09h		; ...
	mov dx, printSpot	; ...
	int 21h			; Print it
	pop si			;
noPrintNum:			;
	inc si			;
	loop chkNumLoop		; decrements CX when looping
				;
; ----------------------------- ;	
; Print the title for Chars	;
	mov ah, 09h		;
	mov dx, ttlChars	; CHARACTERS header
	int 21h			; Write String
				;
	mov si, 0080h		; Address of the COUNT of command-line bytes
	mov cx, [si]		; Count of command-line bytes
	mov ch, 0h		; ...don't need/want this
	mov si, 0082h 		; put the address of chars in SI
chkCharLoop:			;
	mov bl, [si]		; move the current byte into BL
	call isLowerChar	; check for Char
	cmp bh, 1h		; if not a char...
	je printChar		; 
	call isUpperChar	;
	cmp bh, 1h		;
	jne noPrintChar		;
printChar:			; else
	push si			;
	mov si, printSpot	; put the byte in the STRING printing spot
	mov [si], bl		;
	mov ah, 09h		; ...
	mov dx, printSpot	; ...
	int 21h			; Print it
	pop si			;
noPrintChar:			;
	inc si			;
	loop chkCharLoop	; decrements CX when looping
				;
; ----------------------------- ;	
; Print the title for Punct.	;
	mov ah, 09h		;
	mov dx, ttlPunctuation	; PUNCTUATION header
	int 21h			; Write String
				;
	mov si, 0080h		; Address of the COUNT of command-line bytes
	mov cx, [si]		; Count of command-line bytes
	mov ch, 0h		; ...don't need/want this
	mov si, 0082h 		; put the address of chars in SI
chkPunctLoop:			;
	mov bl, [si]		; move the current byte into BL
	call isLowerChar	; check for Char
	cmp bh, 1h		; if not a char...
	je  noPrintPunct	;
	call isUpperChar	; check for Upper char
	cmp bh, 1h		;
	je  noPrintPunct	;
	call isANum		; check for NUM
	cmp bh, 1h		; if not a num...
	je noPrintPunct		;
printPunct:			; All checks failed, it's PUNCT
	push si			;
	mov si, printSpot	; put the byte in the STRING printing spot
	mov [si], bl		;
	mov ah, 09h		; ...
	mov dx, printSpot	; ...
	int 21h			; Print it
	pop si			;
noPrintPunct:			;
	inc si			;
	loop chkPunctLoop	; decrements CX when looping
				;
	int 20h			; ********** DROP TO DOS *********
; ----------------------------- ;
isANum:				; Subroutine isANum();
	mov bh, 0h		;
	cmp bl, 30h		;
	jl  notANum		; Numbers are between 0x30 and 0x39
	cmp bl, 39h		;
	jg  notANum		;
	mov bh, 1h		; TRUE
notANum:; or done		;
	ret			;
; ----------------------------- ;
isUpperChar:			; Subroutine isUpperChar();
	mov bh, 0h		;
	cmp bl, 41h		;
	jl  notUpperChar	; Upper chars are between 0x41 and 0x5a
	cmp bl, 5ah		;
	jg  notUpperChar	;
	mov bh, 1h		; TRUE
notUpperChar:; or done
	ret			;
; ----------------------------- ;
isLowerChar:			; Subroutine isLowerChar();
	mov bh, 0h		;
	cmp bl, 61h		;
	jl  notLowerChar	; Lower chars are between 0x61 and 0x7a
	cmp bl, 7ah		;
	jg  notLowerChar	;
	mov bh, 1h		; TRUE
notLowerChar:; or done		;
	ret			;
				;
;--------------------[Print Spot]--------------------------------
printSpot: ; Transfer bytes here to print
	db 00, '$'		;
				;
;--------------------[HEADERS / TITLES]--------------------------
ttlChars:	db 0ah, 0dh, '[Characters]', 0ah, 0dh, 024h
ttlPunctuation:	db 0ah, 0dh, '[Punctuation]', 0ah, 0dh, 024h
ttlNumbers:	db 0ah, 0dh, '[Numbers]', 0ah, 0dh, 024h

; Results
;C:\science\asm>CHRGRP T5h4!i3-s2%I1^sNeat
;
;[Numbers]
;54321
;[Characters]
;ThisIsNeat
;[Punctuation]
;!-%

You can also change the character print sections to call one routine:

;so something like this:
printNum:			; else
	push si			; 
	mov si, printSpot	; put the byte in the STRING printing spot
	mov [si], bl		;
	mov ah, 09h		; ...
	mov dx, printSpot	; ...
	int 21h			; Print it
	pop si			;
noPrintNum:

; BECOMES:
printNum:			; else
	push si			; 
	call doPrint;		;
	pop si			;
noPrintNum:	

; AS A FORWARD REFERENCE TO:
doPrint:			; Subroutine doPrint
	mov si, printSpot	; put the byte in the STRING printing spot
	mov [si], bl		;
	mov ah, 09h		; ...
	mov dx, printSpot	; ...
	int 21h			; Print it
	ret			;

Sorry for multiple updates, but here is a bug-fix (for when there are no command-line parameters present) and an enhancement on the print routine.

; CHRGRP.ASM : Compiled with A86 (http://eji.com/a86/)
; Do not use the Ampersand (&) (special char to separate commands in DOS.
; ------------------------------------------------------------------------
; This program will take bytes from the command-line and evaluate them for
; their TYPE (Numbers, Characters, Punctuation).
; ----------------------------- ;
	mov si, 0080h		; Address of the COUNT of command-line bytes
	mov cx, [si]		; Count of command-line bytes
	xor ch, ch		; ...don't need/want this
	cmp cl, 0h		; If there are no command-line parameters
	je doUsage		; ...show usage message and exit.
				;
; Print the title for Numbers	;
	mov ah, 09h		;
	mov dx, ttlNumbers	; NUMBERS header
	int 21h			; Write String
				;
	mov si, 0082h 		; else put the address of chars in SI
chkNumLoop:
	mov bl, [si]		; move the current byte into BL
	call isANum		; check for NUM
	cmp bh, 1h		; if not a num...
	jne noPrintNum		; ...go to next char
printNum:			; else
	push si			; 
	call doPrint;		;
	pop si			;
noPrintNum:			;
	inc si			;
	loop chkNumLoop		; decrements CX when looping
				;
; ----------------------------- ;	
; Print the title for Chars	;
	mov ah, 09h		;
	mov dx, ttlChars	; CHARACTERS header
	int 21h			; Write String
				;
	mov si, 0080h		; Address of the COUNT of command-line bytes
	mov cx, [si]		; Count of command-line bytes
	xor ch, ch		; ...don't need/want this
	mov si, 0082h 		; put the address of chars in SI
chkCharLoop:			;
	mov bl, [si]		; move the current byte into BL
	call isLowerChar	; check for Char
	cmp bh, 1h		; if not a char...
	je printChar		; 
	call isUpperChar	;
	cmp bh, 1h		;
	jne noPrintChar		;
printChar:			; else
	push si			; 
	call doPrint;		;
	pop si			;
noPrintChar:			;
	inc si			;
	loop chkCharLoop	; decrements CX when looping
				;
; ----------------------------- ;	
; Print the title for Punct.	;
	mov ah, 09h		;
	mov dx, ttlPunctuation	; PUNCTUATION header
	int 21h			; Write String
				;
	mov si, 0080h		; Address of the COUNT of command-line bytes
	mov cx, [si]		; Count of command-line bytes
	xor ch, ch		; ...don't need/want this
	mov si, 0082h 		; put the address of chars in SI
chkPunctLoop:			;
	mov bl, [si]		; move the current byte into BL
	call isLowerChar	; check for Char
	cmp bh, 1h		; if not a char...
	je  noPrintPunct	;
	call isUpperChar	; check for Upper char
	cmp bh, 1h		;
	je  noPrintPunct	;
	call isANum		; check for NUM
	cmp bh, 1h		; if not a num...
	je noPrintPunct		;
printPunct:			; All checks failed, it's PUNCT
	push si			; 
	call doPrint;		;
	pop si			;
noPrintPunct:			;
	inc si			;
	loop chkPunctLoop	; decrements CX when looping
				; ***************************
	int 20h			; ******* DROP TO DOS *******
; ----------------------------- ; ***************************
doUsage:			;
	mov ah, 09h		;
	mov dx, ttlUsage	;
	int 21h			; Print Usage Message
				; ***************************
	int 20h			; ******* DROP TO DOS *******
; ----------------------------- ; ***************************
isANum:				; Subroutine isANum();
	xor bh, bh		;
	cmp bl, 30h		;
	jl  notANum		; Numbers are between 0x30 and 0x39
	cmp bl, 39h		;
	jg  notANum		;
	mov bh, 1h		; TRUE
notANum:; or done		;
	ret			;
; ----------------------------- ;
isUpperChar:			; Subroutine isUpperChar();
	xor bh, bh		;
	cmp bl, 41h		;
	jl  notUpperChar	; Upper chars are between 0x41 and 0x5a
	cmp bl, 5ah		;
	jg  notUpperChar	;
	mov bh, 1h		; TRUE
notUpperChar:; or done		;
	ret			;
; ----------------------------- ;
isLowerChar:			; Subroutine isLowerChar();
	xor bh, bh		;
	cmp bl, 61h		;
	jl  notLowerChar	; Lower chars are between 0x61 and 0x7a
	cmp bl, 7ah		;
	jg  notLowerChar	;
	mov bh, 1h		; TRUE
notLowerChar:; or done		;
	ret			;
; ----------------------------- ;
doPrint:			; Subroutine doPrint
	mov si, printSpot	; put the byte in the STRING printing spot
	mov [si], bl		;
	mov ah, 09h		; ...
	mov dx, printSpot	; ...
	int 21h			; Print it
	ret			;

;--------------------[Print Spot]--------------------------------
printSpot: ; Transfer bytes here to print
	db 00, '$'		;
				;
;--------------------[HEADERS / TITLES]--------------------------
ttlChars:	db 0ah, 0dh, '[Characters]', 0ah, 0dh, 024h
ttlPunctuation:	db 0ah, 0dh, '[Punctuation]', 0ah, 0dh, 024h
ttlNumbers:	db 0ah, 0dh, '[Numbers]', 0ah, 0dh, 024h
ttlUsage:	db 0ah, 0dh,
		db 'Usage:', 0ah, 0dh, 09h, 'CHRGRP {some data to evaluate}$'

; Results
;C:\science\asm>CHRGRP T5h4!i3-s2%I1^sNeat
;
;[Numbers]
;54321
;[Characters]
;ThisIsNeat
;[Punctuation]
;!-%
This article has been dead for over six months. Start a new discussion instead.