Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small ; Обязательный модуль, который как бы является всей твоей программой
- .data ; Секция данных
- string db 'Hello world!',10,13,'$' ; Твоя исходная строка. Ввод с клавиатуры не получается :) 10,13 - переход на новую строку. $ - признак конца строки
- probel db ' ',10,13,'$' ; Строка, которая хранит в себе пробел и отвечает за переход на новую строку
- symbol_8 db ? ; Объявляем глобальные переменные, которые пока ничего не хранят в себе
- symbol_1 db ?
- symbol_3 db ?
- symbol_4 db ?
- symbol_5 db ?
- symbol_6 db ?
- .code ; Секция кода
- start: ; Метка входа
- push @data ; Обязательные строчки в твоей программе. Они в как бы освобождают память, или что-то такое)
- pop ds
- mov ah, 9h ; В TASM регистры играют огромную роль, и тут уже нет регистров eax, ebx и тп. Тут каждый регистр имеет своё собственное предназначение
- lea dx, string ; ah - особый регистр, который отвечает в TASM за так называемые прерывания (встроенные функции). В данном случае мы заносим в регистр функцию 9h
- int 21h ; которая в свою очередь выводит строку в консоль. Для этого, мы должны определить смещение этой строки (т.е. с какого символа начать печатать)
- ; В этом помогает втроенная функция lea, которая записывает в регистр dx строку string, и нулевое смещение. Если бы мы указали string+1, то печать
- ; Началась бы с первого символа, а не с нулевого.
- ; int 21h отвечает за активацию прерывания, т.е. регистра ah
- mov al,[string+8] ; Заносим в определённый регистр, который предназначен для работы со строками, значения кодов ASCII i-ых элементов строки string
- mov symbol_8,al ; Заносим значения кода из регистра в глобальные переменные
- mov al,[string+1]
- mov symbol_1,al
- mov al,[string+3]
- mov symbol_3,al
- mov al,[string+4]
- mov symbol_4,al
- mov al,[string+5]
- mov symbol_5,al
- mov al,symbol_1 ; Тут мы считаем суммы и разности ASCII кодов символов, и в конце концов заносим неизвестный символ в переменную symbol_6
- add al,symbol_5
- sub al,symbol_8
- mov symbol_6,al
- mov ah,9h ; 9h - вывод строки с пробелом
- mov dx, offset probel ; Эта строчка аналогична операции lea, которая указана выше, необходима для вывода строки
- int 21h
- mov ah,2h ; 2h - считывает ASCII код, преобразует его в символ по таблице, и выводит его в консоль
- mov si,0 ; si - регистр-счётчик. Тоже определённый. С ax или bx работать не будет
- mov cx,3 ; сx - регистр количества повторений цикла metka, тоже определённый. В данном случае - 3 повторения
- metka: ; Точка входа в цикл. Отсюда цикл будет начинаться после своего очередного завершения
- mov al,[string][si] ; Заносим в регистр al ASCII код si-того элемента строки string
- mov dl,al ; Перемещаем значение регистра al в dl, тк команды прерывания также берут значения из определённых регистров. 2h берёт значение из dl
- int 21h
- inc si ; Увеличиваем наш счётчик, то есть смещение, на 1.
- loop metka ; Конец цикла
- mov dl,symbol_4 ; Выводим символы, которые нам нужно было поменять местами, т.е. 3 и 4
- int 21h
- mov dl,symbol_3
- int 21h
- mov dl,symbol_5 ; Выводим 5й символ
- int 21h
- mov dl,symbol_6 ; Выводим наш неизвестный символ, который получился благодаря арифметичеким операциям между ASCII кодами
- int 21h
- mov ah,9h ; Печатаем все остальные символы, которые остались, начиная с 7го элемента, используя смещение
- lea dx,string+7
- int 21h
- mov ax,4C00h ; Прерывание - окончание программы.
- int 21h
- end start ; Конец сегмента кода.model small ;структура любой проги
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement