Перепечатать заданный текст, удалив из него символы "b", непосредственно перед которыми следует цифра - Assembler

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

УЖЕ есть код , но он почему то у меня зациклился , помогите исправить , или предложите свой вариант , заранее спасибо

Код к задаче: «Перепечатать заданный текст, удалив из него символы "b", непосредственно перед которыми следует цифра - Assembler»

textual
; Задание : Перепечатать заданный текст, удалив из него символы "b", непосредственно перед которыми следует цифра.
;
.MODEL  SMALL 
.STACK  100H
.DATA
TEXT    DB  'ack45ab4bc54',0
.CODE
MAIN    PROC    NEAR
    MOV AX, @DATA
    MOV DS, AX
    CLD
    MOV si, OFFSET TEXT
 
    mov bl, 'b'
    mov dl, 0   ; 1 - если ранее была выведена цифра, 0 - если цифра не выводилась ранее
 
@@loop:
    lodsb
    test    al, al      ; достигнут ли конец строки?
    jz  @@end       ; если да - прекратить цикл
    cmp al, bl      ; символ "b"?
    jne @@disp      ; если нет, то перейти к выводу символа
    test    dl, dl      ; был ли предыдущий символ цифрой?
    jne @@skip_disp ; если dl не равен нулю, значит ранее была выведена цифра
@@disp:
    call    DispAl
@@skip_disp:
    call    IsAlDigit   ; возвращает в al 1 если там был символ цифры и 0 в противном случае
    mov dl, al
    jmp @@loop
@@end:
    mov al, 0dh
    call    DispAl
    mov al, 0ah
    call    DispAl
 
    MOV ax,4C00h
    INT 21H
MAIN    ENDP
;===================
DispAl  PROC    NEAR
    push    ax
    push    dx  
    mov ah, 2
    mov dl, al
    int 21h
    pop dx
    pop ax
    ret
DispAl  ENDP
;===================
IsAlDigit   PROC    NEAR
; On Enter:
;   AL <- символ
; OnExit:
;   AL=1, если в AL ASCII цифра
;   AL=0, в противном случае 
    sub al, 30h
    js  @@non_digit
    sub al, 10
    jns @@non_digit
    mov al, 1
    jmp @@exit
@@non_digit:
    xor al, al
@@exit:
    ret
IsAlDigit   ENDP
;===================
    END MAIN

9   голосов, оценка 3.778 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы