Другие языки программирования и технологии

Помогите, разработать программу вычисления двух выражений, в ассемблереX= (a/2+b^2)/3*cY= (b^3-(12+x)/a)/c+2

Компилятор MASM + Masm32 SDK, процессор i80386 + сопроцессор i80387 или старше, консольная программа для 32-разрядной Windows:

.386
.model flat, stdcall
option casemap:none

include windows.inc
include kernel32.inc
include msvcrt.inc
include masm32.inc
includelib kernel32.lib
includelib msvcrt.lib
includelib masm32.lib

Print proto stdcall :dword
Input proto stdcall :dword
WriteDouble proto stdcall :qword
Inkey proto

.stack 100h

.data
PromptA db 'Введите A: ', 0
PromptB db 'Введите B: ', 0
PromptC db 'Введите C: ', 0
ResultX db 10, 'X = ', 0
ResultY db 13, 10, 'Y = ', 0
QuitPrompt db 13, 10, 10, 'Для завершения работы нажмите любую клавишу... ', 0

.data?
hStdIn dd ?
hStdOut dd ?
VarA dq ?
VarB dq ?
VarC dq ?
VarX dq ?
VarY dq ?
IntBuf dw ?

.code
N84987611:
    invoke GetStdHandle, STD_INPUT_HANDLE
    mov hStdIn, eax
    invoke GetStdHandle, STD_OUTPUT_HANDLE
    mov hStdOut, eax
    invoke Print, addr PromptA
    invoke Input, addr VarA
    invoke Print, addr PromptB
    invoke Input, addr VarB
    invoke Print, addr PromptC
    invoke Input, addr VarC

    finit
;1-е выражение
    fld VarA
    mov word ptr IntBuf, 2
    fidiv word ptr IntBuf
    fld VarB
    fld st
    fmul
    fadd
    mov word ptr IntBuf, 3
    fidiv word ptr IntBuf
    fmul VarC
    fst VarX
;2-е выражение
    mov word ptr IntBuf, 12
    fiadd word ptr IntBuf
    fdiv VarA
    fld VarB
    fld st
    fld st
    fmul
    fmul
    fsub st, st(1)
    fdiv VarC
    mov word ptr IntBuf, 2
    fiadd word ptr IntBuf
    fstp VarY
    ffree st

    invoke Print, addr ResultX
    invoke WriteDouble, VarX
    invoke Print, addr ResultY
    invoke WriteDouble, VarY

    invoke Print, addr QuitPrompt
    invoke Inkey
    invoke ExitProcess, NULL

Print proc param :dword
    invoke lstrlenA,param
    invoke WriteConsole, hStdOut, param, eax, NULL, NULL
    ret
Print endp

Input proc param :dword
    local Len :dword
    local Buffer[1026] :byte
    invoke ReadConsole, hStdIn, addr Buffer, 1026, addr Len, NULL
    invoke StrToFloat, addr Buffer, param
    ret
Input endp

WriteDouble proc param :qword
    local Buffer[32] :dword
    invoke FloatToStr, param, addr Buffer
    invoke Print, addr Buffer
    ret
WriteDouble endp

Inkey proc
    invoke crt__kbhit
    test eax, eax
    jz Inkey
    ret
Inkey endp

    end N84987611



P.S. Порядок выполнения арифметических операций такой же, как и в программировании при однострочной записи выражений.
Ошибки ввода и вычислений не проверяются.
Максим Смирнов
Максим Смирнов
51 590
Лучший ответ

Похожие вопросы