Переделать .com-файл в .exe-файл - Assembler
Формулировка задачи:
;TASM, COM-файл ;tasm.exe /m ;tlink.exe /t /x ; .model tiny .code .386 org 100h start: mov ah,9 lea dx,Vvedite int 21h mov ah,10 lea dx,strbuf mov si,dx int 21h inc si xor ax,ax xor cx,cx mov cl,[si] ;число символов в строке push cx inc si ;SI на первый введенный символ mov dx,si m1: lodsb ;читать первый символ push cx mov cl,strlen lea di,tab repne scasb ;гласная буква или все остальное jnz short m2 inc ah m2: pop cx loop m1 mov [num],ah std ; Устанавливаем ОБРАТНЫЙ порядок записи lea di,StringEnd-1 ; ES:DI = последний символ строки String xor ax,ax mov al,num ; Заносим в AX число для перевода ; Начинаем перевод числа AX в строку mov cx,10 ; Задаемся делителем CX = 10 Repeat: xor dx,dx ; Обнуляем DX (для деления) div cx ; Делим DX:AX на CX (10), ; Получаем в AX частное, в DX остаток xchg ax,dx ; Меняем их местами (нас интересует остаток) add al,'0' ; Получаем в AL символ десятичной цифры stosb ; И записываем ее в строку xchg ax,dx ; Восстанавливаем AX (частное) or ax,ax ; Сравниваем AX с 0 jne Repeat ; Если не ноль, то повторяем ; Теперь осталось вывести строку на экран mov ah,9 lea dx,[di+1] ; Заносим в DX адрес начала строки int 21h ; Выводим ее на экран int 20h ; Выходим из программы String db 5 dup (?),'$' ; Резервируем 5 байт для строки StringEnd = $-1 ; Указывает на символ '$' ret Vvedite db 13,10,'‚___ўҐ¤ЁвҐ бва®Єг: $',10,13 Tab db 'aeiouyAEIOUY' db 'аеёиоуыэюяАЕЁИОУЫЭЮЯ' db '*ҐЁ®глнопЂ…?Ћ“›ќћџ' strlen equ $-Tab num db ? strbuf db 100 end start
помогите пожалуйста
Решение задачи: «Переделать .com-файл в .exe-файл»
textual
Листинг программы
;TASM, COM-файл ;tasm.exe /m ;tlink.exe /t /x ;********** ;.model tiny .model small .code .386 ;********** ;org 100h ;********** start: mov ax,@data mov ds,ax mov es,ax mov ah,9 lea dx,Vvedite int 21h mov ah,10 lea dx,strbuf mov si,dx int 21h inc si xor ax,ax xor cx,cx mov cl,[si] ;число символов в строке push cx inc si ;SI на первый введенный символ mov dx,si m1: lodsb ;читать первый символ push cx mov cl,strlen lea di,tab repne scasb ;гласная буква или все остальное jnz short m2 inc ah m2: pop cx loop m1 mov [num],ah std ; Устанавливаем ОБРАТНЫЙ порядок записи lea di,StringEnd-1 ; ES:DI = последний символ строки String xor ax,ax mov al,num ; Заносим в AX число для перевода ; Начинаем перевод числа AX в строку mov cx,10 ; Задаемся делителем CX = 10 Repeat: xor dx,dx ; Обнуляем DX (для деления) div cx ; Делим DX:AX на CX (10), ; Получаем в AX частное, в DX остаток xchg ax,dx ; Меняем их местами (нас интересует остаток) add al,'0' ; Получаем в AL символ десятичной цифры stosb ; И записываем ее в строку xchg ax,dx ; Восстанавливаем AX (частное) or ax,ax ; Сравниваем AX с 0 jne Repeat ; Если не ноль, то повторяем ; Теперь осталось вывести строку на экран mov ah,9 lea dx,[di+1] ; Заносим в DX адрес начала строки int 21h ; Выводим ее на экран ;********** ; int 20h ; Выходим из программы mov ax,4c00h int 21h .data String db 5 dup (?),'$' ; Резервируем 5 байт для строки StringEnd = $-1 ; Указывает на символ '$' ret Vvedite db 13,10,'‚___ўҐ¤ЁвҐ бва®Єг: $',10,13 Tab db 'aeiouyAEIOUY' db 'аеёиоуыэюяАЕЁИОУЫЭЮЯ' db '*ҐЁ®глнопЂ…?Ћ“›ќћџ' strlen equ $-Tab num db ? strbuf db 100 ;********** .stack 100h end start
Объяснение кода листинга программы
- Перевод числа в строку — Для перевода числа в строку используется алгоритм деления числа на 10 с последующим получением остатка (для получения цифры). — Используется цикл, пока число не станет равным нулю. — В цикле происходит обмен между регистрами AX и DX (для получения частного и остатка). — Остаток добавляется к строке. — После окончания цикла выводится полученная строка.
- Ввод строки с клавиатуры — Для ввода строки используется функция int 21h, которая вызывает функцию ввода символа с клавиатуры. — Функция используется дважды: для ввода строки и для ввода числа. — Для ввода строки используется буферная переменная strbuf, которая имеет размер 100 байт. — После ввода строки в strbuf, она сравнивается с числом (по сути, проверяется, является ли строка числом). — Если строка не является числом, происходит переход к следующей строке.
- Обработка строки — Для обработки строки используется цикл, который проходит по каждому символу строки. — Для каждого символа выполняется проверка на гласную букву. — Если символ является гласной буквой, выполняется перевод строки. — После обработки строки выводится результат.
- Организация выхода из программы — Для выхода из программы используется функция int 20h. — Перед выходом из программы выводится сообщение о завершении работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д