Переделать .com-файл в .exe-файл - Assembler

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

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

Листинг программы
  1. ;TASM, COM-файл
  2. ;tasm.exe /m
  3. ;tlink.exe /t /x
  4. ;
  5. .model tiny
  6. .code
  7. .386
  8. org 100h
  9. start:
  10. mov ah,9
  11. lea dx,Vvedite
  12. int 21h
  13. mov ah,10
  14. lea dx,strbuf
  15. mov si,dx
  16. int 21h
  17. inc si
  18. xor ax,ax
  19. xor cx,cx
  20. mov cl,[si] ;число символов в строке
  21. push cx
  22. inc si ;SI на первый введенный символ
  23. mov dx,si
  24. m1:
  25. lodsb ;читать первый символ
  26. push cx
  27. mov cl,strlen
  28. lea di,tab
  29. repne scasb ;гласная буква или все остальное
  30. jnz short m2
  31. inc ah
  32. m2:
  33. pop cx
  34. loop m1
  35. mov [num],ah
  36. std ; Устанавливаем ОБРАТНЫЙ порядок записи
  37. lea di,StringEnd-1 ; ES:DI = последний символ строки String
  38. xor ax,ax
  39. mov al,num ; Заносим в AX число для перевода
  40. ; Начинаем перевод числа AX в строку
  41. mov cx,10 ; Задаемся делителем CX = 10
  42. Repeat:
  43. xor dx,dx ; Обнуляем DX (для деления)
  44. div cx ; Делим DX:AX на CX (10),
  45. ; Получаем в AX частное, в DX остаток
  46. xchg ax,dx ; Меняем их местами (нас интересует остаток)
  47. add al,'0' ; Получаем в AL символ десятичной цифры
  48. stosb ; И записываем ее в строку
  49. xchg ax,dx ; Восстанавливаем AX (частное)
  50. or ax,ax ; Сравниваем AX с 0
  51. jne Repeat ; Если не ноль, то повторяем
  52. ; Теперь осталось вывести строку на экран
  53. mov ah,9
  54. lea dx,[di+1] ; Заносим в DX адрес начала строки
  55. int 21h ; Выводим ее на экран
  56. int 20h ; Выходим из программы
  57. String db 5 dup (?),'$' ; Резервируем 5 байт для строки
  58. StringEnd = $-1 ; Указывает на символ '$'
  59. ret
  60. Vvedite db 13,10,'‚___ўҐ¤ЁвҐ бва®Єг: $',10,13
  61. Tab db 'aeiouyAEIOUY'
  62. db 'аеёиоуыэюяАЕЁИОУЫЭЮЯ'
  63. db '*ҐЁ®глнопЂ…?Ћ“›ќћџ'
  64. strlen equ $-Tab
  65. num db ?
  66. strbuf db 100
  67. end start
помогите пожалуйста

Решение задачи: «Переделать .com-файл в .exe-файл»

textual
Листинг программы
  1. ;TASM, COM-файл
  2. ;tasm.exe /m
  3. ;tlink.exe /t /x
  4. ;**********
  5. ;.model tiny
  6. .model small
  7. .code
  8. .386
  9. ;**********
  10. ;org 100h
  11. ;**********
  12. start:
  13. mov ax,@data
  14. mov ds,ax
  15. mov es,ax
  16.     mov ah,9
  17.     lea dx,Vvedite
  18.     int 21h
  19.  
  20.     mov ah,10
  21.     lea dx,strbuf
  22.     mov si,dx
  23.     int 21h
  24.  
  25.     inc si
  26.     xor ax,ax
  27.     xor cx,cx
  28.     mov cl,[si] ;число символов в строке
  29. push cx
  30.     inc si      ;SI на первый введенный символ
  31.     mov dx,si
  32. m1:
  33.     lodsb       ;читать первый символ
  34. push cx
  35.     mov cl,strlen
  36.     lea di,tab
  37.     repne scasb ;гласная буква или все остальное
  38.     jnz short m2
  39.  
  40.     inc ah
  41. m2:
  42. pop cx
  43.     loop m1
  44.  
  45.     mov [num],ah
  46.  
  47.         std                    ; Устанавливаем ОБРАТНЫЙ порядок записи
  48.         lea di,StringEnd-1 ; ES:DI = последний символ строки String
  49.  
  50.         xor ax,ax
  51.         mov al,num      ; Заносим в AX число для перевода
  52.  
  53. ; Начинаем перевод числа AX в строку
  54.         mov cx,10          ; Задаемся делителем CX = 10
  55. Repeat:
  56.         xor dx,dx          ; Обнуляем DX (для деления)
  57.         div cx             ; Делим DX:AX на CX (10),
  58.                                        ; Получаем в AX частное, в DX остаток
  59.         xchg    ax,dx          ; Меняем их местами (нас интересует остаток)
  60.         add al,'0'         ; Получаем в AL символ десятичной цифры
  61.         stosb                  ; И записываем ее в строку
  62.         xchg    ax,dx          ; Восстанавливаем AX (частное)
  63.         or  ax,ax          ; Сравниваем AX с 0
  64.         jne Repeat         ; Если не ноль, то повторяем
  65.  
  66. ; Теперь осталось вывести строку на экран
  67.         mov ah,9
  68.         lea dx,[di+1]      ; Заносим в DX адрес начала строки
  69.         int 21h            ; Выводим ее на экран
  70.  
  71. ;**********
  72. ;       int 20h            ; Выходим из программы
  73. mov ax,4c00h
  74. int 21h
  75. .data
  76. String      db  5 dup (?),'$'  ; Резервируем 5 байт для строки
  77. StringEnd   =   $-1            ; Указывает на символ '$'
  78.  
  79.     ret
  80.  
  81. Vvedite db 13,10,'‚___ўҐ¤ЁвҐ бва®Єг: $',10,13
  82. Tab db 'aeiouyAEIOUY'
  83.     db 'аеёиоуыэюяАЕЁИОУЫЭЮЯ'
  84.     db '*ҐЁ®глнопЂ…?Ћ“›ќћџ'
  85. strlen equ $-Tab
  86. num db ?
  87. strbuf  db 100
  88. ;**********
  89. .stack  100h
  90.  
  91. end start

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

  1. Перевод числа в строку — Для перевода числа в строку используется алгоритм деления числа на 10 с последующим получением остатка (для получения цифры). — Используется цикл, пока число не станет равным нулю. — В цикле происходит обмен между регистрами AX и DX (для получения частного и остатка). — Остаток добавляется к строке. — После окончания цикла выводится полученная строка.
  2. Ввод строки с клавиатуры — Для ввода строки используется функция int 21h, которая вызывает функцию ввода символа с клавиатуры. — Функция используется дважды: для ввода строки и для ввода числа. — Для ввода строки используется буферная переменная strbuf, которая имеет размер 100 байт. — После ввода строки в strbuf, она сравнивается с числом (по сути, проверяется, является ли строка числом). — Если строка не является числом, происходит переход к следующей строке.
  3. Обработка строки — Для обработки строки используется цикл, который проходит по каждому символу строки. — Для каждого символа выполняется проверка на гласную букву. — Если символ является гласной буквой, выполняется перевод строки. — После обработки строки выводится результат.
  4. Организация выхода из программы — Для выхода из программы используется функция int 20h. — Перед выходом из программы выводится сообщение о завершении работы программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

13   голосов , оценка 3.923 из 5

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

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

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