Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2011, 21:26   #1
Namolem
Oo
Форумчанин
 
Аватар для Namolem
 
Регистрация: 10.10.2009
Сообщений: 350
По умолчанию Как в DOS принято вызывать процедуры

Очень мусорный код, хочу немного распутать. Как в DOS'e принято делать процедуры/функции для:

void func(int a,int b);

void func(void);

int func(int a,int b);

?

Как обычно передаются/возвращаются данные? Через регистры, стек, еще как-то? Интересует компактный вид

Компилятор TASM
Namolem вне форума Ответить с цитированием
Старый 16.11.2011, 22:39   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

вообще? если вообще, то как хочешь. эти соглашения в DOS никому не нужны.

DOS давно пора уже забыть. DOS изучают разве что в универах, да и то не всегда...
собственно и TASM тоже пора уже на помойку выкинуть! он устарел по всем параметрам
rpy3uH вне форума Ответить с цитированием
Старый 16.11.2011, 22:58   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Как обычно передаются/возвращаются данные? Через регистры, стек, еще как-то? Интересует компактный вид
если именно про те примеры, то ответа нет, ибо не указали соглашение о вызове.

возврат в регистре rax/eax/ax
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.11.2011, 00:03   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Там тоже разные соглашения вызовов были, как и в windows. У cdecl и pascal ноги оттуда растут, в частности.
Потому действительно, если никаких других ограничений нет - можно выбирать любое соглашение.
Son Of Pain вне форума Ответить с цитированием
Старый 17.11.2011, 06:11   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Namolem
Это не зависит ни от DOS'а ни от Windows. Это особенность синтаксиса конкретного ассемблера. Например, для TASM и MASM: при передаче аргументов через стек командой PUSH можно пренебречь.
Расширенный синтаксис инструкции CALL в TASM:
CALL имя_процедуры [язык] [, аргументы]
Параметр команды CALL «язык» определяет способ передачи аргументов процедуре и способ очистки стека от переданных аргументов. В качестве «языка» допускается применение ключевых слов: C, CPP, PASCAL, BASIC, PROLOG или NOLANGUAGE. Если тип языковых соглашений не задан, то используется тип, указанный в директиве MODEL или явное указание типа языковых соглашений в объявлениях PROC или PUBLIC перекрывает для данного идентификатора тип, назначенный директивой MODEL. В языках PASCAL, BASIC и PROLOG аргументы процедуры будут переданы в стек в том же порядке, в котором они указываются в операторе вызова процедуры, а в языках C/C++ используется обратный порядок.
Языковые соглашения определяют порядок очистки стека от переданных аргументов. В языках C/C++ это возлагается на вызывающую процедуру, а во всех остальных на вызываемую. Следующая программа, написанная под TASM, вызывает одну и туже процедуру t1 с параметром PASCAL и C.
Процедура t1 закончена директивой RET, а компилятор, в зависимости от языкового соглашения, сам подставит RETN/F или RETN/F число
Код:
.386
.model flat
.code
start: call t1 PASCAL,1,2,3 ;вызываем t1(1,2,3) по 
; соглашению о стиле вызова функций как в языке PASCAL
call t1 C,1,2,3;вызываем t1(1,2,3) по соглашению о стиле
; вызова функций как в языке C/С++
retn; выход из программы
t1 proc; описание процедуры t1
ret; выход из подпрограммы
t1 endp
end start
Будет скомпилирована в следующую последовательность команд:
Код:
push 1
push 2
push 3
call 4010A1h
push 3
push 2
push 1
call 4010A1h
add esp,12; очистка стека от 12 байт (в исходном тексте отсутствует)
retn
4010A1h: retn
Видно, что в зависимости от параметра PASCAL или C, изменился порядок следования аргументов процедуры t1, а после call t1 C,1,2,3 появилась инструкция add esp,12, которой не было в первоначальном тексте.
MASM не позволяет записать аргументы CALL через запятую – для этого в MASM есть директива INVOKE. Для использования INVOKE требуется первоначально определить прототип процедуры, то есть указать количество аргументов и их тип:
имя_ процедуры PROTO [расстояние] [язык] [, [параметр]:тип]...
Скомпилированные программы будут отличаться в зависимости от параметров директивы model, proto, proc или от ключей, использованных при компиляции (/Gc или /Gd). Следующая программа использует соглашение о стиле вызова функций как в FORTRAN или в PASCAL:
Код:
.386
.model flat 
.code
t1 PROTO pascal,:DWORD,:DWORD,:DWORD; прототип процедуры t1
start:  invoke t1, 1, 2, 3
retn; выход из программы
t1 proc pascal, a:DWORD,b:DWORD,d:DWORD; описание процедуры t1
ret; выход из подпрограммы
t1 endp
end start
Эта программа компилируется в следующую последовательность
команд:
Код:
push 1
push 2
push 3
call 4000D0h
retn; выход из программы
4000D0: retn 0Ch; очистка стека от аргументов будет сделана t1
А эта программа использует соглашение о стиле вызова функций как C/C++ в директиве model:
Код:
.386
.model flat, c
.code
t1 PROTO :DWORD,:DWORD,:DWORD
start:  invoke t1, 1, 2, 3
retn
t1 proc a:DWORD,b:DWORD,d:DWORD
; функции будет передано три аргумента a, b и d
ret
t1 endp
end start
и компилируется в в следующую последовательность команд:
Код:
push 3
push 2
push 1
call 4000D3h
add esp,0Ch
; очистка стека от аргументов будет сделана основной программой
retn; выход из программы
4000D3: retn; выход из подпрограммы без очистки от аргументов

Последний раз редактировалось Mikl___; 17.11.2011 в 09:07.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
где хранить данные принято? yuran111 Общие вопросы Delphi 36 12.05.2011 00:23
переменные или что-нибудь, чтоб не вызывать сто раз JavaScript Ihavoker HTML и CSS 3 27.01.2011 06:26
Как вызывать функции одного или др. класса по определённому спецификатору? GerNick Общие вопросы C/C++ 2 20.12.2010 16:34
Как в С# вызывать вторую форму по F1 Linore Общие вопросы .NET 20 15.02.2010 09:35
Процедуры без Bios и без Dos,бывают? codeok Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 31.10.2008 03:17