Reading a number using INT 21h (DOS) & 8086 assmebly
Solution 1
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
Solution 2
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
xsari3x
Updated on March 13, 2020Comments
-
xsari3x about 4 years
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 :
INT 21h / AH=1 - read character from standard input, with echo, result is stored in AL. if there is no character in the keyboard buffer, the function waits until any key is pressed. example: mov ah, 1 int 21h
The main problem that this only reads one character and represent it as ASCII so If I need to write the number "357" I will read it as 3 , 5 , 7
and this is not my goal . any ideas ?