Advertisement
Glebyshka

Untitled

Mar 6th, 2021
1,170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model small                                          ; Обязательный модуль, который как бы является всей твоей программой
  2.  
  3.  
  4. .data                                                 ; Секция данных
  5.  
  6.  
  7.     string db 'Hello world!',10,13,'$'         ; Твоя исходная строка. Ввод с клавиатуры не получается :)  10,13 - переход на новую строку. $ - признак конца строки
  8.     probel db ' ',10,13,'$'                    ; Строка, которая хранит в себе пробел и отвечает за переход на новую строку
  9.    
  10.     symbol_8 db ?                              ; Объявляем глобальные переменные, которые пока ничего не хранят в себе
  11.     symbol_1 db ?
  12.     symbol_3 db ?
  13.     symbol_4 db ?
  14.     symbol_5 db ?
  15.    
  16.     symbol_6 db ?
  17.    
  18.  
  19. .code                                        ; Секция кода
  20. start:                                       ; Метка входа
  21.  
  22.     push @data                               ; Обязательные строчки в твоей программе. Они в как бы освобождают память, или что-то такое)
  23.     pop ds
  24.    
  25.  
  26.     mov ah, 9h                           ; В TASM регистры играют огромную роль, и тут уже нет регистров eax, ebx и тп. Тут каждый регистр имеет своё собственное предназначение
  27.        lea dx, string                   ; ah - особый регистр, который отвечает в TASM за так называемые прерывания (встроенные функции). В данном случае мы заносим в регистр функцию 9h
  28.        int 21h                          ; которая в свою очередь выводит строку в консоль. Для этого, мы должны определить смещение этой строки (т.е. с какого символа начать печатать)
  29.                                     ; В этом помогает втроенная функция lea, которая записывает в регистр dx строку string, и нулевое смещение. Если бы мы указали string+1, то печать
  30.                                     ; Началась бы с первого символа, а не с нулевого.
  31.                                     ; int 21h отвечает за активацию прерывания, т.е. регистра ah
  32.                                      
  33.  
  34.     mov al,[string+8]              ; Заносим в определённый регистр, который предназначен для работы со строками, значения кодов ASCII i-ых элементов строки string
  35.     mov symbol_8,al                ; Заносим значения кода из регистра в глобальные переменные
  36.    
  37.     mov al,[string+1]
  38.     mov symbol_1,al
  39.    
  40.     mov al,[string+3]
  41.     mov symbol_3,al
  42.    
  43.     mov al,[string+4]
  44.     mov symbol_4,al
  45.    
  46.     mov al,[string+5]
  47.     mov symbol_5,al
  48.    
  49.  
  50.     mov al,symbol_1              ; Тут мы считаем суммы и разности ASCII кодов символов, и в конце концов заносим неизвестный символ в переменную symbol_6
  51.     add al,symbol_5
  52.     sub al,symbol_8
  53.     mov symbol_6,al  
  54.    
  55.    
  56.    
  57.     mov ah,9h                    ; 9h - вывод строки с пробелом
  58.     mov dx, offset probel        ; Эта строчка аналогична операции lea, которая указана выше, необходима для вывода строки
  59.     int 21h
  60.    
  61.    
  62.     mov ah,2h                     ; 2h - считывает ASCII код, преобразует его в символ по таблице, и выводит его в консоль
  63.     mov si,0                      ; si - регистр-счётчик. Тоже определённый. С ax или bx работать не будет
  64.     mov cx,3                      ; сx - регистр количества повторений цикла metka, тоже определённый. В данном случае - 3 повторения
  65.     metka:                        ; Точка входа в цикл. Отсюда цикл будет начинаться после своего очередного завершения
  66.     mov al,[string][si]           ; Заносим в регистр al ASCII код si-того элемента строки string
  67.     mov dl,al                     ; Перемещаем значение регистра al в dl, тк команды прерывания также берут значения из определённых регистров. 2h берёт значение из dl
  68.     int 21h
  69.     inc si                        ; Увеличиваем наш счётчик, то есть смещение, на 1.
  70.     loop metka                    ; Конец цикла
  71.    
  72.    
  73.     mov dl,symbol_4               ; Выводим символы, которые нам нужно было поменять местами, т.е. 3 и 4
  74.     int 21h
  75.    
  76.     mov dl,symbol_3
  77.     int 21h
  78.    
  79.     mov dl,symbol_5              ; Выводим 5й символ
  80.     int 21h
  81.    
  82.     mov dl,symbol_6              ; Выводим наш неизвестный символ, который получился благодаря арифметичеким операциям между ASCII кодами
  83.     int 21h
  84.    
  85.     mov ah,9h                    ; Печатаем все остальные символы, которые остались, начиная с 7го элемента, используя смещение
  86.     lea dx,string+7
  87.     int 21h
  88.    
  89.    
  90.    
  91.     mov ax,4C00h                  ; Прерывание - окончание программы.
  92.     int 21h
  93.    
  94.    
  95.  
  96. end start                         ; Конец сегмента кода.model small ;структура любой проги
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement