Переделать .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. — Перед выходом из программы выводится сообщение о завершении работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д