Нахождение наибольшего числа из трех введенных - Assembler
Формулировка задачи:
Доброго времени суток! Друзья, очень нужна ваша помощь. В ассемблере не разбираюсь... Нужно сделать задание:
Вывести на экран наибольшее из трех однозначных десятичных беззнаковых чисел введенных с клавиатуры. Нахождение наибольшего реализовать как процедуру с передачей ей параметров ( трех введенных чисел) через стек.
Буду очень признателен! Заранее спасибо!
Решение задачи: «Нахождение наибольшего числа из трех введенных»
textual
Листинг программы
;MASM .model tiny .686 .code org 100h start: call getval mov esi, eax inc byte ptr [num] call getval mov edi, eax inc byte ptr [num] call getval cmp eax, esi cmovs eax,esi cmp eax, edi cmovs eax,edi mov ebx,eax mov dx, offset res mov ah, 9h int 21h mov eax, ebx call _cputl ret getval: mov dx, offset req mov ah, 9h int 21h mov ecx,11 ; желаемое кол-во цифр call _cgetl jc quit call crlf ret quit: int 20h ; eax - signed long _cputl: ;;; push ebx mov ebx, eax neg ebx cmovs ebx, eax js @F mov al, '-' int 29h @@: mov eax, ebx ;;; pop ebx ; eax - unsigned long _cputul: ;;; pushad xor ecx, ecx mov ebx, 0Ah xor esi, esi xor edi, edi @@: xor edx, edx inc ecx idiv ebx shld edi, esi, 4 shl esi, 4 or si, dx test eax, eax jnz @B mov edx, esi @@: mov al, dl and al, 0fh or al, 30h shrd edx, edi, 4 shr edi, 4 int 29h loop @B ;;; popad ret ; console - get signed long ; ввод с консоли целого знакового с отработкой удаления символа ; на входе: CX - кол-во цифр ; на выходе: EAX - введённое число или -1, если нажат <ESC>, а также CY=1 _cgetl: pushad xor edx, edx mov ebp, edx mov ebx, ecx @l: call getch or al,al jz @l cmp al, 1Bh ; <ESC>? jz cancel cmp al, 0Dh ; <Enter>? jz done cmp al, '-' jz sign cmp al, 08h ; <BkSp>? jnz @F call rubout jmp @l @@: cmp al, 30h jb @l cmp al, 39h ja @l movzx eax,al ; убираем из eax лишнее lea edx,[edx*4+edx] ; EDX = EDX * 5 lea edx,[edx*2+eax-48] ; EDX = EDX * 2 + символ из AL - '0' int 29h loop @l ; выход done: mov eax, edx ; or ebp, ebp jz @F neg eax @@: clc jmp ex ; отмена, взводим Carry(CY), EAX = -1 cancel: xor eax, eax dec eax ; EAX = -1 stc ex: mov ss:[esp+1Ch], eax popad ret ; sign: cmp ebx, ecx ; первый символ? ja @l ; нет inc ebp int 29h jmp @l ; ввод символа getch: xor ax, ax int 16h ret ; новая строка crlf: push ax mov ax, 0A0Dh int 29h xchg al,ah int 29h pop ax ret ; отработка <BkSp> rubout: cmp ebx, ecx ; первый символ? ja @r ; нет test ebp,ebp ; минус вводили? jz @e ; нет dec ebp ; убираем флаг jmp @bs ; стираем "-" с экрана @r: mov eax, edx xor edx, edx idiv dword ptr ten ; делим наше вводимое число на 10. mov edx,eax inc ecx @bs: call bksp @e: ret ; курсор взад на 1 позицию bksp: mov ax, 2008h int 29h xchg ah,al int 29h xchg ah,al int 29h ret .data ten dd 0Ah req db '<Esc> or enter number[1]:$' num = $ - 4 res db 'Max:$' end start
Объяснение кода листинга программы
Код написан на ассемблере для операционной системы Windows (возможно, также может работать на DOS).
Он находит наибольшее число из трех введенных пользователем.
Пользователю предлагается ввести целое число, при этом вводится проверка на корректность ввода: если пользователь вводит отрицательное число, выводится сообщение об ошибке.
Если пользователь вводит ноль или пустую строку, выводится сообщение об ошибке.
Если пользователь нажимает клавишу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д