Вывод номера меньшего из двух введённых чисел - 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
Объяснение кода листинга программы
- Создаются переменные
CrLf
,msgEnterFirst
,msgEnterSecond
,msgLesser
,First
,Second
для хранения символов, строк и чисел. - В основной программе
main
происходит ввод двух чисел и их сравнение. - Если введены два нуля, программа завершается.
- Иначе происходит сравнение введенных чисел.
- В зависимости от результата сравнения выводится соответствующий номер наименьшего числа.
- После вывода номера программа продолжает выполнение с ввода новых чисел или завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д