Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
AAAAAlexeyyyyy
110 / 7 / 0
Регистрация: 01.05.2014
Сообщений: 101
1

Функция с переменным числом параметров

26.01.2016, 14:15. Просмотров 849. Ответов 11
Метки нет (Все метки)

Привет знатоками, вопрос следующий.
В некоторых языках высокого уровня, существуют функции с переменным числом аргументов.
Вопрос как в функции на asm организовать приём переменного числа передаваемых параметров?
Заранее благодарен Алексей.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2016, 14:15
Ответы с готовыми решениями:

Функция с переменным числом параметров находящая максимальный элемент в списке параметров
Написать функцию с переменным числом параметров:Максимальный из элементов в...

Функция с переменным числом параметров, как узнать кличество переданных параметров?
Добрый вечер, можно не использовать int n, а каким то другим способом узнать...

Функция с переменным числом параметров
Функция с переменным числом параметров. Задание: Среднее арифметическое с...

Функция с переменным числом параметров
Кто может помочь с задачей? Нужно на C написать В главной функции main ( )...

Функция с переменным числом параметров
Написать функцию с переменным кол-вом параметров (использовать бестиповой...

11
Mikl___
Автор FAQ
11986 / 6253 / 596
Регистрация: 11.11.2010
Сообщений: 11,314
27.01.2016, 04:25 2
AAAAAlexeyyyyy,
WinAPI есть функция wsprintf, сколько ей будет передано параметров знает только программист который ее вызывает, на его совести остается также очистка стека от переданных параметров
Assembler
1
2
3
4
5
6
7
push параметр N
...
push параметр 3
push параметр 2
push параметр 1
call wsprintf
add esp,4*N
где N - конкретное число параметров
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
27.01.2016, 08:45 3
AAAAAlexeyyyyy, для ответа на твой вопрос вовсе необязательно быть знатоком, достаточно просто почитать доку (на тот же масм хотя бы, например ;о)

Вот копипаста из MASM32.HLP:
The VARARG attribute allows you to pass a variable number of
arguments to a procedure. The VARARG parameter receives a near
pointer to an array of WORD elements (DWORD if a far address is
passed). You can apply the VARARG attribute only to the last
parameter in a procedure definition. You can only use VARARG in
procedures when the C, SYSCALL, or STDCALL language types are in
effect.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
       addup   PROTO NEAR C, parmcount:WORD, parmvalues:VARARG
 
 
               invoke  addup, 3, 5, 2, 4
 
       addup   PROC NEAR C, parmcount:WORD, parmvalues:VARARG
               xor     ax, ax
               xor     bx, bx
               mov     cx, parmcount
 
               .REPEAT
               add     ax, parmvalues[bx]
               inc     bx
               inc     bx
               .UNTILCXZ
 
               ret
       addup   ENDP
Если и это непонятно (хотя казалось бы ;о) то можно и в хухеле пошарить (если там тебя не зобанели, канешни ;о)
0
AAAAAlexeyyyyy
110 / 7 / 0
Регистрация: 01.05.2014
Сообщений: 101
27.01.2016, 19:45  [ТС] 4
спасибо за ответы, это всЁ понятно, не понятно следующее)
Я - функция которая должна принять переменное количество параметров (spritnf например) , после зануления вершины стека, сколько раз я должна сделать bp+4 и когда я должна остановиться, считывая данные? в sprintf не передается заранее количество параметров (хотя может стоит залесть внутрь и посмотреть, может при компиляции чтото такое передаётся). по поводу vararg там вообще другая каша, там передаётся указатель на массив элементов так же без указания сколько элементов в массиве. Я спросил потому что, может этот вопрос уже решён давно, чтобы мне не мудрить. например есть метод перекрестных ссылок при создании безразмерных массивов - может он и применяется в этом случае, когда каждый элемент (параметр) содержит адрес следующего элемента, последний элемент соответственно не содержит следующего адреса, поэтому он считается последним, выборка прекращается, может быть последний элемент массива (varargs) нулевой поэтому он считается последним? итд.
заранее благодарен Алексей.

Добавлено через 1 час 42 минуты
Вот в гугеле) накопал. Может кому пригодиться, все оказалось очень просто.
Перед посылкой в "безразмерную" функцию) копируется sp -> eax, после этого идет invoke. А по прибытии сама функция, вычитает sp-eax и получает конец очереди). ну естествнно за минусом всех адресов возврата можно получить длинну очереди. Всё достаточно просто и без заморочек)
да товарищи просьба, может, кто нибудь скинуть ссылку или в личку хелпер по masmу, у меня он в виде chm и почему то не открывается может у кого hlp есть.
Заранее благодарен Алексей
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
28.01.2016, 10:07 5
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
зануление вершины стека
Что это, например? ;о)

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
по поводу vararg там вообще другая каша, там передаётся указатель на массив элементов так же без указания сколько элементов в массиве
Это не так - из приведённого здесь примера очевидно, что передаётся именно некоторое число параметров, число которых указано в первом (а не указатель на их массив, например ;о)

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
в sprintf не передается заранее количество параметров
Скорее всего в этой функции идёт последовательный анализ параметров. Переход к следующему параметру происходит, если это нужно (по её внутренней логике работы, например ;о)

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Вот в гугеле) накопал. Может кому пригодиться, все оказалось очень просто. Перед посылкой в "безразмерную" функцию) копируется sp -> eax, после этого идет invoke. А по прибытии сама функция, вычитает sp-eax и получает конец очереди)
Нет уж, спасибо, нам такого не нать - ведь даже копирование sp->eax невозможно (и хде ты такое накопал, например ;о)

А вообще передача произвольного числа параметров видимо подразумевает и свободу по определению их числа: то ли непосредственной передачей этого числа, то ли исходя из логики работы функции (то ли ещё как - свобода, однако ;о)

Добавлено через 22 минуты
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Всё достаточно просто и без заморочек)
Самое простое решение - тупо передать число параметров, например ;о)

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
просьба, может, кто нибудь скинуть ссылку или в личку хелпер по masmу
Хелпер по масму есть в пакете масма (он небольшой - скачай отсюда http://masm32.com/, установи и изучи, и тогда, возможно, не придётся задавать столько вопросов, например ;о)
1
Constantin Cat
2377 / 1073 / 368
Регистрация: 28.02.2015
Сообщений: 2,378
Завершенные тесты: 1
28.01.2016, 13:08 6
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
Я - функция которая должна принять переменное количество параметров (spritnf например) , после зануления вершины стека, сколько раз я должна сделать bp+4 и когда я должна остановиться, считывая данные?
Ну Вы блин даете.
Смотрим описание:
Assembler
1
2
3
4
5
int wsprintf(      
    LPTSTR lpOut,
    LPCTSTR lpFmt,
     ...
)
Assembler
1
2
3
4
5
int sprintf(
    LPTSTR lpOut,
    LPCTSTR lpFmt,
 ...
)
Вторымм параметром передаваемым функции идет:
lpFmt - [ in ] Указатель на строку с завершающим нулем, которая содержит в себе спецификации управления форматом. В дополнение к обычным символам ASCII спецификация формата для каждого параметра показывается в этой строке
Содержимое этой стоки имеет вид, к примеру: '%s %d %c' - проанализировав её, функция знает, что 3-и параметра, т.е. это строка, число и символ. О переменном числе параметорв речь не идет. Меняете строку формата, соответственно, меняется количество и тип параметров.
0
AAAAAlexeyyyyy
110 / 7 / 0
Регистрация: 01.05.2014
Сообщений: 101
28.01.2016, 23:21  [ТС] 7
Constantin Cat, спасибо я тоже об этом подумал - насчёт строки формата(lpFmt), такая же информация и в гугеле. но в строке формата может быть озаглавлен формат для вывода например 20 разных символов, а передаваемый параметр только один или два(( в связи с чем мой первоначальный вопрос (я - функция) и как узнать когда прекратить bp+4? - остаётся в силе. Дополнительно, я влез в функцию (sprintf) оказалось что, тот метод который я описал (mov eax,esp) также не используется((
Просьба остаётся в силе у кого есть masm32.hlp а то у меня chm из инсталятора masm не пускается.
KyberMax, вы очень воинственны))
0
Constantin Cat
2377 / 1073 / 368
Регистрация: 28.02.2015
Сообщений: 2,378
Завершенные тесты: 1
29.01.2016, 15:18 8
1)В строке формата может быть сколько угодно, каких угодно символов, для функции важны только спецификаторы типа:d,i,o,u,x,f,e,g,a,c,s,p,n стоящие после знака %, именно это определяет количество параметров извлекаемых из стека. Это ответ на Ваш вопрос:
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
как узнать когда прекратить
2)
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
20 разных символов, а передаваемый параметр только один или два
Подобные функции не чистят за собой стек, этим занимается вызывающий код. Поэтому недостающее количество может уже находится в стеке, от предыдущих вызовов. Тут важно говорить о коде в целом, а не вырванной из контекста функции.
0
AAAAAlexeyyyyy
110 / 7 / 0
Регистрация: 01.05.2014
Сообщений: 101
29.01.2016, 19:14  [ТС] 9
Constantin Cat, я боюсь вы не совсем поняли выражение
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
но в строке формата может быть озаглавлен формат для вывода например 20 разных символов
естественно имелось в виду то что вы называете спецификаторы типа (в Си это называется спецификатор формата, определяет формат вывода данных). так вот в строке формата их может быть 20 или более (20 различных комбинаций %d, %s, %x итд - 20 шт в одной строке формата) а аргументов всего один или два.
Hапример вы организовали программу суммирования элементов сделали строку в которую вводят элементы через запятую(разделитель) просуммировали, (естественно заранее вы не знаете сколько элементов будет введено) и должны вывести строку (sprintf) "Сумма элементов" эл1+эл2+эл3+ .... итд = сумма. допустим даже вы ввели ограничение на количество введенных чисел, максимально 20 элементов, (вы сами сказали, что это вырвано из контекста, так вот если не вырвано, то - откомплированный код строка формата -(%d %d %d %d %d итд всего 20 шт) создан уже на 20 символов, а user вбил только 3 числа. в соответствии с тем, как вы писали, sprintf будет прибавлять к 3 аргументам 17 значений всякой ерунды из стека.
Вообще этот спор ни о чём для себя я уже определился с "безразмерными функциями"))) копирование вершины стека в регистр до закачки передаваемых параметров в стек и до вызова функции.
Естественно программист создающий код работающий с переменным числом параметров должен разрабатывать его с учётом этих трудностей и может быть не должен использовать стандартные функции в сомнительных случаях.
Что касается sprintf и других подобных, в Си их достаточно много то я пересмотрел описание и там указано что если число команд форматирования меньше чем число аргументов,
Если количество аргументов меньше, чем количество команд форматирования, то вывод не определен.
В отношении чистки за собой согласен просматривая в дизассемблере какой то код обнаружил везде после call sprintf стоит esp+кол.параметров*4
всем спасибо за помощь.
P.S. блин ну где же всё таки взять masm32.hlp не chm?))
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
30.01.2016, 15:48 10
Цитата Сообщение от Constantin Cat Посмотреть сообщение
О переменном числе параметорв речь не идет. Меняете строку формата, соответственно, меняется количество и тип параметров.
Если меняется количество параметров, не означает ли это, что функция имеет переменное число параметров, например? ;о)

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
KyberMax, вы очень воинственны))
Аргументировать будешь или ляпнул просто так, например? ;о)

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
...код строка формата... создан уже на 20 символов, а user вбил только 3 числа. в соответствии с тем, как вы писали, sprintf будет прибавлять к 3 аргументам 17 значений всякой ерунды из стека.
В этом случае вовсе необязательно выводить за один вызов все введённые юзверем числа - это можно делать по одному в цикле (но можно и генерить строку формата в зависимости от количества выводимых чисел, заносить их в стек и выводить именно за один вызов, если охота возиться с этим, канешни ;о)

Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
блин ну где же всё таки взять masm32.hlp не chm?))
А оно тебе надо? Вместо того, чтобы страдать на форуме, уже копнул бы в хухеле инфу о файлах справок. И накопал бы, что hlp-формат не поддерживается, начиная с Висты (для чтения необходимо поставить ридер), левые же chm-файлы по умолчанию не открываются, начиная с той же Висты (по причине дичайшей дырявости ie ;о) Там же нашёл бы и лекарство (правый кнопель мыша, разблокировать, например ;о)
0
AAAAAlexeyyyyy
110 / 7 / 0
Регистрация: 01.05.2014
Сообщений: 101
30.01.2016, 19:59  [ТС] 11
отнюдь не знак бездушья молчаливость, гремит лишь то, что пусто изнутри. (с) сэр Вильям Шекспир
))
0
KyberMax
Terminator of naked apes
827 / 134 / 34
Регистрация: 13.02.2015
Сообщений: 328
30.01.2016, 20:34 12
Цитата Сообщение от AAAAAlexeyyyyy Посмотреть сообщение
отнюдь не знак бездушья молчаливость, гремит лишь то, что пусто изнутри. (с) сэр Вильям Шекспир
))
Что такое, истчо один гуманитарий (весьма самокритично, кстати - нагремел ты тут предостаточно, например ;о)

По существу есть чо? ;о)
0
30.01.2016, 20:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2016, 20:34

Функция с переменным числом параметров
Вычисление суммы ряда значений оформить в виде функции с переменным числом...

Функция с переменным числом параметров
хелп ми вообще дуб дубом Задание Функция с переменным числом параметров...

Функция с переменным числом параметров
В функцию с переменным числом параметров поступают символы, конец списка -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru