Ввод и вывод в программе символа конца строки (доллара), tasm - Assembler
Формулировка задачи:
Помогите пожалуйста отредактировать программу, чтобы она корректно работала при вводе и выводе символа доллара.
Условие программы следующее:
Вводится строка, вводится символ. Необходимо вывести все слова, содержащие этот символ.
Код:
Листинг программы
- .model small
- .286
- .stack 100h
- .386
- .data
- size_buf db 255
- size_real db 255
- string db 254 dup ('$')
- newstr db 254 dup ('$')
- src_pos dw 0
- dst_pos dw 0
- char db ?
- ent db 10, 13, '$'
- tmp dw ?
- message1 db "Input: $"
- message2 db "Output: $"
- .code
- ENTER_PR proc
- push dx
- push ax
- lea dx, ent;
- mov ah, 09h
- int 21h
- pop ax
- pop dx
- ret
- endp ENTER_PR
- start:
- mov ax, @data
- mov ds, ax
- mov es, ax
- ;Вывод приглашения сделать вывод
- ; xor dx,dx
- mov DX,offset message1
- mov ah, 09h
- int 21h
- call ENTER_PR
- ;настроиться на str и считать строку
- lea dx, size_buf
- mov ah, 0Ah; считать строчку
- int 21h
- call ENTER_PR
- ;символ
- mov ah,01h
- int 21h
- mov char,al
- call ENTER_PR
- lea bx,[string]
- push offset newstr
- pop [dst_pos]
- pass_space:
- cmp [bx], byte ptr '$' ;сравниваем на конец строки
- je final
- cmp [bx], byte ptr ' '
- jne save_start_addrs
- inc bx
- jmp pass_space
- save_start_addrs:
- mov [src_pos], bx ;в позицию загоняем начальный адрес строки
- seek_char:
- cmp [bx], byte ptr '$' ;сравниваем на конец строки
- je final
- cmp [bx], byte ptr ' '
- je pass_space
- mov al, [char]
- cmp [bx], al ;сравниваем с символом
- je count_chars
- inc bx
- jmp seek_char
- count_chars:
- mov bx, [src_pos]
- xor cx, cx
- cc_cycle:
- cmp [bx], byte ptr '$' ;сравниваем на конец строки
- je copy_chars
- cmp [bx], ' '
- je copy_chars
- inc cl
- inc bx
- jmp cc_cycle
- copy_chars:
- mov si, [src_pos]
- mov di, [dst_pos]
- inc cl
- rep movsb
- dec si
- mov bx, si
- ; mov [src_pos], si
- mov [dst_pos], di
- jmp pass_space
- final:
- mov [di-1], byte ptr '$'
- call ENTER_PR
- mov DX,offset message2
- mov ah, 09h
- int 21h
- call ENTER_PR
- mov DX,offset newstr
- mov ah, 09h
- int 21h
- call ENTER_PR
- mov ah,01h
- int 21h
- mov ah, 4Ch
- int 21h
- end start
Решение задачи: «Ввод и вывод в программе символа конца строки (доллара), tasm»
textual
Листинг программы
- cld
- mov si,offset string
- cmp ax,?
- org $-2
- @@next:
- int 29h
- lodsb
- or al,al
- jnz @@next
Объяснение кода листинга программы
- Команда
cld
устанавливает направление переходов в следующую строку. - Команда
mov si,offset string
задает начальный адрес строки в регистре SI. - Команда
cmp ax,?
сравнивает AX с неопределенным значением. - Команда
org $-2
выравнивает сегментный регистр на -2 байта. - Команда
int 29h
выполняет переход на следующий сегмент. - Команда
lodsb
загружает байт из памяти в AL. - Команда
or al,al
устанавливает значение AL равным 0. - Команда
jnz @@next
повторяет цикл, пока значение AL не станет равным 0. - Переменная
string
содержит строку символов. - Переменная
ax
содержит значение 0. - Переменная
si
содержит смещение строки. - Переменная
al
содержит байт, который будет проверен на равенство 0. - Переменная
offset
не используется в коде. - Переменная
next
не используется в коде. - Команда
int 29h
выполняет переход на следующий сегмент. - Команда
lodsb
загружает байт из памяти в AL. - Команда
or al,al
устанавливает значение AL равным 0. - Команда
jnz @@next
повторяет цикл, пока значение AL не станет равным 0. - Переменная
string
содержит строку символов. - Переменная
ax
содержит значение 0. - Переменная
si
содержит смещение строки. - Переменная
al
содержит байт, который будет проверен на равенство 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д