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

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

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

Программа работает, если ввести одно число, и оно потом выводит это число через процедуру. Помогите доработать ее так, чтобы принимала она строку, и выводила строку через процедуру.
.model tiny
.data
;-------segment_dannih----------
chislo1 db ?
chislo2 db ?
messageCondition1 db "Peredacha parametrov cherez pamyat'. "
messageCondition2 db "Tip proceduri - dalnii.",0ah,0dh,'$'
messageCondition3 db "Vvedite 2 16-bitovih celih chisla A i B.",0ah,0dh,'$'
messageChA db "Chislo A: ",'$'
messageChB db "Chislo B: ",'$'
messageLine db "--------------------------------------",0ah,0dh,'$'
messageResult db "Resultat",0ah,0dh,'$'
messageExit db "Press any key to exit...",0ah,0dh,'$'
messageEmpty db "",0ah,0dh,'$'
 
.code
org 100h
 
start:
mov ax,@data
mov ds,ax
xor ax,ax
 
mov ah,9
mov dx,offset messageCondition1
int 21h
 
mov ah,9
mov dx,offset messageLine
int 21h
 
mov ah,9
mov dx,offset messageCondition3
int 21h
 
;--------Вот тут она принимает число
mov ah,9
mov dx,offset messageChA
int 21h
 
mov ah,01h
int 21h
mov chislo1,al

mov ah,9
mov dx,offset messageEmpty
int 21h
 
mov ah,9
mov dx,offset messageChB
int 21h
mov ah,01h
int 21h
mov chislo2,al
 
mov ah,9
mov dx,offset messageEmpty
int 21h
 
mov ah,9
mov dx,offset messageLine
int 21h
 
mov ah,9
mov dx,offset messageResult
int 21h
 
call near ptr proc_21_2 ;kolichestvo visovov - (1)
 
mov ah,9
mov dx,offset messageEmpty
int 21h
 
;------exit-------------------
mov ah,9
mov dx,offset messageEmpty
int 21h
 
mov ah,9
mov dx,offset messageExit
int 21h
 
mov ah,0
int 16h
 
mov ax,4c00h
int 21h
 
;-------Procedura_2-----------
proc_21_2 proc near
 
;---------вот тут она выводит одно число
mov ah,02h
mov dl,chislo1
int 21h
 
mov ah,09h
mov dx,offset messageEmpty
int 21h
 
mov ah,02h
mov dl,chislo2
int 21h
 
mov ah,9
mov dx,offset messageEmpty
int 21h

ret
proc_21_2 endp
;-------end of procedure-----------
 
end start
Ну и что, никто не поможет? Вопрос двух секунд. Нужные разделы обозначены комментариями.

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

textual
Листинг программы
.model small
.stack 100h
.data
    buf db 255, ?, 255 dup('$')  
    msg1 db "Enter string: $"
    msg2 db "Result: $"   
    msgExit db "Press any key...$"
    endl db 13,10,'$'
.code
begin:
    mov     ax,     @data
    mov     ds,     ax
    mov     es,     ax
    
    lea     dx,     msg1
    mov     ah,     9
    int     21h  
    
    push    offset buf
    call    inp_str  
    
    lea     dx,     endl
    mov     ah,     9
    int     21h   
    lea     dx,     msg2
    int     21h
    
    push    offset buf
    call    output_str 
    
    lea     dx,     endl
    mov     ah,     9
    int     21h
    lea     dx,     msgExit
    int     21h
    
    mov     ah,     1
    int     21h      
             
    mov     ah,     4ch
    int     21h    
    
    inp_str proc near
        push    bp
        mov     bp,     sp     
        mov     dx,     bp+4
        mov     ah,     0Ah
        int     21h  
        pop     bp
    ret 2 
    
    output_str proc near
        push    bp
        mov     bp,     sp   
        mov     dx,     bp+4     
        add     dx,     2
        mov     ah,     9
        int     21h  
        pop     bp
    ret 2   
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
Похожие ответы