asm in C++ Hello World Beispiel



  • Von http://de.wikibooks.org/wiki/Assembler_(80x86_Prozessor)-Programmierung:_Das_erste_Assemblerprogramm#.22Hello_World.22-Programm habe ich

    org 100h
     start:
      mov dx,hello_world
      mov ah,09h
      int 21h
      mov al, 0
      mov ah,4Ch
      int 21h
     section .data
      hello_world: db 'hello, world', 13, 10, '$'
    

    rauskopiert.

    In Visual Studio habe ich jetzt folgenden code

    int main()
    {
    	__asm {
    		org 100h
    		start:
    		mov dx,hello_world
    		mov ah,09h
    		int 21h
    		mov al, 0
    		mov ah,4Ch
    		int 21h
    		section .data
    		hello_world: db 'hello, world', 13, 10, '$'
    	}
    	return 0;
    }
    

    Lässt sich aber nicht kompilieren.

    Wäre jemand so nett mir ein Hello World Beispiel zu verlinken so das ich asm innerhalb von C++ (Visual Studio) verwenden kann?



  • Der Beispielcode scheint fuer TASM und DOS zu sein. Vertraegt sich beides nicht besonders gut mit MS VS, bzw. dessen Inline asm.
    Ein Tutorial/Beispiel fuer inline Asm kenne ich nicht.
    Andere Tutorials fuer den Asm-Einstieg findest du in den FAQ (funktionieren natuerlich auch nicht mit inline asm).
    Ansonsten wuerde ich empfehlen, damit du ein Gespuer bekommst, andersherum vorzugehen: Schreibe ein Hello world in C und lass dir den Assembler-Code dazu einblenden.



  • Deinen Code kann man in Visual Studio nicht kompilieren, weil der Visual Studio linker 32 Bit Binärdateien erzeugt und keine 16Bit Binärdateien, wie für DOS eigentlich üblich.

    Ich würde dir raten, dir masm oder nasm mal runeterzuladen und dazu noch einen 16Bit Linker, der dir auch DOS dateien erstellt.

    Ich bin auch Neu in der Materie, also wenn was nicht stimmen sollte, bitte korrigieren.



  • sap schrieb:

    Wäre jemand so nett mir ein Hello World Beispiel zu verlinken so das ich asm innerhalb von C++ (Visual Studio) verwenden kann?

    // inline_asm.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    
    void my_printf(const char* p)
    {
    	 printf(p);
    }
    
    int main()
    {
    	char x[] = "hello world!\n";
    	char* y	 = "Hello World!\n";
    	static char z[] = "HELLO WORLD!\n";
    
    	__asm lea   eax, x
    	__asm push  eax
    	__asm call  my_printf
    	__asm add   esp, 4		
    
    	__asm
    	{
    		  push  y
    	      call  my_printf
    	      add   esp, 4	
    	}
    	__asm
    	{
    		  push offset z
    		  call  my_printf
    	      add   esp, 4	
    	}
    
    	return 0;
    }
    

    mfg



  • was bewirkt add esp, 4 ? Danke 😉



  • add esp, 4

    Addiert esp und 4 und schreibt das ins Register eax..



  • ok, das hab ich schon gewusst, aber warum ? 😉



  • drakon schrieb:

    add esp, 4

    Addiert esp und 4 und schreibt das ins Register eax..

    Aha? Das waer mir neu.
    Der linke Operand bei add, sub, usw. ist zugleich Quelle und Ziel.



  • Nobuo T schrieb:

    drakon schrieb:

    add esp, 4

    Addiert esp und 4 und schreibt das ins Register eax..

    Aha? Das waer mir neu.
    Der linke Operand bei add, sub, usw. ist zugleich Quelle und Ziel.

    Und ich war kurzzeitig verwirrt 😃

    Btw.: Wenn du unter Win32 Assembler lernen willst, kannst du dir auch das MASM32-Paket angucken...



  • ProgChild schrieb:

    Btw.: Wenn du unter Win32 Assembler lernen willst, kannst du dir auch das MASM32-Paket angucken...

    Von MASM würde ich aufgrund seiner schlechten Lizenz (Verbot von OpenSource-Herstellung mit MASM) abraten. FASM eigenet sich für Win32 Programme ebenso gut.
    Zum Thema: add esp,4 bewirkt, dass der Stapelspeicherzeiger wieder zurückgesetzt wird, der vorher durch den push Befehl um 4 verringert wurde.



  • ok thx. kann ich mir das stdcall sparen?



  • sry, meinte 'bei stdcall'



  • das hab ich schon gewusst, aber warum ?

    ruehrt da her.

    kann ich mir das (bei) stdcall sparen?

    jup.



  • Hallo,

    mal eine simple (?) Frage:
    Programme in asm sehen ja so aus (pseudocode):

    push 4;
    add ax, 4;

    Wenn da mit Registern gearbeitet wird, versteh ich das ja noch (es werden Werte ausm RAM ins Register geladen und dann wird auf der CPU gerechnet)
    Aber wo genau landet die 4 bei push 4? Sprich: WO genau befindet sich der Stack? (RAM??)



  • stapler schrieb:

    Aber wo genau landet die 4 bei push 4? Sprich: WO genau befindet sich der Stack?

    Ja, im Arbeitsspeicher. Und wo genau, dass sagt dir das Stackregister, bzw. der Stackpointer.



  • ProgChild schrieb:

    stapler schrieb:

    Aber wo genau landet die 4 bei push 4? Sprich: WO genau befindet sich der Stack?

    Ja, im Arbeitsspeicher. Und wo genau, dass sagt dir das Stackregister, bzw. der Stackpointer.

    Aber auf der verlinkten Seite steht das:

    ( Der Stack ist in aller Regel komplett im Cache-Speicher des Prozessors, und die Arbeit mit Speicherzellen im Cache geht bedeutend schneller als der Zugriff auf den Hauptspeicher. )

    Heißt das, der eigentlich Stack ist im RAM, wird aber vom Prozi gecacht?



  • stapler schrieb:

    Aber auf der verlinkten Seite steht das:

    ( Der Stack ist in aller Regel komplett im Cache-Speicher des Prozessors, und die Arbeit mit Speicherzellen im Cache geht bedeutend schneller als der Zugriff auf den Hauptspeicher. )

    Heißt das, der eigentlich Stack ist im RAM, wird aber vom Prozi gecacht?

    Ja. Das ist der Sinn vom Prozessor-Cache. Der Arebeitsspeicher ist langsam, darum wird er im Cache zwischengespeichert und bei bedarf mit dem Arbeitsspeicher synchronisiert.


Anmelden zum Antworten