Переделать программу из .exe в .com - Assembler
Формулировка задачи:
Добрый день. Имеется код:
Код ищет слово real в строке и заменяет его на double, и в целом прекрасно работает. Вот только он компилируется в формате .exe, а нужен .com. С assembler у меня, к сожалению, отношения не сложились, поэтому надеюсь на вашу помощь.
Компилируется с помощью MASM32.
.186 .model small .data str1 db 'real' len1 equ $-str1 str2 db 'double' len2 equ $-str2 OK db 13, 10, 'novaya stroka: $' str_in db 100, ?, 152 dup (?) .stack 256 .code start: mov ax, @data mov ds, ax mov es, ax mov ax, 0a00h mov dx, offset str_in int 21h mov di, offset str_in+2 mov bl, str_in[1] xor bh, bh MOV str_in[bx+2], '$' mov cx, bx inc str_in[1] cld @@1: mov al, 'r' repne scasb jcxz write pusha dec di mov cx, len1 mov si, offset str1 repe cmpsb je @1 popa jmp short next @1: call change popa add di, len2-1 sub cx, 3 sub str_in[1], len1 add str_in[1], len2 next: jcxz write jmp short @@1 write: mov dx, offset OK mov ah, 9 int 21h mov dx, offset str_in+2 int 21h exit: xor ax, ax int 16h mov ax, 4c00h int 21h change proc pusha mov si, di push si mov ax, si sub ax, offset str_in+2 xor cx, cx mov cl, str_in[1] mov di, offset str_in+2 add di, cx dec di add di, len2-len1 sub cx, ax add si, cx dec si std rep movsb pop di sub di, len1 mov si, offset str2 mov cx, len2 cld rep movsb popa ret change endp end start
Решение задачи: «Переделать программу из .exe в .com»
textual
Листинг программы
.model tiny .186 .data str1 db 'real' len1 equ $-str1 str2 db 'double' len2 equ $-str2 OK db 13, 10, 'novaya stroka: $' str_in db 100, ?, 152 dup (?) .code ORG 100h start: push ds pop es mov ax, 0a00h mov dx, offset str_in int 21h mov di, offset str_in+2 mov bl, str_in[1] xor bh, bh MOV str_in[bx+2], '$' mov cx, bx inc str_in[1] cld @@1: mov al, 'r' repne scasb jcxz write pusha dec di mov cx, len1 mov si, offset str1 repe cmpsb je @1 popa jmp short next @1: call change popa add di, len2-1 sub cx, 3 sub str_in[1], len1 add str_in[1], len2 next: jcxz write jmp short @@1 write: mov dx, offset OK mov ah, 9 int 21h mov dx, offset str_in+2 int 21h exit: xor ax, ax int 16h mov ax, 4c00h int 21h change proc pusha mov si, di push si mov ax, si sub ax, offset str_in+2 xor cx, cx mov cl, str_in[1] mov di, offset str_in+2 add di, cx dec di add di, len2-len1 sub cx, ax add si, cx dec si std rep movsb pop di sub di, len1 mov si, offset str2 mov cx, len2 cld rep movsb popa ret change endp end start
Объяснение кода листинга программы
- В этом коде описывается секция данных:
str1
- содержит строкуreal
len1
- содержит длину строкиreal
str2
- содержит строкуdouble
len2
- содержит длину строкиdouble
OK
- содержит строкуnovaya stroka: $
str_in
- массив символов размером 100 байт, с начальным значением 0 в индексе 2 и 152 байтами неопределенных значений.
- В секции кода:
- Задается точка входа начала программы с помощью метки
start:
и устанавливается базовый адрес сегмента данных. - Происходит ввод строки от пользователя, сохранение ее в
str_in
и определение ее длины. - Далее происходит итеративный поиск и замена подстроки
real
наdouble
в строкеstr_in
. - После этого происходит вывод измененной строки на экран.
- Задается точка входа начала программы с помощью метки
- Наконец, объявляется процедура
change
, которая осуществляет замену подстрокиreal
наdouble
в строке и возвращает управление в основную программу. - Программа заканчивается меткой
end start
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д