Иван
Иван

Ассемблер. Написать маленькую программу вычисления арифметического выражения.

Помогите написать в виде процедуры в отдельном модуле программу, вычисляющее значение заданного выражения для целых чисел. Также написать тестовую программу, вызывающую данную процедуру с произвольными параметрами.

2 + a^2 - d

УМ
Умар Мулла Киличов

В продолжение вашего предыдущего вопроса http://otvet.mail.ru/question/98962339

Вариант программы, где модуль - это включаемый файл (*.inc), а процедура является процедурой только с точки зрения ассемблера. С точки зрения языков высокого уровня - это функция, которая возвращает вычисленное значение основной программе в аккумуляторе, как обычно.

Модуль с процедурой (которая на самом деле функция) :

;Файл module.inc
MyProc proc stdcall uses edx, argA :dword, argD :dword
mov eax, argA
imul eax
add eax, 2
sub eax, argD
ret
MyProc endp

Тестовая программа, вызывающая функцию MyProc:

;Файл main.asm
.386
.model flat, C
option casemap:none

printf proto :dword, :vararg
scanf_s proto :dword, :vararg
sprintf proto :dword, :dword, :vararg
sscanf proto :dword, :dword, :vararg
strcmp proto :dword, :dword
_flushall proto
_getch proto
_exit proto :dword

.data
Prompt db "Введите A: ", 0
Error db "Ошибка! Введите целое число: ", 0
Message db "Вычисленное значение: %d", 0
Press db 10, 10, "Для завершения работы нажмите любую клавишу.. .", 0

.data?
A dd ?
D dd ?
R dd ?

.code
include module.inc

Input proc
local Buff1[1026] :byte
local Buff2[16] :byte
local Format :dword
local Number :dword
RepInp:
mov Format, "s%"
invoke _flushall
invoke scanf_s, addr Format, addr Buff1, 16
mov Format, "d%"
invoke sscanf, addr Buff1, addr Format, addr Number
test eax, eax
jz ErrorInp
invoke sprintf, addr Buff2, addr Format, Number
invoke strcmp, addr Buff1, addr Buff2
test eax, eax
jz QuitInp
ErrorInp:
invoke printf, addr Error
jmp RepInp
QuitInp:
mov eax, Number
ret
Input endp

Start:
invoke printf, addr Prompt
invoke Input
mov A, eax
add byte ptr Prompt + 8, 3
invoke printf, addr Prompt
invoke Input
mov D, eax
invoke MyProc, A, D
mov R, eax
invoke printf, addr Message, R
invoke printf, addr Press
invoke _getch
invoke _exit, 0

end Start

Компиляция и линковка программы:
ml.exe /c /coff main.asm
link.exe main.obj msvcrt.lib /SUBSYSTEM:CONSOLE

Похожие вопросы
написать программу для вычисления факториала больших чисел
помогите написать программу вычисления квадратных уравнений
помогите написать программу в с++ или на ассемблере
написать программу вычесления арифметических выражений и выведения данных на экран. ввод и вывод результатов организоват
Помогите написать программу на языке ассемблера!!!!
Помогите написать программу вычисления площади.
Написать программу вычисления произведения
помогите написать программы в ассемблере
Как написать программу на ассемблере? Что бы выводила какое либо сообщение ?
Ассемблер. Написать маленькую программу вычисления арифметического выражения. Подробности внутри.