Переделать программу из .exe в .com - Assembler

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

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

Добрый день. Имеется код:
.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
Код ищет слово real в строке и заменяет его на double, и в целом прекрасно работает. Вот только он компилируется в формате .exe, а нужен .com. С assembler у меня, к сожалению, отношения не сложились, поэтому надеюсь на вашу помощь. Компилируется с помощью MASM32.

Решение задачи: «Переделать программу из .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

Объяснение кода листинга программы

  1. В этом коде описывается секция данных:
    • str1 - содержит строку real
    • len1 - содержит длину строки real
    • str2 - содержит строку double
    • len2 - содержит длину строки double
    • OK - содержит строку novaya stroka: $
    • str_in - массив символов размером 100 байт, с начальным значением 0 в индексе 2 и 152 байтами неопределенных значений.
  2. В секции кода:
    • Задается точка входа начала программы с помощью метки start: и устанавливается базовый адрес сегмента данных.
    • Происходит ввод строки от пользователя, сохранение ее в str_in и определение ее длины.
    • Далее происходит итеративный поиск и замена подстроки real на double в строке str_in.
    • После этого происходит вывод измененной строки на экран.
  3. Наконец, объявляется процедура change, которая осуществляет замену подстроки real на double в строке и возвращает управление в основную программу.
  4. Программа заканчивается меткой end start.

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

14   голосов , оценка 4.071 из 5
Похожие ответы