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

Объяснение кода листинга программы

  1. Команда cld устанавливает направление переходов в следующую строку.
  2. Команда mov si,offset string задает начальный адрес строки в регистре SI.
  3. Команда cmp ax,? сравнивает AX с неопределенным значением.
  4. Команда org $-2 выравнивает сегментный регистр на -2 байта.
  5. Команда int 29h выполняет переход на следующий сегмент.
  6. Команда lodsb загружает байт из памяти в AL.
  7. Команда or al,al устанавливает значение AL равным 0.
  8. Команда jnz @@next повторяет цикл, пока значение AL не станет равным 0.
  9. Переменная string содержит строку символов.
  10. Переменная ax содержит значение 0.
  11. Переменная si содержит смещение строки.
  12. Переменная al содержит байт, который будет проверен на равенство 0.
  13. Переменная offset не используется в коде.
  14. Переменная next не используется в коде.
  15. Команда int 29h выполняет переход на следующий сегмент.
  16. Команда lodsb загружает байт из памяти в AL.
  17. Команда or al,al устанавливает значение AL равным 0.
  18. Команда jnz @@next повторяет цикл, пока значение AL не станет равным 0.
  19. Переменная string содержит строку символов.
  20. Переменная ax содержит значение 0.
  21. Переменная si содержит смещение строки.
  22. Переменная al содержит байт, который будет проверен на равенство 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы