Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лабы / task12

.txt
Скачиваний:
43
Добавлен:
18.04.2022
Размер:
4.17 Кб
Скачать
locals
DOSSEG
.model small
.stack 100h
.data
;длина строки
len db 200
;резервный байт (для чтения)
res db 0
;сама строка
string db 200 dup('$')
;строка 'number' с '$' на конце - определяет конец строки
number db 'number$'
.code
;процедура сдвига строки вправо на разность длины слова "number", то есть 6 байт,
;и длины числа(для того чтобы вставить на это место 'number')
;в si - адрес строки с нужного места
shift proc near то же, что и раньше, но не удаляем, а вставляем слово number и удлинняем строку на 6 - длина слова
cld
mov di, si
xor cx, cx
mov ax, si
@@1:
mov bl, byte ptr [si]
cmp bl, '$'
je @@2
inc si
inc cx
jmp @@1
@@2:
inc cx
mov di, si
mov si, ax
xor ax, ax
@@4:
mov bl, byte ptr [si]
cmp bl, ' '
je @@5
inc si
inc ax
jmp @@4
@@5:
mov si, di
mov bx,6
sub bx,ax
add di,bx

@@3:
xor bx,bx
mov bl, byte ptr [si]
mov byte ptr [di], bl
dec si
dec di
loop @@3
ret
shift endp
;процедура копирования 'number' в строку
;в di - адрес строки с нужного места
copy proc near
cld
lea si, number
mov cx, 6
rep movsb
ret
copy endp
;поиск числа
;в si - адрес строки с нужного места
find proc near
mov di, si
mov bl, 1
@@start:
mov ah, byte ptr[si]
cmp ah, 13
je @@4
cmp ah, ' '
je @@1
jmp @@3
@@1:
cmp bl, 1
je @@2
mov bl, 1
inc si
mov di, si
jmp @@3
@@2:
mov ax, di
ret
@@4:
cmp bl, 1
je @@2
mov ax, 0
ret
@@3:
mov ah, byte ptr[si]
cmp ah, '0'
jl @@5
cmp ah, '9'
jg @@5
inc si
jmp @@start
@@5:
mov bl, 0
inc si
jmp @@start
find endp
;переход на новую линию
newline proc near
mov dl,10
mov ah,2
int 21h
ret
newline endp
;ввод строки
input proc near
mov ah, 0Ah
int 21h
ret
input endp
;вывод строки
output proc near
mov ah, 9
int 21h
ret
output endp
;основной алгоритм
do proc near
;в si - адрес строки
lea si, string
@@1:
push si
;вызываем функцию find - ищем первую позицию числа
call find
pop si
;сравниваем ax с 0 (ax - возвращаемое значение функции find)
;если ноль - завершаем операцию
cmp ax, 0
je @@2
;иначе:
mov si, di
;сдвигаем строку с позиции ax на 6 символов вправа (с помощью функции shift)
push di
call shift
pop di
;копируем 'number' в нужную часть строки
call copy
;в si - адрес строки
lea si, string
;начинаем сначала
jmp @@1
@@2:
ret
do endp
;главная функция (точка входа)
start proc near
mov ax, @data
mov ds, ax
mov es, ax
xor ax, ax
;ввод строки
mov dx, offset len
call input
;основной алгоритм
call do
;переход на новую строку
call newline
;вывод полученной строки
mov dx, offset string
call output
;ожидание ввода символа
mov ah, 0
int 16h
;завершение программы
mov ah, 4Ch
mov al, 0
int 21h
start endp
end start
Соседние файлы в папке лабы