Нахождение наибольшего числа из трех введенных - 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). Он находит наибольшее число из трех введенных пользователем. Пользователю предлагается ввести целое число, при этом вводится проверка на корректность ввода: если пользователь вводит отрицательное число, выводится сообщение об ошибке. Если пользователь вводит ноль или пустую строку, выводится сообщение об ошибке. Если пользователь нажимает клавишу , введенное число считается некорректным и выводится сообщение об ошибке. В конце работы программы выводится наибольшее из введенных чисел.

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


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

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

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