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