Подсчитать количество чисел в строке, больших чем первое введенное число (нужна проверка программы) - Assembler
Формулировка задачи:
Уважаемые знающие!
Программа должна считать кол-во чисел в строке, больших чем первое введенное число
Пробегите хотя бы взглядом, может закралась ошибка где, хотя тестил и,вроде, все работает верно
Так же объясните мне, что нужно вставить в этот код, чтобы можно было вводить знаковые числа
Зараннее огромное спасибо!
.model small .stack 100h .code ;///////////////////////////////////////////////////////////////////////////////////////////// ;В первой части программы находим первое число строки и запоминаем его в переменную first start: mov ax, @data ; в регистр АХ смещение dataseg mov ds, ax ; в регистре DS смещение dataseg mov [buffer], 100 ; в первый байт буффера поместим его максимально возможную длину mov ah, 0Ah ; ввод в буффер до клавиши Enter int 21h ; вызов mov cl,[buffer+1] ; в CL - фактическая длина строки xor ax, ax ; обнуляем регистр АХ mov ah,byte ptr space ; в AH - код символа space xor bx,bx ; обнуляем регистр bx find: cmp ah,[buffer+si] ; сравниваем символ строки с пробелом je found ; нашелся пробел inc si ; не нашелся, идем к следующему символу inc bx ; заодно увеличивая счетчик loop find ; цикл по фактической длине введенной строки found: mov index,bx ; индекс вхождения пробела mov si, 2 ; поместим в SI 2 mov cx,index ; цикл будет идти до индекса вхождения пробела, чтобы запомнить только первое число из строки xor ax, ax ; обнуляем регистр АХ str_loop: mov dl, [buffer+si] ; в DL помещаем третий байт буффера - первый символ строки (т.к. 0,1,2, где 2 - третье число) cmp dl, ' ' ; символ - пробел? je not_int ; да, переход к метке not_int xor dh, dh ; обнуляем регистр DH sub dl, '0' ; переводим цифру из строкового представления в числовое push dx ; записать DX в вершину стека mov bx, 10 ; в BX - 10 - множитель, для перевода многозначных чисел mul bx ; умножаем значение в AX на BX (на 10) pop dx ; выталкиваем значение из стека и снова пишем его в DX add ax, dx ; добавляем значение регистра DX в AX jmp no_add ; безусловный переход к метке no_add not_int: cmp ax, 0 ; сравниваем AX с 0 je no_add ; если AX равен нулю, то переход к метке no_add mov first,word ptr ax ; в другом случае добавляем значение в регистра AX в сумму xor ax, ax ; обнуляем регистр AX no_add: inc si ; увеличиваем SI, чтобы перейти к следующему байту строки loop str_loop ; цикл по длине строки ;///////////////////////////////////////////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////////////////////////////////////////// ;Во второй части программы находим кол-во чисел, больших чем наше first xor ax,ax xor cx,cx xor bx,bx ; обнулим все регистры (на всякий случай)(можно закомментить) xor si,si xor dx,dx next: mov si, index ; в SI - индекс первого пробела xor ch, ch ; обнуление CH, чтобы в CX не было мусора mov cl, [buffer+1] ; в CL - фактическая длина введенной строки (можно вычесть индекс первого пробела, чтобы цикл не выполнял лишних итераций) sub cx,index inc cx xor ax, ax str_loop2: mov dl, [buffer+si] ; заново обращаемся к той же введенной строке, но не учитываем первое введнное число cmp dl, ' ' ; сравниваем символ с кодом пробела je not_int2 ; если это пробел, то переход к метке not_int2 xor dh, dh ; обнулим DH, чтобы в DX не было лишнего мусора sub dl, '0' ; получим цифру в числовом представлении push dx ; закинем в стек mov bx, 10 ; в BX - 10 - множитель mul bx ; умножим AX на 10(BX) pop dx ; вытолкнем значение из стека в DX add ax, dx ; добавим DX в AX jmp no_add2 ; безусловно переходим к метке no_add2 not_int2: cmp ax, 0 ; в ax находится 0? je no_add2 ; да, перейдем к метке no_add2 cmp first,ax ; нет, значение ax больше first? jb plus ; да, перейдем к метке plus nop ; нет, ничего не делаем xor ax,ax ; обнуляем ax jmp no_add2 ; безусловно переходим к метке no_add2 plus: mov ax,count ; увеличиваем счетчик на единицу (нашлось число больше first) inc ax mov count,ax no_add2: inc si ; переход на следующий байт строки loop str_loop2 ; цикл по длине строки mov ax, 4C00h ; в AX - код завершения int 21h ; вызов функции .data buffer db 100 dup(?),'$' ; буффер для введенной строки с $ в конце first dw 0 ; переменная для первого числа в строке count dw 0 ; переменная-счетчик для чисел, больших, чем первое число строки space db ' ',' ','$' ; код пробела, можно использовать просто 32 без заноса в регистры index dw 0 ; переменная для индекса первого найденного пробела, понадобится, чтобы запомнить первое введенное число end start
Решение задачи: «Подсчитать количество чисел в строке, больших чем первое введенное число (нужна проверка программы)»
textual
Листинг программы
mov [buffer], 100 mov ah, 0Ah int 21h
Объяснение кода листинга программы
- В начале программы, в качестве первого числа, в переменную
buffer
записывается число 100. - Затем, в регистр
ah
записывается значение 0Ah, которое является кодом функции ввода числа с клавиатуры. - После этого, происходит ввод числа с клавиатуры в переменную
buffer
, используя функцию ввода с кодом 0Ah. - Результат подсчета количества чисел в строке, больших чем первое введенное число, будет храниться в регистре
cx
. - Затем, с помощью оператора
int 21h
, происходит вызов функции ввода строки с клавиатуры. - Введенная строка будет храниться в буфере, который обычно располагается в памяти от 40 до 70 (в зависимости от операционной системы).
- После ввода строки, программа выполняет цикл, пока не встретит символ новой строки или символ возврата каретки.
- В каждой итерации цикла, программа проверяет каждое число в строке. Если число больше чем первое введенное число, то увеличивает счетчик в регистре
cx
. - После окончания цикла, программа выводит результат подсчета на экран с помощью функции вывода с кодом 02h.
- В конце программы, регистры
ah
иcx
очищаются, чтобы можно было использовать их в других частях программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д