Доработать программу так, чтобы она работала со строками вместо чисел... - Assembler

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

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

Программа работает, если ввести одно число, и оно потом выводит это число через процедуру. Помогите доработать ее так, чтобы принимала она строку, и выводила строку через процедуру.
Листинг программы
  1. .model tiny
  2. .data
  3. ;-------segment_dannih----------
  4. chislo1 db ?
  5. chislo2 db ?
  6. messageCondition1 db "Peredacha parametrov cherez pamyat'. "
  7. messageCondition2 db "Tip proceduri - dalnii.",0ah,0dh,'$'
  8. messageCondition3 db "Vvedite 2 16-bitovih celih chisla A i B.",0ah,0dh,'$'
  9. messageChA db "Chislo A: ",'$'
  10. messageChB db "Chislo B: ",'$'
  11. messageLine db "--------------------------------------",0ah,0dh,'$'
  12. messageResult db "Resultat",0ah,0dh,'$'
  13. messageExit db "Press any key to exit...",0ah,0dh,'$'
  14. messageEmpty db "",0ah,0dh,'$'
  15. .code
  16. org 100h
  17. start:
  18. mov ax,@data
  19. mov ds,ax
  20. xor ax,ax
  21. mov ah,9
  22. mov dx,offset messageCondition1
  23. int 21h
  24. mov ah,9
  25. mov dx,offset messageLine
  26. int 21h
  27. mov ah,9
  28. mov dx,offset messageCondition3
  29. int 21h
  30. ;--------Вот тут она принимает число
  31. mov ah,9
  32. mov dx,offset messageChA
  33. int 21h
  34. mov ah,01h
  35. int 21h
  36. mov chislo1,al
  37.  
  38. mov ah,9
  39. mov dx,offset messageEmpty
  40. int 21h
  41. mov ah,9
  42. mov dx,offset messageChB
  43. int 21h
  44. mov ah,01h
  45. int 21h
  46. mov chislo2,al
  47. mov ah,9
  48. mov dx,offset messageEmpty
  49. int 21h
  50. mov ah,9
  51. mov dx,offset messageLine
  52. int 21h
  53. mov ah,9
  54. mov dx,offset messageResult
  55. int 21h
  56. call near ptr proc_21_2 ;kolichestvo visovov - (1)
  57. mov ah,9
  58. mov dx,offset messageEmpty
  59. int 21h
  60. ;------exit-------------------
  61. mov ah,9
  62. mov dx,offset messageEmpty
  63. int 21h
  64. mov ah,9
  65. mov dx,offset messageExit
  66. int 21h
  67. mov ah,0
  68. int 16h
  69. mov ax,4c00h
  70. int 21h
  71. ;-------Procedura_2-----------
  72. proc_21_2 proc near
  73. ;---------вот тут она выводит одно число
  74. mov ah,02h
  75. mov dl,chislo1
  76. int 21h
  77. mov ah,09h
  78. mov dx,offset messageEmpty
  79. int 21h
  80. mov ah,02h
  81. mov dl,chislo2
  82. int 21h
  83. mov ah,9
  84. mov dx,offset messageEmpty
  85. int 21h
  86.  
  87. ret
  88. proc_21_2 endp
  89. ;-------end of procedure-----------
  90. end start
Ну и что, никто не поможет? Вопрос двух секунд. Нужные разделы обозначены комментариями.

Решение задачи: «Доработать программу так, чтобы она работала со строками вместо чисел...»

textual
Листинг программы
  1. .model small
  2. .stack 100h
  3. .data
  4.     buf db 255, ?, 255 dup('$')  
  5.     msg1 db "Enter string: $"
  6.     msg2 db "Result: $"  
  7.     msgExit db "Press any key...$"
  8.     endl db 13,10,'$'
  9. .code
  10. begin:
  11.     mov     ax,     @data
  12.     mov     ds,     ax
  13.     mov     es,     ax
  14.    
  15.     lea     dx,     msg1
  16.     mov     ah,     9
  17.     int     21h  
  18.    
  19.     push    offset buf
  20.     call    inp_str  
  21.    
  22.     lea     dx,     endl
  23.     mov     ah,     9
  24.     int     21h  
  25.     lea     dx,     msg2
  26.     int     21h
  27.    
  28.     push    offset buf
  29.     call    output_str
  30.    
  31.     lea     dx,     endl
  32.     mov     ah,     9
  33.     int     21h
  34.     lea     dx,     msgExit
  35.     int     21h
  36.    
  37.     mov     ah,     1
  38.     int     21h      
  39.              
  40.     mov     ah,     4ch
  41.     int     21h    
  42.    
  43.     inp_str proc near
  44.         push    bp
  45.         mov     bp,     sp    
  46.         mov     dx,     bp+4
  47.         mov     ah,     0Ah
  48.         int     21h  
  49.         pop     bp
  50.     ret 2
  51.    
  52.     output_str proc near
  53.         push    bp
  54.         mov     bp,     sp  
  55.         mov     dx,     bp+4    
  56.         add     dx,     2
  57.         mov     ah,     9
  58.         int     21h  
  59.         pop     bp
  60.     ret 2  
  61. end begin

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

  1. Создается сегмент данных:
    • buf db 255, ?, 255 dup('$')  (переменная для хранения введенной строки)
    • msg1 db Enter string: $ (сообщение Enter string:)
    • msg2 db Result: $ (сообщение Result:)
    • msgExit db Press any key...$ (сообщение Press any key...)
    • endl db 13,10,'$' (значение символа новой строки)
  2. Объявление сегмента кода:
    • начинается процедурой begin
  3. Инициализация сегментов данных:
    • mov ax, @data (перемещение адреса сегмента данных в регистр ax)
    • mov ds, ax (перемещение адреса сегмента данных в регистр ds)
    • mov es, ax (копирование адреса сегмента данных в регистр es)
  4. Вывод сообщения Enter string::
    • lea dx, msg1 (загрузка адреса msg1 в регистр dx)
    • mov ah, 9 (загрузка 9 в регистр ah для вывода сообщения)
    • int 21h (вызов прерывания для вывода сообщения)
  5. Ввод строки:
    • push offset buf (помещение адреса buf в стек)
    • call inp_str (вызов процедуры для ввода строки)
  6. Вывод символа новой строки:
    • lea dx, endl (загрузка адреса endl в регистр dx)
    • mov ah, 9 (загрузка 9 в регистр ah для вывода символа новой строки)
    • int 21h (вызов прерывания для вывода символа новой строки)
  7. Вывод сообщения Result::
    • lea dx, msg2 (загрузка адреса msg2 в регистр dx)
    • int 21h (вызов прерывания для вывода сообщения)
  8. Вывод строки:
    • push offset buf (помещение адреса buf в стек)
    • call output_str (вызов процедуры для вывода строки)
  9. Вывод символа новой строки:
    • lea dx, endl (загрузка адреса endl в регистр dx)
    • mov ah, 9 (загрузка 9 в регистр ah для вывода символа новой строки)
    • int 21h (вызов прерывания для вывода символа новой строки)
  10. Вывод сообщения Press any key...:
    • lea dx, msgExit (загрузка адреса msgExit в регистр dx)
    • int 21h (вызов прерывания для вывода сообщения)
  11. Ожидание нажатия клавиши:
    • mov ah, 1 (загрузка 1 в регистр ah для чтения клавиши)
    • int 21h (вызов прерывания для ожидания нажатия клавиши)
  12. Завершение программы:
    • mov ah, 4ch (загрузка 4ch в регистр ah для завершения работы программы)
    • int 21h (вызов прерывания для завершения работы программы)
  13. Описание процедуры inp_str для ввода строки:
    • сохранение адреса стекового фрейма
    • загрузка адреса буфера для ввода строки
    • загрузка 0Ah в регистр ah для ввода строки
    • вызов прерывания 21h для ввода строки
    • восстановление адреса стекового фрейма
  14. Описание процедуры output_str для вывода строки:
    • сохранение адреса стекового фрейма
    • загрузка адреса буфера для вывода строки
    • добавление 2 к адресу для пропуска первых двух байт (содержащих длину строки)
    • загрузка 9 в регистр ah для вывода строки
    • вызов прерывания 21h для вывода строки
    • восстановление адреса стекового фрейма
  15. Конец процедуры begin.

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


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

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

9   голосов , оценка 3.889 из 5

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

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

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