Количество слов, содержащих более 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).