Advertisement
Glebyshka

4.2 Assembler

Mar 9th, 2021
1,140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small
  2.  
  3. .data                                               ; Программа меняет маленькие и большие буквы на одни большие
  4. string1 db 'Unchanged string:',10,13,'$'
  5. string2 db 'New string:',10,13,'$'          
  6. string db 'HELLowoRldazAZ',10,13,'$'                ; Программа работает со строкой, которую мы заранее указали, при этом, в переменную symbol записали кол-во элементов в нашей строке
  7. symbol db 14                                        
  8. probel db '',10,13,'$'
  9.  
  10. .code
  11. start:
  12.  
  13.     push @data
  14.     pop ds
  15.    
  16.    
  17.     mov ah, 9h                                  ; Вывод строк
  18.     lea dx, string1                  
  19.     int 21h
  20.  
  21.    
  22.     mov ah, 9h                          
  23.     lea dx, string                  
  24.     int 21h
  25.    
  26.     mov ah,9h                    
  27.     mov dx, offset probel        
  28.     int 21h
  29.    
  30.     mov ah,9h                    
  31.     mov dx, offset string2        
  32.     int 21h
  33.    
  34.    
  35.    
  36.    
  37.     mov ah,2h                         ; В регистр 2h - вывод символа по его ASCII коду
  38.     mov si,0                          ; si - регистр - счётчик. В программе играет роль какого-то элемента строки. В данном случае нулевого
  39.     again:                            ; Метка, которая предназначена для прогона всей строки и проверке символов на прописные и заглавные
  40.     cmp symbol,0                      ; Сравниваем наше оставшееся кол-во символов. Если кол-во (symbol) = 0, то jne игнорируется. Jump not equal
  41.     jne Next                          ; Если symbol не равен 0, то то осуществляется переход по метке Next
  42.     jmp Konec                         ; Если symbol = 0, то это означает, что мы прошлись по всей строке, и программу можно завершать. Переход по метке Konec в конец программы
  43.     Next:                             ; Просто метка :)
  44.     sub symbol,1                      ; Уменьшаем кол-во проверенных символов на 1
  45.     mov al,[string][si]               ; Заносим в регистр al, который работает только со строками и значениями ASCII кодов символов, код si-го элемента из строки string
  46.     mov cx,32                         ; По таблице ASCII, нам нужно проверить диапазон чисел от 90 до 122 (от символа Z до z). Разность кодов этих символов = 122 - 90 = 32. cx - кол-во повторений цикла Begin
  47.     Begin:                            ; Начало цикла Begin
  48.     cmp al,122                        ; Начинаем наше сравнение символов, сравниваем коды si-го элемента нашей строки с кодом максимально возможного элемента, а именно z
  49.     jne skip                          ; Если значения не равны, то переход по метке skip
  50.     mov al,[string][si]               ; Если в ходе цикла условие al = 122 выполнилось, значит мы имеем дело с маленькой буквой. Заносим в al изначальное значение ASCII кода si-го элемента строки string
  51.     sub al,32                         ; Уменьшаем его код на 32, то есть меняем букву с маленькой на большую, и выводим её на экран через регистр dl (2h работает только с dl)
  52.     mov dl,al
  53.     int 21h
  54.     add si,1                          ; Берём следующий элемент со строки и проводим с ним такие же манипуляции, происходит переход по метке again
  55.     jmp again
  56.    
  57.    
  58.     skip:                             ; Значения не равны. Увеличиваем значение ASCII кода символа, уменьшаем кол-во проходов по циклу на 1 и повторяем цикл Begin по новой, пока cx не станет = 0
  59.     add al,1
  60.     sub cx,1
  61.     jnz Begin                         ; Конец тела цикла. Начинается по новой (С Begin)(Если cx > 0)
  62.                                       ; Если cx = 0, то происходит выход из цикла. Значит наша буква - большая. Её мы должны просто вывести. Ниже показана операция вывода, и увеличения si на 1
  63.     mov al,[string][si]
  64.     mov dl,al
  65.     int 21h
  66.     add si,1
  67.     jmp again                         ; Переход к метке again
  68.    
  69.    
  70.    
  71.    
  72.    
  73.    
  74.    
  75.     Konec:                            ; Метка - конец программы
  76.    
  77.     mov ax, 4c00h
  78.     int 21h
  79.  
  80. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement