Выдать на экран количество букв в первом слове строки - 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

Объяснение кода листинга программы

Выполнение кода:

  1. Вводится строка с помощью функции BIOS int 21h, функциональный номер 0Ah. Буфер ввода inpbuf имеет размер 255 символов.
  2. Записывается в буфер ввода символ пробела 20h и с помощью цикла repne scasb проверяется, есть ли ещё пробелы в строке. Если есть, то увеличивается счётчик cx, который в начале равен длине строки. Если пробелов нет, то выполняется переход к следующей итерации цикла.
  3. В начале буфера ввода записывается символ рублика 0924h.
  4. Записывается в буфер ввода два символа: CR 0Dh и LF 0Ah.
  5. Содержимое буфера ввода приводится к числовому типу с помощью aam, и десятки и единицы разделяются, чтобы получить правильный десятичный формат.
  6. Если длина слова меньше 10, подавляется вывод первого нуля.
  7. Выводится на экран длина слова с помощью int 21h, функциональный номер 09h.
  8. Выполняется выход из программы с помощью int 21h, функциональный номер 4Ch. Описание переменных: — ah — используется как регистр-приемник для функций BIOS, которые возвращают код в формате ah:al. — leal — используется для вычисления эффективного адреса в памяти. — mov — используется для перемещения данных между регистрами и/или памятью. — int — используется для вызова функций BIOS. — stosb — используется для вывода данных в память. — scasb — используется для сравнения данных в памяти. — jnz — используется для выполнения перехода, если условие не равно нулю. — inc — используется для увеличения значения в памяти на единицу. — sub — используется для вычисления разности между двумя значениями в памяти. — cmp — используется для сравнения двух значений в памяти. — xchg — используется для обмена значениями между двумя регистрами. — db — используется для определения переменной в памяти.

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы