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