Доработать программу так, чтобы она работала со строками вместо чисел... - 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
Объяснение кода листинга программы
- Создается сегмент данных:
- 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,'$' (значение символа новой строки)
- Объявление сегмента кода:
- начинается процедурой begin
- Инициализация сегментов данных:
- mov ax, @data (перемещение адреса сегмента данных в регистр ax)
- mov ds, ax (перемещение адреса сегмента данных в регистр ds)
- mov es, ax (копирование адреса сегмента данных в регистр es)
- Вывод сообщения
Enter string:
:- lea dx, msg1 (загрузка адреса msg1 в регистр dx)
- mov ah, 9 (загрузка 9 в регистр ah для вывода сообщения)
- int 21h (вызов прерывания для вывода сообщения)
- Ввод строки:
- push offset buf (помещение адреса buf в стек)
- call inp_str (вызов процедуры для ввода строки)
- Вывод символа новой строки:
- lea dx, endl (загрузка адреса endl в регистр dx)
- mov ah, 9 (загрузка 9 в регистр ah для вывода символа новой строки)
- int 21h (вызов прерывания для вывода символа новой строки)
- Вывод сообщения
Result:
:- lea dx, msg2 (загрузка адреса msg2 в регистр dx)
- int 21h (вызов прерывания для вывода сообщения)
- Вывод строки:
- push offset buf (помещение адреса buf в стек)
- call output_str (вызов процедуры для вывода строки)
- Вывод символа новой строки:
- lea dx, endl (загрузка адреса endl в регистр dx)
- mov ah, 9 (загрузка 9 в регистр ah для вывода символа новой строки)
- int 21h (вызов прерывания для вывода символа новой строки)
- Вывод сообщения
Press any key...
:- lea dx, msgExit (загрузка адреса msgExit в регистр dx)
- int 21h (вызов прерывания для вывода сообщения)
- Ожидание нажатия клавиши:
- mov ah, 1 (загрузка 1 в регистр ah для чтения клавиши)
- int 21h (вызов прерывания для ожидания нажатия клавиши)
- Завершение программы:
- mov ah, 4ch (загрузка 4ch в регистр ah для завершения работы программы)
- int 21h (вызов прерывания для завершения работы программы)
- Описание процедуры inp_str для ввода строки:
- сохранение адреса стекового фрейма
- загрузка адреса буфера для ввода строки
- загрузка 0Ah в регистр ah для ввода строки
- вызов прерывания 21h для ввода строки
- восстановление адреса стекового фрейма
- Описание процедуры output_str для вывода строки:
- сохранение адреса стекового фрейма
- загрузка адреса буфера для вывода строки
- добавление 2 к адресу для пропуска первых двух байт (содержащих длину строки)
- загрузка 9 в регистр ah для вывода строки
- вызов прерывания 21h для вывода строки
- восстановление адреса стекового фрейма
- Конец процедуры begin.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д