Добавить пробелы в строке - Assembler

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

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

Дана строка, слова разделены пробелами, необходимо добавить между словами еще по одному пробелу. Преподаватель просит использование строковых команд, и обязательно REPNE! Сделала сама, но команду REPNE не использую, не получается( В ассемблере совсем новичок! Пожалуйста, помогите исправить! Заранее спасибо!
org 100h
 
.MODEL tiny
 
start:
         
mov ah,09h
lea dx,Input_str
int 21h 
 
   call Enter 
 
input:      
    call ReadChar 
    mov [Str_in+si],al      
    cmp al,13
    je continue_input     
    inc si  
loop input
                         
continue_input:
    mov [Str_in+si],'$'
    call Enter 
     
    mov ah,09h
    lea dx,Res
    int 21h  
    
    call Enter
     
; основная программа  
  
    CLD
    LEA si,str_in 
    LEA di,str_out          
    LODSB

READ1:  
    STOSB 
    MOV bl, ' '
    LODSB 
         
    CMP al,last
    JE DONE1
   
    CMP al,space        
    JNE READ1
    MOV al,bl 
    STOSB
    MOV al,space
    JMP READ1
 
DONE1:
    MOV al,bl 
    STOSB 
    MOV al,space                      
    STOSB
 
PRINT:
    MOV AL, '$'
    STOSB
    MOV DX, OFFSET STR_OUT  
    MOV AH, 09H
    INT 21H
    MOV AH, 4CH 
    INT 21H                   
                           
;----------------------------------------------------- 
ReadInteger proc  
    push    cx    
    push    bx
    push    dx 
    mov     fl,0  
    xor     cx, cx  
    mov     bx, 10 
    call    ReadChar  
 
    cmp     al,'-' 
    je      minus
    jmp     nn
minus:
    mov     fl,1  
read: 
    call    ReadChar  
nn: cmp     al, 13    
    je      done      
    
    sub     al, '0'   
    xor     ah, ah  
    xor     dx, dx   
    xchg    cx, ax  
    mul     bx  
    add     ax, cx  
    xchg    ax, cx  
    jmp     read  
done:  
    xchg    ax, cx  
    cmp     fl,1
    je      eee
    jmp     ee
eee:
    neg     ax
ee: 
    pop     dx
    pop     bx  
    pop     cx 
    ret  
ReadInteger endp  
 
; ввод одного символа   
ReadChar proc      
    mov     ah,1 
    int     21h          
    ret  
ReadChar endp  
 
; перевод строки  
Enter proc
    mov ah,09h
    lea dx,crlf
    int 21h    
    ret
Enter endp    
 
Str_in db 128 dup (?) ; начальная строка 
STR_OUT DB 100 DUP(?)   ; строка-результат
fl dw ?   
LAST    DB '$'    ;конец строки 
SPACE   DB ' '  ;пробел     
Input_str db 'Введите строку: ','$' 
crlf db 0dh,0ah,'$'
Res db 'Результат: ','$' 
           
end start

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

textual
Листинг программы
        mov     edi,str_in
        mov     esi,str_out
 
        mov     ebx,edi;запомнили edi
 
        mov     ecx,-1;почти "бесконечный" цикл поиска символа '$' в введённой строке
        mov     al,'$'
        cld
        repne   scasb;увеличивается edi пока не встретится символ '$'
 
        mov     ecx,edi
        sub     ecx,ebx;сосчитали сколько символов в введённой строке
        mov     edi,ebx
        mov     al,' '
mRepeat:;ищем пробелы...
        mov     ebx,edi
        cld
        repne   scasb;увеличивается edi пока не встретится символ ' '
        mov     edx,0
        jnz     mFinish;этот переход будет осуществлён когда пробел уже не найден, а в ecx уже 0
        mov     edx,1;если найден пробел, то в edx будет 1
mFinish:
 
        push    ecx
        mov     ecx,edi
        sub     ecx,ebx
        mov     edi,ebx
        xchg    esi,edi
        cld
        repe    movsb;копируем из source в target
        cmp     edx,0
        je      mFinish2
        stosb;добавляем пробел
mFinish2:
        xchg    esi,edi
        pop     ecx
 
        cmp     edx,0
        jne     mRepeat;тут я немножко укоротил :)

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

  1. Входные данные:
    • str_in: строка, в которой нужно добавить пробелы
    • str_out: строка, в которую будут добавлены пробелы
  2. Выполняемые действия:
    • Переменная edi содержит адрес первого символа строки str_in
    • Переменная esi содержит адрес первого символа строки str_out
    • Переменная ebx используется для хранения значения edi
    • Переменная ecx используется для цикла поиска символа '$' в строке str_in
    • Переменная al содержит символ '$'
    • Используется команда repne scasb для поиска символа '$' в строке str_in. Увеличивается значение edi до тех пор, пока не будет найден символ '$'
    • Переменная ecx вычисляется как разница между edi и ebx, что дает количество символов в строке str_in
    • Переменная edi устанавливается равной ebx, что означает, что поиск пробелов начинается с начала строки str_in
    • Переменная al устанавливается равной символу ' ', что означает, что мы ищем пробелы
    • Используется цикл repne scasb для поиска пробелов в строке str_in. Увеличивается значение edi до тех пор, пока не будет найден пробел
    • Если пробел найден, то в переменной edx устанавливается значение 1
    • Если пробел не найден, то в переменной edx устанавливается значение 0
    • Если в переменной edx установлено значение 0, то мы достигли конца строки str_in и завершаем выполнение программы
    • Если в переменной edx установлено значение 1, то мы нашли пробел и переходим к следующему шагу
    • Используется команда xchg esi,edi для обмена значений esi и edi
    • Используется команда cld для установки флага направления строки в 1, что означает, что мы будем копировать символы из str_in в str_out слева направо
    • Используется команда repe movsb для копирования символов из str_in в str_out
    • Если в переменной edx установлено значение 0, то мы достигли конца строки str_in и завершаем выполнение программы
    • Если в переменной edx установлено значение 1, то мы нашли пробел и добавляем его в строку str_out с помощью команды stosb
    • Используется команда xchg esi,edi для обмена значений esi и edi
    • Используется команда pop ecx для удаления значения из стека
    • Если в переменной edx установлено значение 0, то мы достигли конца строки str_in и завершаем выполнение программы
    • Если в переменной edx установлено значение 1, то мы нашли пробел и переходим к следующему шагу
    • Если значение в переменной edx не равно 0, то мы продолжаем поиск пробелов с начала строки str_in
  3. Выходные данные:
    • Строка str_out с добавленными пробелами

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


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

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

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