Удаление всех пробелов - 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
Объяснение кода листинга программы
- .MODEL small - описывает модель памяти, используемую в программе. В данном случае, модель памяти -
small
, что означает, что программа использует сегментный способ адресации. - .STACK 100h - определяет стек размером в 100 байт.
- .DATA - сегмент данных. Здесь объявлены две переменные: NL и Buf. NL содержит символ новой строки (0Ah, 0Dh, '$'), а Buf - буфер, в котором будет храниться исходная строка.
- .CODE - сегмент кода. Здесь находится основная часть программы.
- main PROC - описание точки входа в программу.
- mov ax,@data - перемещает регистр ax в сегмент данных.
- mov ds,ax - делает сегмент данных равным сегменту регистра ax.
- mov es,ax - делает сегмент стека равным сегменту регистра ax.
- mov dx,offset Buf - перемещает регистр dx в начало буфера Buf.
- mov ah,0Ah - устанавливает регистр ah равным 0Ah, что является кодом функции вывода символа в ASCII.
- int 21h - вызывает функцию вывода символа в ASCII.
- xor cx,cx - устанавливает регистр cx в 0.
- mov al,[Buf+1] - перемещает первый символ из буфера Buf в регистр al.
- mov cl,al - копирует значение регистра al в регистр cl.
- test al,al - проверяет, является ли первый символ буфера пустым символом (в данном случае пробелом).
- jz Exit - если первый символ пустой, то происходит переход на метку Exit.
- mov ah,09h - устанавливает регистр ah равным 09h, что является кодом функции вывода символа в ASCII.
- mov dx,offset NL - перемещает регистр dx в начало строки NL.
- int 21h - вызывает функцию вывода символа в ASCII.
- mov si,offset Buf+2 - устанавливает регистр si в начало цикла удаления пробелов.
- mov di,offset Buf1 - устанавливает регистр di в начало буфера Buf1, который будет использоваться для хранения результата.
- Cycle: a. mov dl,[si] - перемещает следующий символ из буфера Buf в регистр dl. b. cmp dl,' ' - сравнивает символ в регистре dl с пробелом. c. jne Print - если символ не является пробелом, то происходит переход на метку Print. d. jmp Space - если символ является пробелом, то происходит переход на метку Space.
- Print: a. mov ah,02h - устанавливает регистр ah равным 02h, что является кодом функции вывода символа в ASCII. b. int 21h - вызывает функцию вывода символа в ASCII. c. mov [di],dl - записывает символ из регистра dl в буфер Buf1 по адресу di. d. inc di - увеличивает значение регистра di на 1.
- Space: a. inc si - увеличивает значение регистра si на 1. b. loop Cycle - происходит повтор цикла до тех пор, пока не будет достигнут конец строки.
- Exit: a. mov AX,4C00h - устанавливает регистр AX равным 4C00h, что является кодом завершения работы программы. b. int 21h - вызывает функцию завершения работы программы. Таким образом, данный код на Assembler удаляет все пробелы из строки, сохраняя все остальные символы в новом буфере.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д