Assembler " compiler "
-
Okay, danke erstmal für die Antworten.
Ich habe durchaus schon programmiert, nur hat es mich dabei nie interessiert, was meine IDE dabei überhaupt macht.
Ich type mein Programm a la int main() { std::cout<< "Hello World " << std::endl; return 0; } ein, drücke auf Compile und dann Run. Fertig.Was mich bei Asm auseinander bringt sind irgendwie die vielen Varienten, die eben von dem Assembler/Compiler abhängen. Z.b unterteilt man ja Asm code in verschiedene Segmente, die auch die versch. Prozesse haben. .data und .text benutzt man glaub ich am häufigsten. Die heissen aber auch immer anders.
Auch wird oft mov dest, sorc zu mov sorc, dest umgedreht.Aber mal wieder konkret : Ich schreibe einfach mal ein Einzeiler in den Editor, mov eax, 7 . Fehlen jetzt natürlich die Segmente etc. aber immo unwichtig. Speichere das also in Dokumente under whatever.asm und gehe dann auf Build All. Als Resultat bekomme ich ein Error : Cannot open file whatever.asm Assembly Error.
-
... einfach mal was weglassen geht nicht!
Hier mal das (sinnvolle) minimum:; -> console build all include C:\masm32\include\masm32rt.inc .code main proc print "Hallo welt",13,10 inkey invoke ExitProcess,0 main endp end main
-
Naja, es ging jetzt erstmal darum, dass er wenigstens versucht das Programm zu builden, davon mal abgesehen dass es so nie laufen wird.
Aber leider failed er bim builden immer. Ich speichere die datei und gehe auf Build All, bekomme aber dann den Fehler, dass er die Datei ( die ich gespeichert habe) nicht öffnen kann.
-
Hmmmmmm schrieb:
... weil ich Visual studios 2008 und 2010 schon installed habe)...
also bei meiner VC++ Express Version war das ganze Masm Gedöns schon mit drauf und es ist auch irgendwo in der Hilfe beschrieben, wie man es benutzt.
Hmmmmmm schrieb:
Lange Rede, kurzer Sinn : Ich war nicht imstande einen Assembler "Compiler" ( Kann man das eig. so nennen ? ) zu downloaded. Habt ihr vllt Links ?
Das hört sich aber schon mal gar nicht gut an, gar nicht gut...;)
Wenn du ein 32bit Windows hast, dann ist standardmäßig das Programm Debug.exe drauf.
-
Naja, lag jetzt nicht daran, dass ich die nötigen Links nicht finde. Eher daran, dass a) Mir gesagt wurde, dass die Virus-Warnungen nicht normal sind und b) dass MASM auch kein Visual Stdudios 2005 braucht, was ja die 2. gedownloadete Datei verlangte.
Habe gerade mal nachgeschaut und kann kein MASM im VC++ Verzeichnis finden. Könnte natürlich die inline-Asm Funktion verwenden, aber mir wurde gesagt, dass Inline-Asm scheisse ist.
Habe 64bit Windows und kann kein Debug.exe o.ä finden
Wie gesagt, MASM will meine Datein nicht builden, weil er sie nicht öffnen kann. Warum auch immer.
-
K, fehler gefunden. Ich hab die Datei immer als Save As -> "Name" -> Done gespeichert, anstatt explizit .asm anzugeben, also Save As -> "Name.asm" -> Done. Dachte, dass das automatisch als .asm file gesaved wird. Danke nochmal an alle Beteiligten.
-
Hmmmmmm schrieb:
Habe gerade mal nachgeschaut und kann kein MASM im VC++ Verzeichnis finden.
Auf der 2008 Version die ich drauf habe, heißt das Ding ml.exe
Richtige 64bit-System- Assembler (und aktuell) sind, soweit ich weiß im Momemt nur der Microsoft Assembler
( http://msdn.microsoft.com/de-de/library/hb5z4sxd.aspx ) und Gas ( http://sourceware.org/binutils/docs-2.21/as/index.html bzw. http://sourceware.org/binutils/docs-2.21/as/index.html ).
-
wurde zwar nicht danach gefragt, aber 64Bit Code erstellen könne u. A. masm,fasm,jwasm,goasm,poasm,gas,nasm,yasm
-
Okay Leute, eine Feage bleibt noch ( ich denke es werden im Laufe der Zeit mehrere ) :
Schaut euch das Video bitte mal kurz an : http://securitytube.net/Assembly-Primer-for-Hackers-(Part-4)-Hello-World-video.aspx
Ab der 13. Minute. Dort with int 0x80 verwendet um die in die Register geladenen Daten zu verwenden, um letzendlich ein systemcall für die Funktion write() durchzuführen. Gerade wurde mir aber gesagt, dass int 0x80 eig. was ganz anderes bewirkt. Hmmm.
-
INT 0x80 ist der Interupt, über den Linux seine API zur verfügung stellt - dafür brauchst du also Linux
-
Ah okay, dann liegts wirklich am OS.
Wie ist das bei Windows ? Lässt sich das auch auf ähnliche Weise machen ? Also die Parameter einer funktion und deren ID in die Register laden und dann irgendeinen anderen Befehl aufrufen ?
Oder muss man das mit diesem print machen ? Ich nehme mal an, dass das "print" ein Macro ist ? Wenns ein Macro ist, muss es ja auch einen anderen Weg geben ?
-
hier sind einige der etwas älteren Assembler befehle recht gut erklärt:
auch was intterrupts (int 21) angeht
grüße
Calandrias
-
Unter Windows muss man sich der WinAPI bedienen - der print-macro basiert letztlich auch drauf. Interrupts sind grundsätzlich nicht erlaubt (API intern gibt es durchaus Interrupts).
Wenn dir die CRT Funktionen Vertraut sind, kannst du auch diese benutzen. Wenn du masm32 verwendest, musst du jegliche das Präfix 'crt_' vor den Namen der Funktion Hängen:
.data sz db "Hallo Welt",13,10,0 .code invoke crt_printf,ADDR sz
-
.386 .model flat, stdcall option casemap :none include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib .data var db "hallo",0 .code start: invoke StdOut , addr var invoke Sleep , 2000 ; damit man die meldung länger aufm bildschirm ; bleibt oder du startest das programm ; über die eingabeaufforderung invoke ExitProcess, 0 end start
-
Statt Sleep kann an den inkey-macro verwenden, oder direkt die Funktion wait_key ....
-
Okay, vielen Dank leute
Ich experentier mal bisschen damit rum !
Btw : diese ,0 hinter den Variablen, dient das der Nullterminierung ? ( msg db "Whatever", 0 )
-
Für Windows Programmierung sind die Winapi, z.B. Petzold Bücher und die
Iczelion-Tuts ( http://win32assembly.online.fr/tutorials.html ) recht hilfreich.
-
Ahh, der Link ist sehr nice Nachtfeuer, danke.
An dieser Stelle nochmal danke an alle, die geantwortet haben