Доработать программу так, чтобы она работала со строками вместо чисел... - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д