Ошибка вывода строки - Assembler

Узнай цену своей работы

Формулировка задачи:

имееться вот такой код
;Дан текст 20 символов. Определить кол-во повторений
;сочетаний "op" в тексте и заменить его символом "!"
data segment
req      db  10,13,'Enter string:$'
res      db  10,13,'result string:$'
quantity db  10,13,'Kolichestvo:$'
inpbuf   db  20      
len      db  ?       
buf   label byte
ends
stack segment
    dw   128  dup(0)
ends
code segment
start:
    mov ax, data
    mov ds, ax
    mov es, ax
;вывод чисто сообщения    
    MOV  AH,09h    ;output lines of the DS: DX.
    LEA  DX,req    
    INT  21h
;ввод строки 
    MOV  AH,0Ah    ;enter a string DS: DX
    LEA  DX,inpbuf ;buffer address     
    INT  21h   
    LEA SI,buf
    MOV DI, SI
    XOR CH, CH
    XOR AX, AX
    MOV CL,byte ptr len
m1:
    lodsb
    cmp al, 'o'
    jnz m2
    cmp [si], 'p'
    jnz m2    
    mov al, '!'
    stosb
    inc si
    inc ah
    jmp m3
m2:                
    stosb
m3:
    loop m1       
    mov al,'$'
    stosb
    PUSH AX
    MOV  AH,09h    ;output lines of the DS: DX.
    LEA  DX,quantity    
    INT  21h
    POP  AX
    MOV  DL, AH
    ADD  DL, '0' 
    MOV  AH,02h
    INT  21h
    MOV  AH,09h    ;output lines of the DS: DX.
    LEA  DX,res    
    INT  21h      
[COLOR="Red"][B]    MOV AH,09h
    MOV DX,buf
    int 21h[/B][/COLOR]
    mov ax, 4c00h 
    int 21h    
ends
end start
РАБОТАЕТ ОН ИСПРАВНО ИМЕННО ПО САМОЙ АРИФМИТИЧЕСКОЙ ЧАСТИ ошибка лишь заключаеться в выводе ответа почему то удаляються первые элементы строки заметил что ошибка происходит имеенно при выполнении действия выделенного красным цветом вот что выводит

Решение задачи: «Ошибка вывода строки»

textual
Листинг программы
;Дан текст 20 символов. Определить кол-во повторений
;сочетаний "op" в тексте и заменить его символом "!"
    .model  small
.stack
.data
req db 10,13,'Enter string:$'
res db 10,13,'result string:$'
quantity    db 10,13,'Kolichestvo:$'
inpbuf  db 20
len db ?
buf db  20 dup(?)
;
.code
start:
    mov ax, @data
    mov ds, ax
    mov es, ax
;вывод чисто сообщени
    MOV AH,09h          ;output lines of the DS: DX.
    LEA DX,req
    INT 21h
;ввод строки
    MOV AH,0Ah          ;enter a string DS: DX
    LEA DX,inpbuf       ;buffer address
    INT 21h
    LEA SI,buf
    MOV DI, SI
    XOR CH, CH
    XOR AX, AX
    MOV CL,[len]
m1:
    lodsb
    cmp al, 'o'
    jnz m2
    cmp byte ptr [si], 'p'
    jnz m2
    mov al, '!'
    stosb
    inc si
    inc ah
    dec cx  ; <---
    jmp m3
m2:
    stosb
m3:
    loop    m1
    mov al,'$'
    stosb
    PUSH    AX
    MOV AH,09h          ;output lines of the DS: DX.
    LEA DX,quantity
    INT 21h
    POP AX
    mov al, ah
        or  al, '0'
    int 29h
    MOV AH,09h          ;output lines of the DS: DX.
    LEA DX,res
    INT 21h
    MOV AH,09h
    lea DX,buf
    int 21h
    mov ax, 4c00h
    int 21h
    end start

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

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