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

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

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

Добрый день. Имеется код:
Листинг программы
  1. .186
  2. .model small
  3. .data
  4. str1 db 'real'
  5. len1 equ $-str1
  6. str2 db 'double'
  7. len2 equ $-str2
  8. OK db 13, 10, 'novaya stroka: $'
  9. str_in db 100, ?, 152 dup (?)
  10. .stack 256
  11. .code
  12. start:
  13. mov ax, @data
  14. mov ds, ax
  15. mov es, ax
  16. mov ax, 0a00h
  17. mov dx, offset str_in
  18. int 21h
  19. mov di, offset str_in+2
  20. mov bl, str_in[1]
  21. xor bh, bh
  22. MOV str_in[bx+2], '$'
  23. mov cx, bx
  24. inc str_in[1]
  25. cld
  26. @@1:
  27. mov al, 'r'
  28. repne scasb
  29. jcxz write
  30. pusha
  31. dec di
  32. mov cx, len1
  33. mov si, offset str1
  34. repe cmpsb
  35. je @1
  36. popa
  37. jmp short next
  38. @1:
  39. call change
  40. popa
  41. add di, len2-1
  42. sub cx, 3
  43. sub str_in[1], len1
  44. add str_in[1], len2
  45. next:
  46. jcxz write
  47. jmp short @@1
  48. write:
  49. mov dx, offset OK
  50. mov ah, 9
  51. int 21h
  52. mov dx, offset str_in+2
  53. int 21h
  54. exit:
  55. xor ax, ax
  56. int 16h
  57. mov ax, 4c00h
  58. int 21h
  59. change proc
  60. pusha
  61. mov si, di
  62. push si
  63. mov ax, si
  64. sub ax, offset str_in+2
  65. xor cx, cx
  66. mov cl, str_in[1]
  67. mov di, offset str_in+2
  68. add di, cx
  69. dec di
  70. add di, len2-len1
  71. sub cx, ax
  72. add si, cx
  73. dec si
  74. std
  75. rep movsb
  76. pop di
  77. sub di, len1
  78. mov si, offset str2
  79. mov cx, len2
  80. cld
  81. rep movsb
  82. popa
  83. ret
  84. change endp
  85. end start
Код ищет слово real в строке и заменяет его на double, и в целом прекрасно работает. Вот только он компилируется в формате .exe, а нужен .com. С assembler у меня, к сожалению, отношения не сложились, поэтому надеюсь на вашу помощь. Компилируется с помощью MASM32.

Решение задачи: «Переделать программу из .exe в .com»

textual
Листинг программы
  1. .model  tiny
  2. .186
  3. .data
  4.     str1 db 'real'
  5.     len1 equ $-str1
  6.     str2 db 'double'
  7.     len2 equ $-str2
  8.     OK db 13, 10, 'novaya stroka: $'
  9.     str_in db 100, ?, 152 dup (?)
  10. .code
  11.     ORG 100h
  12. start:
  13.     push    ds
  14.     pop es
  15.     mov ax, 0a00h
  16.     mov dx, offset str_in
  17.     int 21h
  18.     mov di, offset str_in+2
  19.     mov bl, str_in[1]
  20.     xor bh, bh
  21.     MOV str_in[bx+2], '$'
  22.     mov cx, bx
  23.     inc str_in[1]          
  24.    
  25.     cld
  26. @@1:
  27.     mov al, 'r'        
  28.     repne scasb
  29.     jcxz write          
  30.     pusha              
  31.     dec di          
  32.     mov cx, len1    
  33.     mov si, offset str1
  34.     repe cmpsb      
  35.     je @1          
  36.     popa                
  37.     jmp short next
  38. @1:
  39.     call change    
  40.     popa
  41.     add di, len2-1        
  42.     sub cx, 3              
  43.     sub str_in[1], len1    
  44.     add str_in[1], len2
  45. next:
  46.     jcxz write              
  47.     jmp short @@1
  48. write:  
  49.     mov dx, offset OK
  50.     mov ah, 9
  51.     int 21h
  52.     mov dx, offset str_in+2
  53.     int 21h
  54. exit:  
  55.     xor ax, ax
  56.     int 16h
  57.     mov ax, 4c00h
  58.     int 21h
  59.  
  60. change proc
  61.     pusha
  62.     mov si, di              
  63.     push si
  64.     mov ax, si
  65.     sub ax, offset str_in+2    
  66.     xor cx, cx
  67.     mov cl, str_in[1]
  68.     mov di, offset str_in+2
  69.     add di, cx
  70.     dec di
  71.     add di, len2-len1
  72.     sub cx, ax
  73.     add si, cx
  74.     dec si
  75.     std
  76.     rep movsb
  77.     pop di
  78.     sub di, len1
  79.     mov si, offset str2
  80.     mov cx, len2
  81.     cld
  82.     rep movsb
  83.     popa
  84.     ret
  85. change endp
  86. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы