Выдать на экран количество букв в первом слове строки - Assembler
Формулировка задачи:
Завтра сдавать.... Может кто то помочь?!
Ввести строку символов, используя прерывание int 21h. Подсчитать и выдать на экран количество букв в первом слове (слова в строке отделяются пробелам).
Решение задачи: «Выдать на экран количество букв в первом слове строки»
textual
Листинг программы
;tasm /m3 cio_1wrl && wlink form dos com fi cio_1wrl .model tiny .286 .code org 100h start: ; Вывод на экран mov ah, 09h lea dx, req int 21h ; ввод строки mov ah, 0Ah lea dx, inpbuf int 21h mov si, dx lodsw ; в AH длина строки mov di, si shr ax, 8 ; сдвигаем в AL, AH должен быть = 0 mov cx, ax mov bx, ax ; cx - str length, DS:SI = ES:DI -> string buf mov al, 20h ; пробел @l: repne scasb stosb ; дописываем в хвост слова пробел, отделяем от длины jnz @f ; нет пробелов inc cx @f: sub bx, cx ; bx = длина слова ; Вывод на экран mov ax, 0924h ; 09h - DOS func(write string), 24h - '$' stosb ; сохраняем "рублик" mov si, dx mov word ptr [si], 0A0Dh ; в начало буфера пишем CR/LF int 21h mov ax, bx ; длина слова aam ; делим на 10. AH=десятки AL=единицы or ax,'00' ; to ASCII xchg ah, al ; десятки первыми ; здесь можно подавить вывод первого 0, если длина слова < 10 ; cmp al, 30h ; jz @1 int 29h @1: xchg ah, al int 29h ; выход gtfo: mov ah, 4Ch int 21h req: db 'Enter string:$' inpbuf: db 255 ; длина строки - 255 симв. макс. len: db ? ; сюда вернется настоящая длина buf: db ? ; тут будет то, что ввели end start
Объяснение кода листинга программы
Выполнение кода:
- Вводится строка с помощью функции BIOS
int 21h
, функциональный номер 0Ah. Буфер вводаinpbuf
имеет размер 255 символов. - Записывается в буфер ввода символ пробела 20h и с помощью цикла
repne scasb
проверяется, есть ли ещё пробелы в строке. Если есть, то увеличивается счётчикcx
, который в начале равен длине строки. Если пробелов нет, то выполняется переход к следующей итерации цикла. - В начале буфера ввода записывается символ рублика 0924h.
- Записывается в буфер ввода два символа: CR 0Dh и LF 0Ah.
- Содержимое буфера ввода приводится к числовому типу с помощью
aam
, и десятки и единицы разделяются, чтобы получить правильный десятичный формат. - Если длина слова меньше 10, подавляется вывод первого нуля.
- Выводится на экран длина слова с помощью
int 21h
, функциональный номер 09h. - Выполняется выход из программы с помощью
int 21h
, функциональный номер 4Ch. Описание переменных: —ah
— используется как регистр-приемник для функций BIOS, которые возвращают код в форматеah:al
. —leal
— используется для вычисления эффективного адреса в памяти. —mov
— используется для перемещения данных между регистрами и/или памятью. —int
— используется для вызова функций BIOS. —stosb
— используется для вывода данных в память. —scasb
— используется для сравнения данных в памяти. —jnz
— используется для выполнения перехода, если условие не равно нулю. —inc
— используется для увеличения значения в памяти на единицу. —sub
— используется для вычисления разности между двумя значениями в памяти. —cmp
— используется для сравнения двух значений в памяти. —xchg
— используется для обмена значениями между двумя регистрами. —db
— используется для определения переменной в памяти.