В продолжение вашего предыдущего вопроса 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