![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Oo
Форумчанин
Регистрация: 10.10.2009
Сообщений: 350
|
![]()
Очень мусорный код, хочу немного распутать. Как в DOS'e принято делать процедуры/функции для:
void func(int a,int b); void func(void); int func(int a,int b); ? Как обычно передаются/возвращаются данные? Через регистры, стек, еще как-то? Интересует компактный вид Компилятор TASM |
![]() |
![]() |
![]() |
#2 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
![]()
вообще? если вообще, то как хочешь. эти соглашения в DOS никому не нужны.
DOS давно пора уже забыть. DOS изучают разве что в универах, да и то не всегда... ![]() собственно и TASM тоже пора уже на помойку выкинуть! он устарел по всем параметрам |
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Цитата:
возврат в регистре rax/eax/ax Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
![]() |
![]() |
![]() |
#4 |
Участник клуба
Регистрация: 23.12.2010
Сообщений: 1,129
|
![]()
Там тоже разные соглашения вызовов были, как и в windows. У cdecl и pascal ноги оттуда растут, в частности.
Потому действительно, если никаких других ограничений нет - можно выбирать любое соглашение. |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 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 число Код:
Код:
MASM не позволяет записать аргументы CALL через запятую – для этого в MASM есть директива INVOKE. Для использования INVOKE требуется первоначально определить прототип процедуры, то есть указать количество аргументов и их тип: имя_ процедуры PROTO [расстояние] [язык] [, [параметр]:тип]... Скомпилированные программы будут отличаться в зависимости от параметров директивы model, proto, proc или от ключей, использованных при компиляции (/Gc или /Gd). Следующая программа использует соглашение о стиле вызова функций как в FORTRAN или в PASCAL: Код:
команд: Код:
Код:
Код:
Последний раз редактировалось Mikl___; 17.11.2011 в 09:07. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
где хранить данные принято? | 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 |