Принципы организации ввода/вывода текстовых и числовых данных - Assembler

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

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

В ходе выполнения лабораторной работы необходимо разработать программу, осу-ществляющую ввод и обработку цифровых данных по заданной формуле. Ввод исходных данных осуществляется с клавиатуры, вывод результатов обработки производится на экран компьютера. (A v B)*D/(C-1)

Решение задачи: «Принципы организации ввода/вывода текстовых и числовых данных»

textual
Листинг программы
.model tiny
.686
.code
    org 100h
again:  mov dx, offset req
    mov ah, 9h
    int 21h
    mov ecx,11      ; желаемое кол-во цифр
    call    _cgetl
    jc  quit        
    call    crlf
    call    _cputl
    call    crlf
    jmp again
quit:   ret
 
; 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:$'
        end again

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


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

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

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