лабы / zadanie_2
.docx.model small - модель памяти exe программы
.data – сегмент данных
string db 250,?, 256 dup ('$') - строка (ожидаемая длина строки или иначе максимальная длина строки (с учётом нажатия ентер), фактическая длина строки (неизвестно из-за ?), строка, заканчивающаяся ASCII-кодом клавиши ENTER)
.code – сегмент кода
start: - метка старта
mov ax,@data - в регистра AX смещение для данных
mov ds,ax - установить регистр DS равный AX то ест теперь там смещение. (Есть правило, нельзя непосредственно изменять содержимое регистров CS, DS, SS)
mov ax,0b800h - загружаем в 16-битный регистр данных (0b800h соответствует сегменту дисплея в тестовом режиме)
mov es,ax - т.к. загрузка числа напрямую в сегментный регистр запрещена (16 бит)
mov ax,3 - установите режим видео на TextMode символов 80x25 и 16 цветов. (номер видеорежима)
int 10h - используется для инициализации графического и видеорежима (установка видеорежима)
mov ah,10 – буферизированный ввод строки (вроде)
lea dx,string – заносим в dx смещение нашей строки
int 21h – прерывание (вызов функции DOS)
lea si,string+1 – заносим в si смещение нашей строки+1
mov si,320 – Указывает на ячейку памяти
xor cx,cx – обнуление счётчика
mov cl,byte ptr [di] – cl длина строки +1
add di,cx - складываем длину строки и счётчик
inc cx – увеличить счётчик +1
mov dx, cx - установить регистр DX равный счётчику .
mov al,' ' – заносим пустой знау(пробел) в регистр AL.
deg: push ds pop es std – устанавливаем флаг направления.
repnz – Повторить следующую строковую операцию, если не нуль.
Scasb – Сравнить строку байтов.
push di – Поместить di в стек.
xchg dx,cx – Обмен между dx и счётчиком.
sub cx,dx Вычитаем из cx и dx.
add di,2 – прибавить к di 2.
dec cx – Уменьшает счётчик на один.
mov ax,0b800h – загружаем в 16-битный регистр данных (0b800h соответствует сегменту дисплея в тестовом режиме)
mov es,ax – т.к. загрузка числа напрямую в сегментный регистр запрещена (16 бит)
cld – Очистить флаг направления
mov ah,12 – буферизированный ввод строки
xchg si,di – Обмен между si и di.
begs: lodsb – Загружаем строковый операнд.
stosw – Сохраняем элемент строки.
loop begs – Запуск цикла сегмента кода begs.
mov al,' ' – заносим пустой знак(пробел) в регистр AL.
stosw – Сохраняем элемент строки.
mov si,di – заносим в si смещение di
pop di – извлекаем di из стека
mov cx,dx – установить счётчик равный регистру DX
or cx,cx – Побитовое сложение счетсчика
jnz deg – условный переход к deg
mov ah,10h – буферизированный ввод строки
int 16h – запуск сервиса ввода с клавиатуры
mov ah,4ch – буферизированный ввод строки
int 21h – прерывание (вызов функции DOS)
КОД
.model small
.data
string db 250,?, 256 dup ('$')
.code
start:
mov ax,@data
mov ds,ax
mov ax,0b800h
mov es,ax
mov ax,3
int 10h
mov ah,10
lea dx,string
int 21h
;по словам (разделитель - пробел)
lea di,string+1
mov si,320
xor cx,cx
mov cl,byte ptr [di]
add di,cx
inc cx
mov dx,cx
mov al,' '
deg: push ds
pop es
std
repnz scasb
push di
xchg dx,cx
sub cx,dx
add di,2
dec cx
mov ax,0b800h
mov es,ax
cld
mov ah,12
xchg si,di
begs: lodsb
stosw
loop begs
mov al,' '
stosw
mov si,di
pop di
mov cx,dx
or cx,cx
jnz deg
mov ah,10h
int 16h
mov ah,4ch
int 21h
end start