NASM - The Netwide Assembler
NASM Forum => Programming with NASM => Topic started by: flyhigh427 on July 20, 2011, 01:20:40 PM
-
hey yall
i cant seem to get this converting a string to go into the single digit ,,i mean instead of pick a number (1) (2) etc i have to use higher numbers like (71) (72) etc ..
is there a way to do this without converting it ?
thanks
[ORG 0x100]
mov ah, 9 ; Print "something"
mov dx, strchoose ;
int 0x21 ;
MainLoop:
mov ah, 9 ; Print "something"
mov dx, strinput ;
int 0x21 ;
mov ah, 0xA ; Input String
mov dx, buf ;
int 0x21 ;
call StrToDec ; This function Converts the input string into a number, AL=Result
cmp al, 71 ; Compare AL with the number you choose
je Lblwinxp
cmp al, 72
je Lbldos
cmp al, 73
je Lblrestore
cmp al, 74
je Lblreboot
jmp MainLoop
Lblwinxp:
mov ah, 9 ;
mov dx, strone ;
int 0x21 ;
jmp MainLoop ;
Lbldos:
mov ah, 9 ;
mov dx, strtwo ;
int 0x21 ;
jmp MainLoop ;
Lblrestore:
mov ah, 9 ;
mov dx, strthree ;
int 0x21 ;
jmp MainLoop ;
Lblreboot:
mov ah, 9
mov dx, strfour ;
int 0x21 ;
mov ax, 0x4C00 ; Terminate program
int 0x21 ;
strchoose db 10,13
db ' PLEASE CHOOSE ONE',10,13
db '(71)WINDOWS XP',10,13
db '(72)DOS',10,13
db '(73)RESTORE WINDOWS XP',10,13
db '(74)REBOOT $',10,13
strinput db 10,13,'TYPE THE NUMBER: $'
strone db 13,10,' 71 $'
strtwo db 13,10,' 72 $'
strthree db 13,10,' 73 $'
strfour db 13,10,' 74 $'
; The keyboard input buffer
buf:
max db 3
count db 0
inpdata db 0,0,0
; Convert the string inpdata to a number and store the result in AL
; Input parameters: None
; Return value: AL = Number
StrToDec:
mov dl, [inpdata] ; Get the first character and
sub dl, '0' ; convert it into a value
mov al, dl ; AL = 10 * value
mov bl, 10 ;
mul bl ;
mov dl, [inpdata+1] ; Get the second character and
sub dl, '0' ; convert it into a value
add al, dl ; AL = AL + value
retn
-
What are you actually trying to do, convert a string to a number, or select a "one key" menu item?
You've got the algorithm approximately correct to convert a string to a number, but you want to convert the number of characters actually entered, not unconditionally two.
If you just want to select a menu item, junk the "buffered input" routine, and use one of the "input one key" routines... int 21h/2, 21h/7, or 21h/8, IIRC, or int 16h/10h, and just compare.
If you want to keep the same code you've got, just check "count" before you attempt to convert the second character.
Best,
Frank
-
the answer was very simple ..dah put the number in '1' instead of 1
-
the answer was very simple ..dah put the number in '1' instead of 1
'1' is the equivalent of hexadecimal 0x31, in which is the ASCII [display] code for that particular number.
So yes, unless you plan on doing bin2ascii/ascii2bin conversions, handling direct ASCII codes in such a simplistic manner is sufficient, and probably most efficient.