Advertisement
Frewlexx

Lab

May 10th, 2023 (edited)
696
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .386
  2. .model flat, stdcall
  3. option casemap :none
  4. include includes\windows.inc
  5. include includes\masm32.inc
  6. include includes\kernel32.inc
  7. include includes\user32.inc
  8. include includes\macros\macros.asm
  9. includelib includes\masm32.lib
  10. includelib includes\kernel32.lib
  11. includelib includes\user32.lib
  12.  
  13. .data
  14.  aszPrompt db 'Expression: ', 0Dh, 0Ah, 0
  15.  aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
  16.  aszResult db 10, 13, "Result of your equation is %d", 0
  17.  
  18.  OpAdd equ '+'
  19.  OpSub equ '-'
  20.  OpMul equ '*'
  21.  OpDiv equ '/'
  22.  
  23.  AllowedChars db '=+-*/0123456789'
  24.  LenAllowedChars equ $-AllowedChars
  25.  OpChars db '=+-*/'
  26.  LenOpChars equ $-OpChars
  27.  
  28. .data?
  29.  hConsoleOutput HANDLE ?
  30.  hConsoleInput HANDLE ?
  31.  Buffer db 1024 dup(?)
  32.  BufLen dd ?
  33.  Result dd ?
  34.  Op1 dd ?
  35.  Op2 dd ?
  36.  Operation db ?
  37. .code
  38.  
  39. PrevOperation proc
  40.    mov eax, [Op1]
  41.    cdq
  42.    mov ebx, [Op2]
  43.    cmp [Operation], OpAdd
  44.    jne @@Sub
  45.    add eax, ebx
  46.    jmp @@Calc
  47.   @@Sub:
  48.    cmp [Operation], OpSub
  49.    jne @@Mul
  50.    sub eax, ebx
  51.    jmp @@Calc
  52.   @@Mul:
  53.    cmp [Operation], OpMul
  54.    jne @@Div
  55.    mul ebx
  56.   @@Div:
  57.    cmp [Operation], OpDiv
  58.    jne @@Calc
  59.    idiv ebx
  60.   @@Calc:
  61.    mov [Op1], eax
  62.    mov [Op2], 0
  63.    mov al, [esi-1]
  64.    mov [Operation], al
  65.   ret
  66. PrevOperation endp
  67.  
  68. main proc
  69.  
  70.   ;получение описателей ввода и вывода консоли
  71.   invoke GetStdHandle, STD_INPUT_HANDLE
  72.   mov hConsoleInput, eax
  73.  
  74.   invoke GetStdHandle, STD_OUTPUT_HANDLE
  75.   mov hConsoleOutput, eax
  76.  
  77.   invoke ClearScreen
  78.  
  79.   ;ввод выражения
  80.   invoke WriteConsole, hConsoleOutput, ADDR aszPrompt, LENGTHOF aszPrompt-1, ADDR BufLen, NULL
  81.   invoke ReadConsole, hConsoleInput, ADDR Buffer, LENGTHOF Buffer, ADDR BufLen, NULL
  82.   lea esi, [Buffer] ;удаление из буффера
  83.   add esi, [BufLen] ;символов перевода строки
  84.   mov [esi-2],word ptr 0
  85.   sub [BufLen], 2
  86.  
  87.   ;обработка выражение во введённой строке
  88.   mov eax, 0
  89.   mov [Op1], 0
  90.   mov [Op2], 0
  91.   mov [Operation], OpAdd
  92.  
  93.   lea esi, [Buffer]
  94.   mov ecx, [BufLen]
  95.   @@GetCmd:
  96.    push ecx
  97.    lodsb
  98.    ;проверка корректности введенных символов
  99.    lea edi, [AllowedChars]
  100.    mov ecx, [LenAllowedChars]
  101.    repne scasb
  102.    jnz @@Next
  103.   @@ProcessChar:
  104.    lea edi, [OpChars]
  105.    mov ecx, [LenOpChars]
  106.    repne scasb
  107.    jz @@DoOperation
  108.   @@TestDigits:
  109.    ;введена цифра
  110.    and eax, 0FFh
  111.    sub al, '0'
  112.    mov ebx, [Op2]
  113.    lea eax, [eax+8*ebx]
  114.    lea eax, [eax+2*ebx]
  115.    mov [Op2], eax
  116.    
  117.    pop ecx
  118.    push ecx
  119.    cmp ecx, 1
  120.    jne @@Next
  121.    
  122.   @@DoOperation:
  123.    ;сначала завершается предыдущая операция
  124.    call PrevOperation
  125.    cmp al, '-'
  126.    jne @@Next
  127.    pop ecx
  128.    jmp @@Break
  129.   @@Next:
  130.    pop ecx
  131.   loop @@GetCmd
  132. @@Break:
  133. ResultShow:
  134.   ;Вывод результатов
  135.   mov eax, [Op1]
  136.   invoke wsprintf, ADDR Buffer, ADDR aszResult, eax
  137.   mov [BufLen], eax
  138.   invoke WriteConsole, hConsoleOutput, ADDR Buffer, BufLen, ADDR BufLen, NULL
  139.  
  140.   ;ожидание нажатия на ENTER
  141.   invoke WriteConsole, hConsoleOutput, ADDR aszPressEnter, LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
  142.   invoke ReadConsole, hConsoleInput, ADDR Buffer, LENGTHOF Buffer, ADDR BufLen, NULL
  143.  
  144.   invoke ExitProcess, 0
  145. main endp
  146.  
  147. end main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement