UMBC CMSC 211 |
CSEE | |
char CharStr[80];
MAXCHAR | EQU | 80 | ; seems a reasonable size |
; But must fit into a unsigned byte ; (255 max) | |||
GetBuf | DB | MAXCHAR | ; Maximum allowed characters |
GetCnt | DB | ? | ; The operating system will tell us how ; many there really were |
CharStr | DB | MAXCHAR DUP (?) | ; Put it here |
The value stored in GetCnt will be MAXCHAR - 1, because the last position will be the carriage return!
Suppose I type in "Gary is wonderful!", I will have in memory:
GetBuf: | GetCnt: | CharSTr:: | ||||||||||||||||||||
80 | 18 | 'G' | 'a' | 'r' | 'y' | ' ' | 'i' | 's' | ' ' | 'w' | 'o' | 'n' | 'd' | 'e' | 'r' | 'f' | 'u' | 'l' | '!' | 13 |
_getStr GetStruct
_putCh 10
Now, let's have fun and print that input out backwards.
.model small .stack 100h .data MAXBUF EQU 100 GetBuf db MAXBUF GetCnt db ? CharStr db MAXBUF DUP ( ? ) prompt db 'Please enter a string: ', 10, 13, '$' msg1 db 'Using the first method', 10, 13, '$' msg2 db 'Using the second method', 10, 13, '$' msg3 db 'Using the third method', 10, 13, '$' .code main PROC include pcmac.inc _begin _PutStr prompt ; Get the string once _GetStr GetBuf _PutCh 10 ; There are three ways to print out the characters in reverse ; order. ; ; First way!! ; _PutStr msg1 mov bl, GetCnt test bl, bl jz Done1 sub bh, bh Reverse1: _PutCh [CharStr -1 + bx] dec bx jnz Reverse1 Done1: _PutCh 10,13 ; ; Second way!! Question: Could this also be done with the cx register? ; _PutStr msg2 mov bl, GetCnt test bl, bl jz Done2 sub bh, bh mov di, OFFSET CharStr-1 Reverse2: _PutCh [bx + di] dec bx jnz Reverse2 Done2: _PutCh 10, 13 ; ; Third way ; _PutStr msg3 mov bl, GetCnt test bl, bl je Done3 sub bh, bh Reverse3: _PutCh [CharStr - 1 + bx] dec bx jne Reverse3 Done3: _PutCh 10, 13 _exit main ENDP END main
.model small .stack 100h .data HexDigit DB '0123456789ABCDEF' ; Mybyte DB 27h ; .code main PROC include pcmac.inc _begin mov bx, OFFSET HexDigit ; Point to the table mov al, mybyte ; mov cl, 4 ; shr al, cl ; do the high bits first xlat ; Get the ASCII value for this number _PutCh al ; mov al, mybyte ; and al, 0Fh ; do the low bits next xlat ; Get the ASCII value for this number _PutCh al ; _PutCh 10, 13 _exit main ENDP END main
Remember that this only works when everything is able to be reduced into a byte-sized values. Actually, there are ways to force other things into byte-sized value, when the value is an index into another array!