Ввод и вывод в программе символа конца строки (доллара), 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.