Вы, похоже, путаете возврат значения и наличие переменной out.
Здесь:
push ebx
call SET_AA
pop ebx
вы действуете так, как будто ebx
является переменной out.
и здесь:
mov eax, [esp+4]
mov al, 0xAA //10101010 didn't work either
ret
вы просто записываете материал в eax
дважды (один раз с параметром, затем вы перезаписываете его своим 0xAA). eax
традиционно является регистром возвращаемого значения. Вам нужно выбрать тот, который вы хотите использовать.
Если вы хотите, чтобы это была переменная out, вам нужно сделать что-то вроде этого:
__declspec(naked) long function(unsigned long inputDWord, unsigned long *outputDWord) {
_asm{
mov ebx, dword ptr[esp+4]
push ebx
call SET_AA
pop ebx
mov eax, dword ptr[esp+8]
mov dword ptr[eax], ebx
}
}
__declspec(naked) void SET_AA( unsigned long inputDWord ) {
__asm{
mov [esp+4], 0xAA // put 0xAA into the variable passed on the stack
ret
}
}
Если вы хотите получить возвращаемое значение, вы можете сделать что-то вроде этого:
__declspec(naked) long function(unsigned long inputDWord, unsigned long *outputDWord) {
_asm{
mov ebx, dword ptr[esp+4]
call SET_AA
mov ebx, eax
mov eax, dword ptr[esp+8]
mov dword ptr[eax], ebx
}
}
__declspec(naked) unsigned long SET_AA(/* input param not needed, we are just returning a value */) {
__asm{
mov eax, 0xAA // return 0xAA via the eax register
ret
}
}