Удаление всех пробелов - Assembler

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

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

;Write and test function that "compresses" string, 
;deleting from it all white spaces
.MODEL small                    
.STACK 100h                     
.DATA                           
NL      db      0Ah, 0Dh, '$'
Buf     DB      255, 0, 256 DUP (0)     ;
 
.CODE                           
main PROC
        mov     ax,@data        
        mov     ds,ax           
        mov     dx,offset Buf   
        mov     ah,0Ah
        int     21h
        xor     cx,cx
        mov     al,[Buf+1]      
        mov     cl,al           
        test    al,al           
        jz      Exit
        mov     ah,09h
        mov     dx,offset NL    
        int     21h
        mov     si,offset Buf+2
Cycle:
        mov     dl,[si]         
        cmp     dl,' '         
        jne     Print           
        jmp     Space           
Print:
        mov     ah,02h      ; тут надо сохранить в куда то а не вывести как можно сделать    
        int     21h             
Space:
        inc     si              
        loop    Cycle
Exit:
        mov     AX,4C00h        
        int     21h             
main    ENDP
 
END main

Решение задачи: «Удаление всех пробелов»

textual
Листинг программы
.MODEL small                    
.STACK 100h                     
.DATA                           
NL      db      0Ah, 0Dh, '$'
Buf     DB      255, 0, 256 DUP (0)     ;
Buf1    DB  256 DUP (0) ;<----
 
.CODE                           
main PROC
        mov     ax,@data        
        mov     ds,ax           
    mov es,ax   ;<---
        mov     dx,offset Buf   
        mov     ah,0Ah
        int     21h
        xor     cx,cx
        mov     al,[Buf+1]      
        mov     cl,al           
        test    al,al           
        jz      Exit
        mov     ah,09h
        mov     dx,offset NL    
        int     21h
        mov     si,offset Buf+2
    mov di,offset Buf1  ;<----
Cycle:
        mov     dl,[si]         
        cmp     dl,' '         
        jne     Print           
        jmp     Space           
Print:
;        mov     ah,02h ;<---
;        int     21h    ;<---
    mov [di],dl ;<---
    inc di  ;<---
Space:
        inc     si              
        loop    Cycle
Exit:
        mov     AX,4C00h        
        int     21h             
main    ENDP
 
END main

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

  1. .MODEL small - описывает модель памяти, используемую в программе. В данном случае, модель памяти - small, что означает, что программа использует сегментный способ адресации.
  2. .STACK 100h - определяет стек размером в 100 байт.
  3. .DATA - сегмент данных. Здесь объявлены две переменные: NL и Buf. NL содержит символ новой строки (0Ah, 0Dh, '$'), а Buf - буфер, в котором будет храниться исходная строка.
  4. .CODE - сегмент кода. Здесь находится основная часть программы.
  5. main PROC - описание точки входа в программу.
  6. mov ax,@data - перемещает регистр ax в сегмент данных.
  7. mov ds,ax - делает сегмент данных равным сегменту регистра ax.
  8. mov es,ax - делает сегмент стека равным сегменту регистра ax.
  9. mov dx,offset Buf - перемещает регистр dx в начало буфера Buf.
  10. mov ah,0Ah - устанавливает регистр ah равным 0Ah, что является кодом функции вывода символа в ASCII.
  11. int 21h - вызывает функцию вывода символа в ASCII.
  12. xor cx,cx - устанавливает регистр cx в 0.
  13. mov al,[Buf+1] - перемещает первый символ из буфера Buf в регистр al.
  14. mov cl,al - копирует значение регистра al в регистр cl.
  15. test al,al - проверяет, является ли первый символ буфера пустым символом (в данном случае пробелом).
  16. jz Exit - если первый символ пустой, то происходит переход на метку Exit.
  17. mov ah,09h - устанавливает регистр ah равным 09h, что является кодом функции вывода символа в ASCII.
  18. mov dx,offset NL - перемещает регистр dx в начало строки NL.
  19. int 21h - вызывает функцию вывода символа в ASCII.
  20. mov si,offset Buf+2 - устанавливает регистр si в начало цикла удаления пробелов.
  21. mov di,offset Buf1 - устанавливает регистр di в начало буфера Buf1, который будет использоваться для хранения результата.
  22. Cycle: a. mov dl,[si] - перемещает следующий символ из буфера Buf в регистр dl. b. cmp dl,' ' - сравнивает символ в регистре dl с пробелом. c. jne Print - если символ не является пробелом, то происходит переход на метку Print. d. jmp Space - если символ является пробелом, то происходит переход на метку Space.
  23. Print: a. mov ah,02h - устанавливает регистр ah равным 02h, что является кодом функции вывода символа в ASCII. b. int 21h - вызывает функцию вывода символа в ASCII. c. mov [di],dl - записывает символ из регистра dl в буфер Buf1 по адресу di. d. inc di - увеличивает значение регистра di на 1.
  24. Space: a. inc si - увеличивает значение регистра si на 1. b. loop Cycle - происходит повтор цикла до тех пор, пока не будет достигнут конец строки.
  25. Exit: a. mov AX,4C00h - устанавливает регистр AX равным 4C00h, что является кодом завершения работы программы. b. int 21h - вызывает функцию завершения работы программы. Таким образом, данный код на Assembler удаляет все пробелы из строки, сохраняя все остальные символы в новом буфере.

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

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