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