Переделать приложение из exe в com - Assembler

Узнай цену своей работы

Формулировка задачи:

Как переделать из ехе в сом. Подскажите пожалуйста.
 .MODEL    SMALL    .STACK    64
    .DATA
PROMPT    DB    'Input string', 0DH, 0AH, '$'
 
INPUTBUFER    LABEL    BYTE
MAXLEN    DB    79+1
LEN    DB    ?
STRIN    DB    79 DUP (?), ?, ?, ?
 
    .CODE
MAIN    PROC    FAR
    MOV    AX,@DATA    ;Инициализация
    MOV    DS,AX
 
    MOV    AH,09H    ;Вывод приглашения "Input string"
    LEA    DX,PROMPT
    INT    21H
 
    MOV    AH,0AH    ;Ввод строки
    LEA    DX,INPUTBUFER
    INT    21H
 
    MOV    AH,02H    ;Перевод строки на экране
    MOV    DL,0AH    ;   (после ввода функциией 0AH был выведен
    INT    21H    ;   только символ 0DH)
 
    CMP    LEN,0    ;Если была введена пустая строка, то выход
    JE    EXIT
            ;Преобразование строки:
    LEA    BX,STRIN    ;Загрузить в BX адрес первого символа
    CALL    LCASE PASCAL, BX    ;Преобразовать его к строчному
    INC    BX    ;Перейти к следующему символу
    MOV    CL,LEN    ;Инициализация цикла: Счётчик CX равен длина
    DEC    CL    ;   строки минус 2. Минус 2 потому как не
    DEC    CL    ;   преобразуется первый и последний.
CIRCLE1:    CALL    UCASE PASCAL, BX    ;Цикл: преобразовать текущий символ к заглавному
    INC    BX    ;и перейти к следующему
    LOOP    CIRCLE1    ;Повторить
    CALL    LCASE PASCAL, BX    ;Преобразовать текущий (последний) симв. к строчному.
 
    MOV    WORD PTR [BX+2], 240AH    ;В конце строки поставить символы перевода и конца строки
    MOV    AH,09H    ;Вывод строки (результата)
    LEA    DX,STRIN
    INT    21H
            ;Выход:
EXIT:    MOV    AH,07H    ;Ждать нажатия любой клавиши
    INT    21H
 
    MOV    AX,4C00H    ;Завершение работы программы
    INT    21H
MAIN    ENDP
 
    ;===Подпрограммы===
 
;Функция LCASE. Преобразует латинский символ в строчной.
;Функции передаётся 1 аргумент: слово, являющеесе адресом
;   (относительно DS) символа, который преобразуется. 
LCASE    PROC    NEAR
    PUSH    BP
    MOV    BP,SP
    PUSH    AX BX    ;Сохранить регистры
    MOV    BX,[BP+4]    ;Загрузить в BX первый аргумент (адрес символа)
    MOV    AL,[BX]    ;Загрузить в AL символ
    CMP    AL,41H    ;Если код символа меньше 41H
    JB    LDONOT
    CMP    AL,5AH    ;   или больше 5AH, то выход
    JA    LDONOT
    XOR    AL,00100000B    ;иначе: инвертировать 5-ый бит.
    MOV    [BX],AL    ;Загрузить преобразованный символ в адр. из 1-ого арг.
LDONOT:    POP    BX AX BP    ;Восстановить регистры
    RET        ;Выход
LCASE    ENDP
 
;Функция UCASE. Преобразует латинский символ в заглавный.
;Функции передаётся 1 аргумент: слово, являющеесе адресом
;   (относительно DS) символа, который преобразуется. 
UCASE    PROC    NEAR
    PUSH    BP
    MOV    BP,SP
    PUSH    AX BX    ;Сохранить регистры
    MOV    BX,[BP+4]    ;Загрузить в BX первый аргумент (адрес символа)
    MOV    AL,[BX]    ;Загрузить в AL символ
    CMP    AL,61H    ;Если код символа меньше 61H
    JB    UDONOT
    CMP    AL,7AH    ;   или больше 7AH, то выход
    JA    UDONOT
    XOR    AL,00100000B    ;иначе: инвертировать 5-ый бит.
    MOV    [BX],AL    ;Загрузить преобразованный символ в адр. из 1-ого арг.
UDONOT:    POP    BX AX BP    ;Восстановить регистры
    RET        ;Выход
UCASE    ENDP
 
    END    MAIN

Решение задачи: «Переделать приложение из exe в com»

textual
Листинг программы
;masm com
 .MODEL    tiny    
; .STACK    64
;    .DATA
 
    .CODE
    org 100h
MAIN    PROC    FAR
;    MOV    AX,@DATA    ;Инициализация
;    MOV    DS,AX
 
    MOV    AH,09H    ;Вывод приглашения "Input string"
    LEA    DX,PROMPT
    INT    21H
 
    MOV    AH,0AH    ;Ввод строки
    LEA    DX,INPUTBUFER
    INT    21H
 
    MOV    AH,02H    ;Перевод строки на экране
    MOV    DL,0AH    ;   (после ввода функциией 0AH был выведен
    INT    21H    ;   только символ 0DH)
 
    CMP    LEN,0    ;Если была введена пустая строка, то выход
    JE    EXIT
            ;Преобразование строки:
    LEA    BX,STRIN    ;Загрузить в BX адрес первого символа
    CALL    LCASE; PASCAL, BX    ;Преобразовать его к строчному
    INC    BX    ;Перейти к следующему символу
    MOV    CL,LEN    ;Инициализация цикла: Счётчик CX равен длина
    DEC    CL    ;   строки минус 2. Минус 2 потому как не
    DEC    CL    ;   преобразуется первый и последний.
CIRCLE1:    CALL    UCASE; PASCAL, BX    ;Цикл: преобразовать текущий символ к заглавному
    INC    BX    ;и перейти к следующему
    LOOP    CIRCLE1    ;Повторить
    CALL    LCASE ;PASCAL, BX    ;Преобразовать текущий (последний) симв. к строчному.
 
    MOV    WORD PTR [BX+2], 240AH    ;В конце строки поставить символы перевода и конца строки
    MOV    AH,09H    ;Вывод строки (результата)
    LEA    DX,STRIN
    INT    21H
            ;Выход:
EXIT:    MOV    AH,07H    ;Ждать нажатия любой клавиши
    INT    21H
 
    MOV    AX,4C00H    ;Завершение работы программы
    INT    21H
MAIN    ENDP
 
    ;===Подпрограммы===
 
;Функция LCASE. Преобразует латинский символ в строчной.
;Функции передаётся 1 аргумент: слово, являющеесе адресом
;   (относительно DS) символа, который преобразуется. 
LCASE    PROC    NEAR
;    PUSH    BP
;   MOV    BP,SP
    PUSH    AX 
    push    BX    ;Сохранить регистры
;    MOV    BX,[BP+4]    ;Загрузить в BX первый аргумент (адрес символа)
    MOV    AL,[BX]    ;Загрузить в AL символ
    CMP    AL,41H    ;Если код символа меньше 41H
    JB    LDONOT
    CMP    AL,5AH    ;   или больше 5AH, то выход
    JA    LDONOT
    XOR    AL,00100000B    ;иначе: инвертировать 5-ый бит.
    MOV    [BX],AL    ;Загрузить преобразованный символ в адр. из 1-ого арг.
LDONOT:    POP    BX 
    pop AX; BP    ;Восстановить регистры
    RET        ;Выход
LCASE    ENDP
 
;Функция UCASE. Преобразует латинский символ в заглавный.
;Функции передаётся 1 аргумент: слово, являющеесе адресом
;   (относительно DS) символа, который преобразуется. 
UCASE    PROC    NEAR
;    PUSH    BP
;    MOV    BP,SP
    PUSH    AX 
    push    BX    ;Сохранить регистры
;    MOV    BX,[BP+4]    ;Загрузить в BX первый аргумент (адрес символа)
    MOV    AL,[BX]    ;Загрузить в AL символ
    CMP    AL,61H    ;Если код символа меньше 61H
    JB    UDONOT
    CMP    AL,7AH    ;   или больше 7AH, то выход
    JA    UDONOT
    XOR    AL,00100000B    ;иначе: инвертировать 5-ый бит.
    MOV    [BX],AL    ;Загрузить преобразованный символ в адр. из 1-ого арг.
UDONOT:    POP    BX
    pop AX; BP    ;Восстановить регистры
    RET        ;Выход
UCASE    ENDP
 
PROMPT    DB    'Input string', 0DH, 0AH, '$'
 
INPUTBUFER    LABEL    BYTE
MAXLEN    DB    79+1
LEN    DB    ?
STRIN    DB    79 DUP (?), ?, ?, ?
 
    END    MAIN

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


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

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

12   голосов , оценка 3.917 из 5