Переделать программу из .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- содержит строкуreallen1- содержит длину строкиrealstr2- содержит строкуdoublelen2- содержит длину строкиdoubleOK- содержит строкуnovaya stroka: $str_in- массив символов размером 100 байт, с начальным значением 0 в индексе 2 и 152 байтами неопределенных значений.
- В секции кода:
- Задается точка входа начала программы с помощью метки
start:и устанавливается базовый адрес сегмента данных. - Происходит ввод строки от пользователя, сохранение ее в
str_inи определение ее длины. - Далее происходит итеративный поиск и замена подстроки
realнаdoubleв строкеstr_in. - После этого происходит вывод измененной строки на экран.
- Задается точка входа начала программы с помощью метки
- Наконец, объявляется процедура
change, которая осуществляет замену подстрокиrealнаdoubleв строке и возвращает управление в основную программу. - Программа заканчивается меткой
end start.