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

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

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

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

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

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf            db      0Dh, 0Ah, '$'
  9.  
  10.         msgEnterFirst   db      'Enter 1st number: ', '$'
  11.         msgEnterSecond  db      'Enter 2nd number: ', '$'
  12.         msgLesser       db      'The index of the lesser number: ', '$'
  13.         First           dw      ?
  14.         Second          dw      ?
  15.  
  16.         kbdBuffer       db      6, 0, 7 dup(?)
  17. .code
  18.  
  19. main    proc
  20.         mov     ax,     @data
  21.         mov     ds,     ax
  22.  
  23. @@Repeat:
  24.         ;ввод первого числа
  25.         mov     ah,     09h
  26.         lea     dx,     msgEnterFirst
  27.         int     21h
  28.         mov     ah,     0Ah             ;ввод строки
  29.         lea     dx,     kbdBuffer
  30.         int     21h
  31.         mov     ah,     09h             ;перевод строки (на новую строку)
  32.         lea     dx,     CrLf
  33.         int     21h
  34.         lea     si,     kbdBuffer+1     ; преобразование строки в число
  35.         lea     di,     First
  36.         call    Str2Num
  37.         ;ввод второго числа
  38.         mov     ah,     09h
  39.         lea     dx,     msgEnterSecond
  40.         int     21h
  41.         mov     ah,     0Ah             ;ввод строки
  42.         lea     dx,     kbdBuffer
  43.         int     21h
  44.         mov     ah,     09h             ;перевод строки (на новую строку)
  45.         lea     dx,     CrLf
  46.         int     21h
  47.         lea     si,     kbdBuffer+1     ; преобразование строки в число
  48.         lea     di,     Second
  49.         call    Str2Num
  50.  
  51.         ;проверка ввода двух нулей
  52.         mov     ax,     First
  53.         or      ax,     Second
  54.         jz      @@Break
  55.         ;сравнение чисел
  56.         mov     ax,     First
  57.         cmp     ax,     Second
  58.         jg      @@SecondLesser
  59.         mov     ax,     1
  60.         jmp     @@Show
  61. @@SecondLesser:
  62.         mov     ax,     2
  63.  
  64. @@Show:
  65.         push    ax
  66.         mov     ah,     09h
  67.         lea     dx,     msgLesser
  68.         int     21h
  69.         pop     ax
  70.         call    Show_AX
  71.         mov     ah,     09h             ;перевод строки (на новую строку)
  72.         lea     dx,     CrLf
  73.         int     21h
  74.  
  75.         jmp     @@Repeat
  76.  
  77. @@Break:
  78.         mov     ax,     4C00h
  79.         int     21h
  80. main    endp
  81. ; выводит число из регистра AX на экран
  82. ; входные данные:
  83. ; ax - число для отображения
  84. Show_AX proc
  85.         push    ax
  86.         push    bx
  87.         push    cx
  88.         push    dx
  89.         push    di
  90.  
  91.         mov     cx, 10
  92.         xor     di, di          ; di - кол. цифр в числе
  93.  
  94.         ; если число в ax отрицательное, то
  95.         ;1) напечатать '-'
  96.         ;2) сделать ax положительным
  97.         or      ax, ax
  98.         jns     @@Conv
  99.         push    ax
  100.         mov     dx, '-'
  101.         mov     ah, 2           ; ah - функция вывода символа на экран
  102.         int     21h
  103.         pop     ax
  104.  
  105.         neg     ax
  106.  
  107. @@Conv:
  108.         xor     dx, dx
  109.         div     cx              ; dl = num mod 10
  110.         add     dl, '0'         ; перевод в символьный формат
  111.         inc     di
  112.         push    dx              ; складываем в стэк
  113.         or      ax, ax
  114.         jnz     @@Conv
  115.         ; выводим из стэка на экран
  116. @@Show:
  117.         pop     dx              ; dl = очередной символ
  118.         mov     ah, 2           ; ah - функция вывода символа на экран
  119.         int     21h
  120.         dec     di              ; повторяем пока di<>0
  121.         jnz     @@Show
  122.  
  123.         pop     di
  124.         pop     dx
  125.         pop     cx
  126.         pop     bx
  127.         pop     ax
  128.         ret
  129. Show_AX endp
  130.  
  131. ; преобразования строки в число
  132. ; на входе:
  133. ; ds:[si] - строка с числом
  134. ; ds:[di] - адрес числа
  135. ; на выходе
  136. ; ds:[di] - число
  137. ; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
  138. Str2Num PROC
  139.         push    ax
  140.         push    bx
  141.         push    cx
  142.         push    dx
  143.         push    ds
  144.         push    es
  145.         push    si
  146.  
  147.         push    ds
  148.         pop     es
  149.  
  150.         mov     cl, ds:[si]
  151.         xor     ch, ch
  152.  
  153.         inc     si
  154.  
  155.         mov     bx, 10
  156.         xor     ax, ax
  157.  
  158.         ;если в строке первый символ '-'
  159.         ; - перейти к следующему
  160.         ; - уменьшить количество рассматриваемых символов
  161.         cmp     byte ptr [si], '-'
  162.         jne     @@Loop
  163.         inc     si
  164.         dec     cx
  165. @@Loop:
  166.         mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
  167.         mov     [di], ax   ; игнорируем старшее слово
  168.         cmp     dx, 0      ; проверяем, результат на переполнение
  169.         jnz     @@Error
  170.  
  171.         mov     al, [si]   ; Преобразуем следующий символ в число
  172.         cmp     al, '0'
  173.         jb      @@Error
  174.         cmp     al, '9'
  175.         ja      @@Error
  176.         sub     al, '0'
  177.         xor     ah, ah
  178.         add     ax, [di]
  179.         jc      @@Error    ; Если сумма больше 65535
  180.         cmp     ax, 8000h
  181.         ja      @@Error
  182.         inc     si
  183.  
  184.         loop    @@Loop
  185.  
  186.         pop     si         ;проверка на знак
  187.         push    si
  188.         inc     si
  189.         cmp     byte ptr [si], '-'
  190.         jne     @@Check    ;если должно быть положительным
  191.         neg     ax         ;если должно быть отрицательным
  192.         jmp     @@StoreRes
  193. @@Check:                   ;дополнительная проверка, когда при вводе положительного числа получили отрицательное
  194.        or       ax, ax     ;
  195.        js       @@Error
  196. @@StoreRes:                ;сохранить результат
  197.         mov     [di], ax
  198.         clc
  199.         pop     si
  200.         pop     es
  201.         pop     ds
  202.         pop     dx
  203.         pop     cx
  204.         pop     bx
  205.         pop     ax
  206.         ret
  207. @@Error:
  208.         xor     ax, ax
  209.         mov     [di], ax
  210.         stc
  211.         pop     si
  212.         pop     es
  213.         pop     ds
  214.         pop     dx
  215.         pop     cx
  216.         pop     bx
  217.         pop     ax
  218.         ret
  219. Str2Num ENDP
  220.  
  221. end     main

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

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

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


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

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

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы