asm in C++ Hello World Beispiel
-
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'
-
-
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.