Подсчитать количество чисел в строке, больших чем первое введенное число (нужна проверка программы) - 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

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

  1. В начале программы, в качестве первого числа, в переменную buffer записывается число 100.
  2. Затем, в регистр ah записывается значение 0Ah, которое является кодом функции ввода числа с клавиатуры.
  3. После этого, происходит ввод числа с клавиатуры в переменную buffer, используя функцию ввода с кодом 0Ah.
  4. Результат подсчета количества чисел в строке, больших чем первое введенное число, будет храниться в регистре cx.
  5. Затем, с помощью оператора int 21h, происходит вызов функции ввода строки с клавиатуры.
  6. Введенная строка будет храниться в буфере, который обычно располагается в памяти от 40 до 70 (в зависимости от операционной системы).
  7. После ввода строки, программа выполняет цикл, пока не встретит символ новой строки или символ возврата каретки.
  8. В каждой итерации цикла, программа проверяет каждое число в строке. Если число больше чем первое введенное число, то увеличивает счетчик в регистре cx.
  9. После окончания цикла, программа выводит результат подсчета на экран с помощью функции вывода с кодом 02h.
  10. В конце программы, регистры ah и cx очищаются, чтобы можно было использовать их в других частях программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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