2015-11-04 2 views
0

Я думаю что-то вроде установки указателя стека на функцию, а затем выполнение до тех пор, пока оно не вернется.Есть ли способ передать функцию в качестве параметра в сборке?

Редактировать: Я использую nasm и nlink.

Edit2: Я использую процессор x86.

Редактирование 3: Хорошо, поэтому я хочу написать функцию фильтра, которая будет фильтровать строку, используя другую функцию, которая решает, является ли символ приемлемым или нет. Я представляю себе это в виде:

;params: string in r1, function in r2 
Filter: 
    ;do stuff 
    ret 

IsCharGood: 
    ;decide if char is good 
    ret 

main: 
    mov  r1, theString 
    mov  r2, IsCharGood 
    call Filter 

Редактировать4: Решил, см. Мой ответ ниже.

+1

В соответствии с вашим названием: Да, это тривиально возможно. Просьба пояснить на примере, что вы хотите достичь, и с какой проблемой вы попадаете. –

ответ

1

Хорошо, так что это довольно просто:

aFunction: 
    ;do stuff here 
    ret 

callFunctionInEax: 
    call eax 
    ret 

main: 
    mov  eax, aFunction 
    call callFunctionInEax 
    ret 
+0

Обычное соглашение о вызове - передать аргументы в стек для 32-разрядных или в регистры для 64-разрядных. Но да, это работает. –

2

В сборке нет «функций», это концепция более высокого уровня.

Вы не говорите, какой процессор вы работаете, но если у процессора есть инструкция, чтобы перейти на адрес в обычном регистре, это, конечно, самый простой способ. Например, ARM может это сделать, и so can x86.

И, конечно, как вы передаете параметры подпрограмме, зависит от вас, как программист в сборке. Вы можете передавать регистры или в стек, что не имеет значения, пока вы можете сгенерировать вызов. Взлом самого указателя стека кажется неудобным и странным.

+0

Спасибо за ваш ответ! Теперь мне просто нужно узнать адрес моей подпрограммы. Может быть, я могу использовать Оллидбга для этого, я не уверен. –

+0

@ zsolt-z Большинство ассемблеров поддерживают символы. Поэтому замените 'mov r2, IsCharGood' на' lea r2, IsCharGood', и у вас есть адрес IsCharGood в r2. – zx485