Переделать .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

Объяснение кода листинга программы

  1. Перевод числа в строку — Для перевода числа в строку используется алгоритм деления числа на 10 с последующим получением остатка (для получения цифры). — Используется цикл, пока число не станет равным нулю. — В цикле происходит обмен между регистрами AX и DX (для получения частного и остатка). — Остаток добавляется к строке. — После окончания цикла выводится полученная строка.
  2. Ввод строки с клавиатуры — Для ввода строки используется функция int 21h, которая вызывает функцию ввода символа с клавиатуры. — Функция используется дважды: для ввода строки и для ввода числа. — Для ввода строки используется буферная переменная strbuf, которая имеет размер 100 байт. — После ввода строки в strbuf, она сравнивается с числом (по сути, проверяется, является ли строка числом). — Если строка не является числом, происходит переход к следующей строке.
  3. Обработка строки — Для обработки строки используется цикл, который проходит по каждому символу строки. — Для каждого символа выполняется проверка на гласную букву. — Если символ является гласной буквой, выполняется перевод строки. — После обработки строки выводится результат.
  4. Организация выхода из программы — Для выхода из программы используется функция int 20h. — Перед выходом из программы выводится сообщение о завершении работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы