Принципы организации ввода/вывода текстовых и числовых данных - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д