среда, 23 ноября 2016 г.

Ассемблер чтение числа с консоли & вывод числа на консоль.

В ассемблере(DOS/TASM)  функция 01h 21 - ого прерывания читает только один символ за раз.
Чтобы перевести символ в число, надо отнять 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