Guest User

Untitled

a guest
Dec 9th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. sts segment stack 'stack'
  2. dw 128 dup(?)
  3. sts ends
  4.  
  5.  
  6. DSEG SEGMENT PARA PUBLIC "DATA"
  7. DSEG ENDS
  8.  
  9.  
  10. CSEG SEGMENT PARA PUBLIC "CODE"
  11. main proc far  
  12. assume CS:CSEG,SS:STS,DS:DSEG
  13. push    cs              ;Заполним DS
  14.     pop ds
  15.     mov ah,09h      ;Вывод приглашения на экран
  16.     mov dx,offset str1
  17.     int 21h
  18.     ;Распределение регистров:
  19.     ;di - накопленная часть числа
  20.     ;si - номер текущей позиции
  21.     ;bp=10 - делитель для процедур ввода и вывода
  22.     ;ax и dx - служебные регистры (буферы)
  23.     mov di,0        ;Пока ничего не введено, считаем что 0
  24.     mov si,0        ;Номер позиции в числе
  25.     mov bp,10       ;Потом будем умножать на 10
  26. r1: mov ah,08h     
  27.     int 21h     ;Читаем символ
  28.     cmp al,'0'      ;Если это служебный символ -> r3
  29.     jb  r3
  30.     cmp al,'9'      ;Если это не цифра -> r1
  31.     ja  r1
  32.     mov bl,al       ;Сохраним символ в bl
  33.     mov ax,di
  34.     mul bp      ;Умножаем на 10
  35.     cmp dx,0
  36.     mov dl,bl
  37.     sub dl,'0'      ;Преобразуем символ в цифру
  38.     mov dh,0        ;DX - цифра
  39.     add dx,ax
  40.     jc  r1           ;Если перенос -> переполнение
  41.     inc si
  42.     mov di,dx          
  43.     mov dl,bl
  44.     mov ah,02h
  45.     int 21h
  46.     jmp r1
  47. r3: cmp si,0
  48.     je  r1
  49.     cmp al,13
  50.     je  enter2      ;Нажали ввод
  51.     cmp al,8        ;Нажали забой
  52.     jne r1
  53. zab:    dec si
  54.     mov ax,di
  55.     mov dx,0
  56.     div bp
  57.     mov di,ax
  58.     mov dl,8
  59.     mov ah,2
  60.     int 21h
  61.     mov dl,32
  62.     int 21h
  63.     mov dl,8
  64.     int 21h
  65.     jmp r1
  66. enter2: mov ah,2h
  67.     mov dl,13
  68.     int 21h
  69.     mov dl,10
  70.     int 21h
  71.     mov ax,di
  72.     ;Процедура вывода числа
  73.     push    ax
  74.     mov dx,offset str2
  75.     mov ah,09h
  76.     int 21h
  77.     pop ax
  78.     push    -1  ;Сохраним признак конца числа
  79. l:  mov dx,0    ;Очистим регистр dx (xor dx,dx - оптимальнее)
  80.     div bp  ;Делим
  81.     push    dx  ;Сохраним цифру
  82.     cmp ax,0    ;Остался 0? (оптимальнее or ax,ax)
  83.     jne l   ;нет -> продолжим
  84.     mov ah,2h
  85. l2: pop dx  ;Восстановим цифру
  86.     cmp dx,-1   ;Дошли до конца -> выход {оптимальнее: or dx,dx jl ex}
  87.     je  ex
  88.     add dl,'0'  ;Преобразуем число в цифру
  89.     int 21h ;Выведем цифру на экран
  90.     jmp l2  ;И продолжим
  91. ex:     mov ah,02h  ;Перейдм на новую строчку
  92.     mov dl,13
  93.     int 21h
  94.     mov dl,10
  95.     int 21h
  96.                mov  ax,4c00h
  97.                
  98. str1    db  'The program that output decimal numbers ',10,13
  99.     db  'Please enter the number: $'
  100. str2    db  'Your number: $'
  101.  
  102.    
  103. MAIN ENDP
  104. CSEG ENDS
  105. END MAIN
Add Comment
Please, Sign In to add comment