Посимвольный вывод - Assembler
Формулировка задачи:
Нужна помощь, не знаю как реализовать, при вводе конца строки($) в любой части предложения перестает считывать, т.е считывает только до знака конца строки а если поставить в начале $ то вообще ничего не выведет,как это обойти?
Вот весь код:
.model small .stack 100h .data s db 80, ?, 81 dup (?) r db 81 dup (?) ;Адрес строки результата m1 db 'vvedite:', 13, 10, '$' m2 db 13, 10, 13, 10, 'Result:', 13, 10, '$' m3 db 13, 10, 13, 10, 'nazhmite knopku ...$' .code Start: mov ax, @data mov ds, ax mov es, ax lea dx, m1 mov ah, 09 int 21h lea dx, s mov ah, 0ah int 21h lea si, s+2 ; т.к с 3 байта начинаются символы lea di, r xor ch, ch mov cl, s+1 ; Помещаем длину введеной строки call SetMinWord lea dx, m2 mov ah, 09 int 21h lea dx, r mov ah, 09 int 21h lea dx, m3 mov ah, 09 int 21h mov ah, 08 int 21h mov ax, 4c00h int 21h ;------------------------------------------------------------------ ; Подпрограмма поиска слова наименьшей длины и ; укорачивания всех остальных ; Адреса: ; si-адрес начала исходной строки ; di-адрес начала строки-результата ; ; SetMinWord proc mov ah, cl ; ah - начальная длина строки jcxz EXIT cld push cx push si push di mov di, si mov al, 32 PERVAYA: repnz scasb pushf mov bx, di ; вычисляем длину слова jne TRETYA dec bx TRETYA: sub bx, si cmp bl, ah ; сравниваем длину строки и минимальное слово jnc CHETVERTAYA mov ah, bl CHETVERTAYA: mov si, di popf je PERVAYA pop di pop si pop cx VTORAYA: push cx mov cl, ah rep movsb pop cx sub cl, ah jz EXIT xchg si, di ; обмен si и di (т.к. для поиска исполуется es:di) repnz scasb xchg si, di jnz EXIT ;пробела нету stosb ; иначе записываем пробел в строку результата jmp VTORAYA ; переход к адресу smB2 для копирования след. слова EXIT: mov byte ptr [di], '$' ret endp end Start
Решение задачи: «Посимвольный вывод»
textual
Листинг программы
mov cx,s+1 lea si,r @1: lodsb int 29h loop @1
Объяснение кода листинга программы
- mov cx,s+1 - переменной 'cx' присваивается значение переменной 's' с добавлением единицы.
- lea si,r - переменная 'si' получает адрес переменной 'r'.
- lodsb - в регистр 'al' загружается байт из памяти по адресу, на который указывает переменная 'si', и знаковый бит устанавливается в единицу.
- int 29h - выполняется interrupt 29h, который используется для вывода символа на экран.
- loop @1 - цикл, который повторяется до тех пор, пока не будет выполнено условие, указанное в инструкции после символа ':'. В данном случае цикл будет повторяться до тех пор, пока не будет выведено все символы из памяти, начиная с адреса, на который указывает переменная 'r'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д