· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Передача параметров

<< . 1 . 2 .

Посл.отвђт Сообщенiе


Дата: Май 10, 2004 11:54:33

EvilsInterrupt
Действительно, передача параметров в потоке кода является интересным приемом. Насколько я помню, этот способ использовался еще в ZX-Spectrum 48K, для передачи параметров в функцию калькулятора. С помощью этого метода, функция может принимать заранее неизвестное количество параметров.


Дата: Май 10, 2004 12:14:57 · Поправил: Oleg_SK

EvilsInterrupt
А код слабо слабать? :)))
OK. Нечего сложного не вижу. Пример:
; Задача функции: если значение Param_1 не равно нулю, то функция возвращает сумму параметров Param_2 и Param_3. Если значение Param_1 равно нулю, то функция возвращает значение параметра Param_2. Причем значение параметра Param_3 передается в функцию методом отложенного вычисления.
MyProc proc Param_A:DWORD, Param_B:DWORD, Param_3:DWORD
.if Param_1!=0
; В этой ветке нам понадобится значение параметра,
; которое было передано в функцию методом
; отложенного вычисления.
; Поэтому нужно узнать значение этого параметра.
mov eax, Param_3
call eax ; Здесь вызывается функция производящая длительное вычисление значения параметра Param_3. Вычисленное значение она возвращает в регистре EAX.
mov ebx, Param_2
add eax, ebx
.else
; В этой ветке нам не понадобится значение параметра,
; которое было передано в функцию методом отложенного вычисления.
;Поэтому мы и не будем терять время на вычисление его значения.
mov eax, Param_2
.endif
ret
MyProc endp

Как видишь, здесь нет нечего сложного...


Дата: Май 10, 2004 12:40:08

EvilsInterrupt
А лучше открой и посмотри много интересного увидишь, взять хотя бы передачу в потоке кода!
Эта книжка есть не у всех =)


Дата: Май 10, 2004 12:52:03 · Поправил: Oleg_SK

Anonimka
Эта книжка есть в рунете, в электронной форме :))


Дата: Май 10, 2004 13:00:42 · Поправил: Oleg_SK

Anonimka
Я тоже согласен с Black_mirror. Точно не знаю, но может быть такой подход где-то организован для связи ассемблерных вставок с ЯВУ. Можно пойти дальше и предположить, что вместо имени можно передавать индекс в некой таблице с адресами функций. IMHO, такой вариант как-то естественней для ассемблера.

P.S.: Ты мое письмо получил? Может быть, даже ответил мне? Если да, ответь, пожалуйста, еще раз. Произошел сбой моего почтового ящика, и я потерял много писем...


Дата: Май 10, 2004 13:09:21

Oleg_SK
Я тоже согласен с Black_mirror. Точно не знаю, но может быть такой подход где-то организован для связи ассемблерных вставок с ЯВУ. Можно пойти дальше и предположить, что вместо имени передается индекс в некой таблице с адресами функций.
Какой смысл передавать параметр индексом в таблице, а не адресом самого элемента? Не, не так: какой в этом концептуальный смысл? (Что это может быть немножко удобней где-то конкретно, мне и так ясно).

P.S. На письмо давно уже ответил. Перепошлю ответ вечером.


Дата: Май 10, 2004 13:29:50

Anonimka
Что это может быть немножко удобней где-то конкретно, мне и так ясно
Именно так. А особого концептуального смысла я пока не вижу.

P.S.:
Ну, смысл может заключаться, к примеру, в экономии памяти. К примеру, есть таблица адресов на 64 элемента. Передавая в функцию индекс элемента, мы затрачиваем только один байт, а если передаем адрес - 4 байта. Эффект от этого способа появится только в том случае, если функций, которым нужно передавать эти адреса, довольно много. Но вообще-то я над этим серьезно не думал, а пример этот сейчас высосал из пальца...


Дата: Май 10, 2004 13:35:08

Oleg_SK
К примеру, есть таблица адресов на 64 элемента. Передавая в функцию индекс элемента, мы затрачиваем только один байт, а если передаем адрес - 4 байта.
Смещение в таблице в этом случае тоже уложится в байт =)


Дата: Май 10, 2004 13:47:10 · Поправил: Oleg_SK

Anonimka
Точно, индекс и смещение = 1 байт, а адрес = 4 байта :)
IMHO, индекс - удобнее ;)


Дата: Май 10, 2004 20:38:54

всем спасибо буду еще думать!

<< . 1 . 2 .


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057