Пётр Дармограй
Пётр Дармограй

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

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

2 + a^2 - d

Валерия Корзенникова
Валерия Корзенникова

> Помогите написать в виде процедуры в отдельном модуле программу
В отдельном модуле - это значит раздельная компиляция с последующей линковкой или просто в include-файле?
И слово "процедура" здесь использовано в том же смысле, что и в языках высокого уровня (т. е. возврат результата по ссылке) или в общем ассемблерном смысле?

Программа на ассемблере. Основной модуль и модуль с процедурой компилируются раздельно, затем получившиеся объектные файлы линкуются в один исполняемый файл.
Результат вычисления возвращается процедурой основной программе по ссылке.

Модуль с процедурой:

;Файл Module.asm
name Module
ideal
p386
model flat, stdcall

public MyProc

codeseg
proc MyProc uses eax edx, A :dword, D :dword, Result :dword
mov eax, [A]
imul eax
add eax, 2
sub eax, [D]
mov edx, [Result]
mov [edx], eax
ret
endp

end

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

;Файл 98962339.asm
title N98962339
ideal
p386
model flat, stdcall
includelib "imp32i.lib"
includelib "import32.lib"

procdesc MyProc :dword, :dword, :dword
procdesc ExitProcess :dword
procdesc GetStdHandle :dword
procdesc WriteConsoleA :dword, :dword, :dword, :dword, :dword
procdesc ReadConsoleA :dword, :dword, :dword, :dword, :dword
procdesc lstrlenA :dword
procdesc wsprintfA C :dword:?

dataseg
Prompt db "Введите A: ", 0
Error db "Ошибка! Введите целое число: ", 0
Message db "Вычисленное значение: ", 0
Press db 10, 10, "Для завершения работы нажмите <Еntеr>...", 0
Format db "%d", 0

udataseg
A dd ?
D dd ?
R dd ?

codeseg
Start:
call Print, offset Prompt
call Input
mov [A], eax
add [byte Prompt + 8], 3
call Print, offset Prompt
call Input
mov [D], eax
call MyProc, [A], [D], offset R
call Print, offset Message
call WriteInt, [R]
call Print, offset Press
call Input
call ExitProcess, 0

proc WriteInt, Number :dword
local Buff[1024] :byte
lea eax, [Buff]
call wsprintfA, eax, offset Format, [Number]
lea eax, [Buff]
call Print, eax
ret
endp

proc Print, Str :dword
local hStdOut :dword
call GetStdHandle, -11
mov [hStdOut], eax
call lstrlenA, [Str]
call WriteConsoleA, [hStdOut], [Str], eax, 0, 0
ret
endp

proc Input uses ebx ecx edx esi
local Buff[1032] :byte
local Len :dword
RepInp:
call GetStdHandle, -10
lea ebx, [Buff]
lea edx, [Len]
call ReadConsoleA, eax, ebx, 1026, edx, 0
lea esi, [Buff]
mov ecx, [Len]
xor ebx, ebx
lodsb
cmp al, '-'
je NextSymb
cmp al, '+'
je NextSymb
DoLoop:
cmp al, 13
je SignInp
sub al, '0'
jb ErrorInp
cmp al, 9
jbe DigitInp
ErrorInp:
call Print, offset Error
jmp RepInp
DigitInp:
movzx eax, al
xchg ebx, eax
mov edx, 10
mul edx
add ebx, eax
NextSymb:
lodsb
loop DoLoop
SignInp:
cmp [byte Buff], '-'
jne QuitInp
neg ebx
QuitInp:
mov eax, ebx
ret
endp
end Start

Командный файл (батник) для трансляции и сборки программы:
tasm32 /ml /l /q /zn 98962339.asm
tasm32 /ml /l /q /zn module.asm
tlink32 -Tpe -ap -c -x 98962339.obj module.obj

P.S. Почему-то у меня подозрение, что под "ассемблером" здесь подразумевался какой-нибудь Delphi или C++ с ассемблерными вставками.

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