Количество слов, содержащих более 3-х символов - Assembler
Формулировка задачи:
Дан текст 35 символов. Определить количество слов, содержащих более 3-х символов. Слова разделяются одним пробелом
Решение задачи: «Количество слов, содержащих более 3-х символов»
textual
Листинг программы
model small .stack 100h .code begin: mov ax,@data mov ds,ax mov ah,9 lea dx,dbEnt int 21h .data dbEnt db 10,13,'Enter string:$' .code mov ah,10 lea dx,dbMax int 21h .data dbMax db 255 dbLen db ? dbStr db 255 dup(?) .code lea si,dbLen push si mov cl,[si+1] xor ch,ch add si,cx mov byte ptr[si],' ' pop si xor di,di mov al,' ' @@01: inc si cmp al,[si] loopz @@01 inc cx mov bx,-1 @@02: inc bx cmp al,[bx+si] loopnz @@02 inc cx cmp bx,4 jl @@03 inc di @@03: add si,bx loop @@01 @@04: mov ah,9 lea dx,dbRes int 21h .data dbRes db 10,13,'Result:$' .code mov ax,10 xchg ax,di xor cx,cx @@05: xor dx,dx div di push dx inc cx or ax,ax jnz @@05 @@06: pop ax or al,'0' int 29h loop @@06 mov ax,4C00h int 21h end begin
Объяснение кода листинга программы
- Объявляется модель программы (.
model small
). - Выделяется память стека размером 100h (
.stack 100h
). - Начинается секция кода (
begin:
). - Переменной
ax
присваивается адрес данных (mov ax,@data
). - Значение регистра
ax
помещается в регистрds
для доступа к данным (mov ds,ax
). - В регистр
ah
помещается код для вывода строки (mov ah,9
). - В переменную
dx
записывается адрес строкиdbEnt
для отображения сообщения ввода строки (lea dx,dbEnt
). - Вызывается прерывание 21h для отображения сообщения и ввода строки (
int 21h
). - Объявляется секция данных (
.
data`). dbEnt
- объявляется массив байта, содержащий константы для ввода строки (.db 10,13,'Enter string:$'
).- Снова начинается секция кода (
.
code`). - В регистр
ah
помещается код для чтения строки (mov ah,10
). - В переменную
dx
записывается адрес строкиdbMax
для отображения сообщения о максимальной длине строки (lea dx,dbMax
). - Вызывается прерывание 21h для отображения сообщения и ввода строки (
int 21h
). - Объявляется секция данных (
.
data`). dbMax
- объявляется массив байта, содержащий максимальную длину строки (.db 255
).dbLen
- объявляется байтовая переменная (db ?
) для хранения длины строки.dbStr
- объявляется массив байтов (db 255 dup(?)
) для хранения введенной строки.- Снова начинается секция кода (
.
code`). - В регистр
si
записывается адрес переменнойdbLen
(lea si,dbLen
). - Значение регистра
si
помещается в стек (push si
). - Значение второго байта, на который указывает
si
, записывается в регистрcl
(mov cl,[si+1]
). - Регистр
ch
устанавливается в 0 (xor ch,ch
). - К регистру
si
добавляется значение регистраcx
(add si,cx
). - Значение по адресу
si
устанавливается в пробел (mov byte ptr[si],' '
). - Значение из стека помещается в регистр
si
(pop si
). - Значение
al
увеличивается на 1 (inc si
). - Сравнивается значение в регистре
al
и значение по адресу, на который указываетsi
(cmp al,[si]
). - Происходит повторение предыдущего шага
cx
раз или до тех пор, пока флагZF
равен 1 (loopz @@01
). - Значение регистра
cx
увеличивается на 1 (inc cx
). - Значение регистра
bx
устанавливается в -1 (mov bx,-1
). - Следующий цикл начинается с метки
@@02
. - Значение регистра
bx
увеличивается на 1 (inc bx
). - Сравнивается значение в регистре
al
и значение по адресу, на который указываетbx
иsi
(cmp al,[bx+si]
). - Происходит повторение предыдущего шага
cx
раз или до тех пор, пока флагZF
равен 0 (loopnz @@02
). - Значение регистра
bx
увеличивается на 1 (inc cx
). - Сравнивается значение регистра
bx
и 4 (cmp bx,4
). - Если значение регистра
bx
меньше 4, выполнение кода переходит к метке@@03
(jl @@03
). - Значение регистра
di
увеличивается на 1 (inc di
). - Значение регистра
si
увеличивается на значение регистраbx
(add si,bx
). - Происходит повторение инструкций с метки
@@01
(loop @@01
). - Значение в регистре
ah
устанавливается в 9 (mov ah,9
). - В переменную
dx
записывается адрес строкиdbRes
для отображения сообщения с результатом (lea dx,dbRes
). - Вызывается прерывание 21h для отображения сообщения и результата (
int 21h
). - Снова начинается секция данных (
.
data`). dbRes
- объявляется массив байта, содержащий константы для вывода результата (.db 10,13,'Result:$'
).- Снова начинается секция кода (
.
code`). - В регистр
ax
помещается значение 10 (mov ax,10
). - Значения регистров
ax
иdi
меняются местами (xchg ax,di
). - Значение регистра
cx
устанавливается в 0 (xor cx,cx
). - Начинается цикл с метки
@@05
. - Значение регистра
dx
устанавливается в 0 (xor dx,dx
). - Происходит деление регистров
ax
иdi
. Частное помещается вax
, остаток вdx
(div di
). - Остаток помещается в стек (
push dx
). - Значение регистра
cx
увеличивается на 1 (inc cx
). - Если результат деления не равен 0, выполнение кода переходит к метке
@@05
(jnz @@05
). - Начинается цикл с метки
@@06
. - Значение из стека помещается в регистр
ax
(pop ax
). - Значение
al
преобразуется в символ числа (or al,'0'
). - Символ числа выводится на экран (
int 29h
). - Происходит повторение инструкций с метки
@@06
(loop @@06
). - Значение регистра
ax
устанавливается как 4С00h (mov ax,4C00h
). - Вызывается прерывание 21h для завершения программы (
int 21h
). - Окончание программы (
end begin
).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д