2017-11-04 4 views
0

So wie Sie in C und C++ wissen, wenn Visual-C verwenden, können Sie in Zeile Montageanleitung haben, wie:C/C++ Inline-Assembler mit Anweisungen in String-Variablen

int main() { 
    printf("Hello\n"); 
    __asm int 3 
    printf("this will not be printed.\n"); 
    return 0; 
} 

, die einen Haltepunkt machen wird innerhalb von die ausführbare Datei. Meine Frage ist also, gibt es eine Art von Funktion, die ich verwenden kann, um __asm mit einer Variablen wie einem Char-Array aufrufen. Ich dachte etwas in der Art:

char instruction[100] = "int 3"; 
__asm instruction 

Aber das scheint nicht wirklich zu funktionieren, da es "ungültiger OP-Code" gibt. Also kannst du damit helfen oder es ist überhaupt nicht möglich.

+0

Sie wollen Magie - Laufzeitassembler, der sich aus den Strings zusammensetzt. –

Antwort

3

Weder C noch C++ sind interpretierte Sprachen, der Compiler generiert zur Kompilierzeit den int 3 Maschinenbefehl. Das kompilierte Programm erkennt die Zeichenfolge nicht als eine Anweisung zur Laufzeit - es sei denn, Ihr Programm ist selbst ein Interpreter.

Sie können natürlich auch mit einem Makro:

#define BREAKPOINT __asm int 3 

int main() 
{ 
    printf("Hello\n"); 

    BREAKPOINT ; 

    printf("this will not be printed.\n"); 
    return 0; 
} 
3

Der Code des Programms wird vom Compiler erstellt, während der Kompilierung.
Sie versuchen, den Compiler die Eingabe dafür bei Laufzeit zu füttern - wenn das Programm bereits ausgeführt wird. Wenn Sie "on-the-fly-compilation" möchten, müssen Sie einen inkrementellen Compiler und Linker programmieren, der den Code während der Ausführung ändern kann.

Beachten Sie, dass selbst wenn Sie erfolgreich wären, viele Betriebssysteme diese Ausführung blockieren würden, da sie die Sicherheit verletzen. Es wäre eine gute Möglichkeit, Viren zu erstellen, und ist daher in der Regel blockiert.