В ассемблере(DOS/TASM) функция 01h 21 - ого прерывания читает только один символ за раз.
Чтобы перевести символ в число, надо отнять 30h ( scan code = al - 30h).
Что делать если надо прочитать число где количество разрядов больше 1, например : 123. ?
Алгоритм преобразования следующий
1) Result = 0;
2) Result *= 10;
3) Result += C;
где C - целое число без знака.
Следующая процедура печатает число(без знака) из регистра AX на консоль.
(c) Барри Брэй
Чтобы перевести символ в число, надо отнять 30h ( scan code = al - 30h).
Что делать если надо прочитать число где количество разрядов больше 1, например : 123. ?
Алгоритм преобразования следующий
1) Result = 0;
2) Result *= 10;
3) Result += C;
где C - целое число без знака.
READ PROC
mov ax, 0 ; Загрузить 0 в регистра AX
mov xResult, ax ; Установить 0 в Результат.
mov cx, 1 ; Разряды в числе, то есть число не больше 1-9, если нужно 0..99, то надо 2...
@:
mov bx, 10 ;Основание системы 10-тичная
mov ah, 01h ; Функция чтения символа.
int 21h ; Вызов прерывания
cmp al, 13 ; Если это пробел?
je @ ; Повторяем чтение.
sub al, 30h ; Переводим символ в число.
mov ah, 0 ; Старшая часть числа установим в 0
push ax ; Сохранить
mov ax, xResult ; Загрузить результат в AX
mul bx ; Умножить AX на основание системы 10-тиричная
pop bx ; Загрузить в BX число полученное с клавиатуры.
add ax, bx ; Сложить с AX
mov xResult, ax ; Сохранить результат.
loop @
mov ax, xResult ; Сохранение результата в AX.
ret
ENDP
Следующая процедура печатает число(без знака) из регистра AX на консоль.
(c) Барри Брэй
OUTPUT PROC
push cx
push bx
push dx
mov cx,0
mov bx, 10
DISPX1:
mov dx, 0
div bx
push dx
inc cx
or ax,ax
jnz DISPX1
DISPX2:
pop dx
mov ah, 6
add dl, 30h
int 21h
loop DISPX2
pop dx
pop bx
pop cx
RET
ENDP
Комментариев нет:
Отправить комментарий