Inline assembly c++ przekazywanie zmiennych do funkcji

0

Cześć, powiedzmy, że mam taki kawałek kodu w którym do funkcji inline assembly chciałbym przekazać zmienne liczba oraz przesunięcie aby sobie zrobić np bitwise w lewo o 1 albo 2. W jaki sposób mógłbym przekazać zmienne do funkcji?

#include <iostream>
#include <Windows.h>

using namespace std;

int assembly()
{

	__asm {
		mov eax, liczba
		shl eax, przesuniecie
	}
}

int main()
{
	setlocale(LC_ALL, "");
	int liczba, przesuniecie;

	cout << "Proszę podać liczbę i ilość miejsc do przesunięcie w lewo:\nLiczba:" << endl;
	cin >> liczba;
	cout << "Presunięcie:" << endl;
	cin >> przesuniecie;
	cout << assembly() << endl;
	system("pause");
	return 0;
}




0

Poczytaj o tym w jakich rejestrach są zapisywane parametry wywołania funkcji, to platrform dependent powinno być. Mając funkcję o sygnaturze int fn(int a, int b) zmienne a i b są prawdopodobnie przekazywane kolejno przez rsi i rdi, a wynik(ten z returna) powinien być w rax. (względnie esi, edi, eax)

Edit:
Nie chcę pisać kolejnego posta, bo to tylko pokazanie idei:
https://repl.it/repls/OilyTremendousWildebeest

0

Jeśli to jest program 32-bitowy, to masz prawdopodobnie konwencję wywołania cdecl. Parametry są przekazywane na stosie.

0

To się robi tak:


    .model flat,c
    .code

CalcSum_ proc

; Initialize a stack frame pointer
        push ebp
        mov ebp,esp

; Load the argument values
        mov eax,[ebp+8]                     ; eax = 'a'
        mov ecx,[ebp+12]                    ; ecx = 'b'
        mov edx,[ebp+16]                    ; edx = 'c'

; Calculate the sum
        add eax,ecx                         ; eax = 'a' + 'b'
        add eax,edx                         ; eax = 'a' + 'b' + 'c'

; Restore the caller's stack frame pointer
        pop ebp
        ret

CalcSum_ endp
end
int main()
{
    int a = 17, b = 11, c = 14;
    int sum = CalcSum_(a, b, c);
    printf("sum: %d\n", sum);
    return 0;
}

Powyższy kod zaczerpnąłem z książki: „Modern X86 Assembly Language Programming 32-bit, 64-bit, SSE, and AVX".

1

https://msdn.microsoft.com/en-us/library/5sds75we.aspx

// Power2_inline_asm.c  
// compile with: /EHsc  
// processor: x86  
  
#include <stdio.h>  
  
int power2( int num, int power );  
  
int main( void )  
{  
    printf_s( "3 times 2 to the power of 5 is %d\n", \  
              power2( 3, 5) );  
}  
int power2( int num, int power )  
{  
   __asm  
   {  
      mov eax, num    ; Get first argument  
      mov ecx, power  ; Get second argument  
      shl eax, cl     ; EAX = EAX * ( 2 to the power of CL )  
   }  
   // Return with result in EAX  
}  

1 użytkowników online, w tym zalogowanych: 0, gości: 1