Advertisement
Glebyshka

4.1 Assembler

Mar 8th, 2021
1,166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2.  
  3. printOtvet macro s:req                                ; Создаём макрос - что-то вроде процедуры в делфи, где s - строка, передаваемое значение
  4. mov ah, 9h                                            ; Тело процедуры
  5. mov dx, offset s
  6. int 21h
  7. mov ah,2h                                             ; Меняем содержание регистра прерывания. 2h - вывод символа по его ASCII коду
  8. endm                                                  ; Конец тела процедуры
  9.  
  10.  
  11. .data
  12.  
  13. probel db '',10,13,'$'
  14. otvet db 'Symbol was printed',10,13,'$'
  15. wrong db 'Symbol wasnt printed',10,13,'$'
  16.  
  17. .code
  18. start:
  19.  
  20.     push @data
  21.     pop ds
  22.    
  23.     mov ah,1h                 ; Вводим символ с клавиатуры. В данном случае, код нашего введенного символа будет лежать в al, так как прерывание 1h записывает его именно туда
  24.     int 21h
  25.    
  26.    
  27.     mov ah,9h                 ; Выводим строку - пробел
  28.     mov dx,offset probel
  29.     int 21h
  30.    
  31.    
  32.     cmp al,32                    ; Сравниваем с пробелом. CMP - сравнивает два значения кодов символов
  33.     jne SkipProbel               ; Расшифровывается как jump not equal. Если значения кодов не равны, переходит к метке SkipProbel. Если значения равны, то jne игнорируется
  34.     printOtvet otvet             ; Запускаем макрос по выводу строки
  35.     int 21h
  36.     jmp Finish                   ; Безусловный переход по метке Finish
  37.    
  38.     SkipProbel:
  39.    
  40.     cmp al,33                    ; Сравниваем с восклицательным знаком
  41.     jne SkipVoskl
  42.     printOtvet otvet
  43.     mov dl,al
  44.     int 21h
  45.     jmp Finish
  46.    
  47.     SkipVoskl:
  48.    
  49.     cmp al,34                     ; Сравниваем с двойными кавычками
  50.     jne SkipDoubleKavichki
  51.     printOtvet otvet
  52.     mov dl,al
  53.     int 21h
  54.     jmp Finish
  55.    
  56.     SkipDoubleKavichki:
  57.    
  58.     cmp al,35                    ; Сравниваем с решёткой
  59.     jne SkipReshetka
  60.     printOtvet otvet
  61.     mov dl,al
  62.     int 21h
  63.     jmp Finish
  64.    
  65.     SkipReshetka:
  66.    
  67.     cmp al,36                    ; Сравниваем с долларом
  68.     jne SkipDollar
  69.     printOtvet otvet
  70.     mov dl,al
  71.     int 21h
  72.     jmp Finish
  73.    
  74.     SkipDollar:
  75.    
  76.     cmp al,37                      ; Сравниваем с процентом
  77.     jne SkipProcent
  78.     printOtvet otvet
  79.     mov dl,al
  80.     int 21h
  81.     jmp Finish
  82.    
  83.     SkipProcent:
  84.    
  85.     cmp al,38                      ; Сравниваем со знаком ИЛИ
  86.     jne SkipObiedinenie
  87.     printOtvet otvet
  88.     mov dl,al
  89.     int 21h
  90.     jmp Finish
  91.    
  92.     SkipObiedinenie:
  93.    
  94.     mov ah,9h                     ; Выводим сообщение о том, что символ не был напечатан
  95.     mov dx, offset wrong
  96.     int 21h
  97.    
  98.    
  99.    
  100.    
  101.     Finish:
  102.     mov ax, 4c00h
  103.     int 21h
  104.  
  105. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement