Вывод номера меньшего из двух введённых чисел - Assembler

Узнай цену своей работы

Формулировка задачи:

Составить программу, которая последовательно (в цикле) вводит по паре целых чисел и выводит номер меньшего из них. Процесс продолжается до ввода двух нулей.

Решение задачи: «Вывод номера меньшего из двух введённых чисел»

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
 
        msgEnterFirst   db      'Enter 1st number: ', '$'
        msgEnterSecond  db      'Enter 2nd number: ', '$'
        msgLesser       db      'The index of the lesser number: ', '$'
        First           dw      ?
        Second          dw      ?
 
        kbdBuffer       db      6, 0, 7 dup(?)
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
@@Repeat:
        ;ввод первого числа
        mov     ah,     09h
        lea     dx,     msgEnterFirst
        int     21h
        mov     ah,     0Ah             ;ввод строки
        lea     dx,     kbdBuffer
        int     21h
        mov     ah,     09h             ;перевод строки (на новую строку)
        lea     dx,     CrLf
        int     21h
        lea     si,     kbdBuffer+1     ; преобразование строки в число
        lea     di,     First
        call    Str2Num
        ;ввод второго числа
        mov     ah,     09h
        lea     dx,     msgEnterSecond
        int     21h
        mov     ah,     0Ah             ;ввод строки
        lea     dx,     kbdBuffer
        int     21h
        mov     ah,     09h             ;перевод строки (на новую строку)
        lea     dx,     CrLf
        int     21h
        lea     si,     kbdBuffer+1     ; преобразование строки в число
        lea     di,     Second
        call    Str2Num
 
        ;проверка ввода двух нулей
        mov     ax,     First
        or      ax,     Second
        jz      @@Break
        ;сравнение чисел
        mov     ax,     First
        cmp     ax,     Second
        jg      @@SecondLesser
        mov     ax,     1
        jmp     @@Show
@@SecondLesser:
        mov     ax,     2
 
@@Show:
        push    ax
        mov     ah,     09h
        lea     dx,     msgLesser
        int     21h
        pop     ax
        call    Show_AX
        mov     ah,     09h             ;перевод строки (на новую строку)
        lea     dx,     CrLf
        int     21h
 
        jmp     @@Repeat
 
@@Break:
        mov     ax,     4C00h
        int     21h
main    endp
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
; преобразования строки в число
; на входе:
; ds:[si] - строка с числом
; ds:[di] - адрес числа
; на выходе
; ds:[di] - число
; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
Str2Num PROC
        push    ax
        push    bx
        push    cx
        push    dx
        push    ds
        push    es
        push    si
 
        push    ds
        pop     es
 
        mov     cl, ds:[si]
        xor     ch, ch
 
        inc     si
 
        mov     bx, 10
        xor     ax, ax
 
        ;если в строке первый символ '-'
        ; - перейти к следующему
        ; - уменьшить количество рассматриваемых символов
        cmp     byte ptr [si], '-'
        jne     @@Loop
        inc     si
        dec     cx
@@Loop:
        mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
        mov     [di], ax   ; игнорируем старшее слово
        cmp     dx, 0      ; проверяем, результат на переполнение
        jnz     @@Error
 
        mov     al, [si]   ; Преобразуем следующий символ в число
        cmp     al, '0'
        jb      @@Error
        cmp     al, '9'
        ja      @@Error
        sub     al, '0'
        xor     ah, ah
        add     ax, [di]
        jc      @@Error    ; Если сумма больше 65535
        cmp     ax, 8000h
        ja      @@Error
        inc     si
 
        loop    @@Loop
 
        pop     si         ;проверка на знак
        push    si
        inc     si
        cmp     byte ptr [si], '-'
        jne     @@Check    ;если должно быть положительным
        neg     ax         ;если должно быть отрицательным
        jmp     @@StoreRes
@@Check:                   ;дополнительная проверка, когда при вводе положительного числа получили отрицательное
       or       ax, ax     ;
       js       @@Error
@@StoreRes:                ;сохранить результат
        mov     [di], ax
        clc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
@@Error:
        xor     ax, ax
        mov     [di], ax
        stc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Str2Num ENDP
 
end     main

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

  1. Создаются переменные CrLf, msgEnterFirst, msgEnterSecond, msgLesser, First, Second для хранения символов, строк и чисел.
  2. В основной программе main происходит ввод двух чисел и их сравнение.
  3. Если введены два нуля, программа завершается.
  4. Иначе происходит сравнение введенных чисел.
  5. В зависимости от результата сравнения выводится соответствующий номер наименьшего числа.
  6. После вывода номера программа продолжает выполнение с ввода новых чисел или завершается.

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


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

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

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