I need to prompt to user a msg that tells him to write a number , then I store this number and do some operation on it After searching in INT 21h I found this :
When you managed to get the user input, put the its pointer in ESI (ESI = address to the string)
.DATA
myNumber BYTE "12345",0 ;for test purpose I declare a string '12345'
Main Proc
xor ebx,ebx ;EBX = 0
mov esi,offset myNumber ;ESI points to '12345'
loopme:
lodsb ;load the first byte pointed by ESI in al
cmp al,'0' ;check if it's an ascii number [0-9]
jb noascii ;not ascii, exit
cmp al,'9' ;check the if it's an ascii number [0-9]
ja noascii ;not ascii, exit
sub al,30h ;ascii '0' = 30h, ascii '1' = 31h ...etc.
cbw ;byte to word
cwd ;word to dword
push eax
mov eax,ebx ;EBX will contain '12345' in hexadecimal
mov ecx,10
mul ecx ;AX=AX*10
mov ebx,eax
pop eax
add ebx,eax
jmp loopme ;continue until ESI points to a non-ascii [0-9] character
noascii:
ret ;EBX = 0x00003039 = 12345
Main EndP
Once you've got the string you have to convert it to number. The problem is, you have to code your own procedure to do that. This is the one I usually use (written in C though):
int strToNum(char *s) {
int len = strlen(s), res = 0, mul = 0;
char *ptr = s + len;
while(ptr >= s)
res += (*ptr-- - '0') * (int)pow(10.0, mul++);
return res;
}
Here's the explanation. First of all, *ptr-- - '0'
gets the integer representation of a number (so that '9' - '0' = 9
, then it decremenst ptr
so that it points to the previous char. Once we know that number, we have to raise it to a power of 10. For example, suppose the input is '357', what the code does is:
('7' - '0' = 7) * 10 ^ 0 = 7 +
('5' - '0' = 5) * 10 ^ 1 = 50 +
('3' - '0' = 3) * 10 ^ 2 = 300 =
---------------------------------
357