ASM Hilfe ( Anfänger )
-
Hey Jungs,
ich wollte ASM lernen zumindestens die Grundlagen und habe da auch schon mal angefangen und mich gefreut das ich 2 Strings? heisst das in ASM auch so ?
Ausgegeben habe :
Nachricht1 DB "Cooldie lernt ASM!"
Wie mache ich da hinter eine leer Zeile ? Damit das nicht alles in einer Reihe steht dann habe ich noch eine Frage wie deklariere ich eine Variable wo ich eine Zahl rein speichern kann um damit evtl. zu rechnen und wie gebe ich die nacher aus ?
Und nun das allerletzte kann ich wie in C++ mit cin >> Eingabe; Irgendwie Tastatur eingeben auslesen ?Das wars erstmal.
Gruß cooldie
-
Dummie schrieb:
Hey Jungs,
ich wollte ASM lernen zumindestens die Grundlagen und habe da auch schon mal angefangen und mich gefreut das ich 2 Strings? heisst das in ASM auch so ?ja in asm heißt das auch string
Dummie schrieb:
Nachricht1 DB "Cooldie lernt ASM!"
Wie mache ich da hinter eine leer Zeile ? Damit das nicht alles in einer Reihe steht?mach einfach
Nachricht1 DB "Cooldie lernt ASM!"
wenn du willst dass ein string nullterminiert ist dann machst du einfach ,00h hinter den string.Dummie schrieb:
dann habe ich noch eine Frage wie deklariere ich eine Variable wo ich eine Zahl rein speichern kann um damit evtl. zu rechnen und wie gebe ich die nacher aus
vor deinen .code block schreibst du .data? fuer variabeln die zu programmstart noch nicht initialisiert sein sollen z.b.
.data?
bla db ? ;ein BYTE
blaa dw ? ;ein WORD
blaaa dd ? ; ein DWORDfuer initialisierte variablen machst du z.b.
.data
bla db 11h
blaa dw 1111h
blaaa dd 11111111hausgeben kannst du die variabeln dann z.b. mit printf
Dummie schrieb:
Und nun das allerletzte kann ich wie in C++ mit cin >> Eingabe; Irgendwie Tastatur eingeben auslesen ?
ja das geht auch such einfach mal im forum.
-
Danke hat mir schonmal geholfen aber ,wie meinst du das mit printf ?
Geht das auch ohne Inline C/C++ ?Gruß cooldie
-
Habe nun nochmal getestet aber funktioniert nicht hier mein Gesamter Code :
.MODEL Small ;wir basteln eine COM Datei :) .STACK 100h ;100h (im Dezimalen 255) gibt die GrӇe des Stacks an .DATA ;hier beginnt der Datenabschnitt Nachricht1 DB "Cooldie lernt ASM!$", 0Dh, 0Ah Nachricht2 DB "Wenn das mal nicht schief geht o_O!$" bla db 11h blaa dw 1111h blaaa dd 11111111h .CODE ;hier beginnt das Codeabschnitt Start: ;Einsprungspunkt (wo gestartet wird) ;zuerst mssen wir mal unser Datensegment vorbereiten mov ax,@data ;die Adresse des Datenabschnittes ins Register AX mov ds,ax ;dem Datensegment die Adresse der Daten mitteilen mov dx,OFFSET Nachricht1 ;die Adresse der Nachricht dem Datenregister mitteilen mov ah,09h ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen int 21h ;die Funktion (9=Text ausgeben) im Register AH ausfhren mov dx,OFFSET Nachricht2 ;die Adresse der Nachricht dem Datenregister mitteilen mov ah,09h ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen int 21h ;die Funktion (9=Text ausgeben) im Register AH ausfhren mov dx,OFFSET bla ;die Adresse der Nachricht dem Datenregister mitteilen mov ah,09h ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen int 21h ;die Funktion (9=Text ausgeben) im Register AH ausfhren mov ah,4Ch ;nun schreiben wir die Funktion 4C (Beenden) nach AH int 21h ;Funktion im Register AH ausfhren END Start ;Ende des Einsprungpunktes angeben
Vielleicht fällt dir was auf:
mov dx,OFFSET bla ;die Adresse der Nachricht dem Datenregister mitteilen mov ah,09h ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen int 21h ;die Funktion (9=Text ausgeben) im Register AH ausfhren
War nur ein TEst ob man die Variable vielleicht so ausgeben kann
Gruß cooldie
EDIT : Übringes Funktioniert das mit der Leer Zeile nicht so ???
-
uuh 16 bit code
ehrlich gesagt hab ich damit noch nie was gemacht.aber ich versuchs trotzdem mal.damit das mit der neuen zeile nach der ersten nachricht funktioniert musst du den string so machen Nachricht1 DB "Cooldie lernt ASM!", 0Dh, 0Ah,"' enden muss.
bla kannst du so nicht ausgeben weil bla noch kein string ist.du musst es vorher mit wsprintf in einen string umwandeln:
.data
fmt db "%lX", 00h
buf db 4 dup (24h) ;24h == $
...
invoke wsprintf, addr buf, addr fmt, bla
mov dx,OFFSET buf
mov ah,09h
int 21hich glaube so sollte es funktionieren kann es leider nicht testen weil mein pc im eimer ist hoffe es hilft dir trotzdem ein bisschen.
-
Hi.
Dummie schrieb:
Danke hat mir schonmal geholfen aber ,wie meinst du das mit printf ?
Geht das auch ohne Inline C/C++ ?Also ich weiss zwar auch nicht wie er das gemeint hat, aber da ein Compiler letztendlich auch nichts anderes macht, als den Hochsprachencode in Assembler(/Maschinencode) zu uebersetzen, geht das logischerweise auch ohne C++.
Um Zahlen auszugeben, musst du sie (wie the_rain schon sagte - wie das mit dem invoke ohne weitere Libs unter DOS funktionieren soll, ist mir dagegen nicht ganz klar...
) erstmal in Strings umwandeln - erst dann kannst du sie mit der Funktion 09h vom int 21h ausgeben.
Am einfachsten ist es IMHO unsigned integer in einen String mit Hex-Zahlen zu konvertieren.
Im grunde genommen funktioniert das so, dass du zunaechst die hintersten 4bit (von links nach rechts gelesen kommt die entsprechende Ziffer schliesslich zuerst auf den Bildschirm) irgendwie isolierst und dann zB. als einen Index auf einen String benutzt, der sinnvollerweise in etwa so aussieht: "0123456789ABCDEF". Den entsprechenden Letter kopierst du dir dann in den String, den du ausgeben willst, und isolierst die naechst 4Bit.
Um das zu realisieren, solltest du wissen, wieviele Register es gibt, wie die bitweise "and"-verknuepfung, Bitshift (rol/shl ..., 4) und indirekte Adressierung (via Register) funktioniert und wie man Schleifen implementiert (vor allem fuer (d)words waere das sinnvoll).
Dummie schrieb:
.MODEL Small ;wir basteln eine COM Datei :)
Nur mal so nebenbei: KA, wie das beim MASM ist (falls du den benutzt), aber in TASM bekommt man AFAIK so keine .com-Datei.
Aber du wirst vermutlich so oder so eine .exe erstellt haben.Dummie schrieb:
EDIT : Übringes Funktioniert das mit der Leer Zeile nicht so ???
Funktion 09h vom int 21h beendet die Stringausgabe bei einem "" packen.
the_rain schrieb:
wenn du willst dass ein string nullterminiert ist dann machst du einfach ,00h hinter den string.
Jo, und genauso sind deine Strings eben "$"-Terminiert.
-
Hallo,
Die Leerzeilen funktionieren nun Prima aber dieser Fehler macht mir Sorgen :error A2006: undefined symbol : wsprintf
Im Übrigen verstehe ich das hier nicht :
data fmt db "%lX", 00h buf db 4 dup (24h) ;24h == $ ... invoke wsprintf, addr buf, addr fmt, bla mov dx,OFFSET buf mov ah,09h int 21h
Kennt ihr für mich noch ein paar gute Bücher , Tutorials ?
Damit ich mich da etwas vertiefen kannGruß cooldie :p
Edit : Ja es ist eine EXE keine Ahnung warum da Com steht, benutze übrigens MASM.
-
den fehler error A2006: undefined symbol : wsprintf bekommst du weil du das .lib file und das .inc file nicht includiert hast wie Nobuo T auch schon bemerkt hat. hab ich vergessen zu sagen. schreibe zwischen .stack und .data gerade noch
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
du musst vllt den pfad noch aendern.
den code den du nicht verstehst soll mit hilfe von wsprintf bla in einen string umwandeln der dann in buf steht.danach koenntest du dann den string ausgeben.
vor wsprintf sieht buf so aus '$$$$' nach wsprintf sollte buf dann so aussehen '11 $'.
gute tutorials findest du z.b. hier http://win32asm.cjb.net/
-
Er schreibt ein DOS-Programm und soll mit user32.lib linken?
-
Unter DOS koennte er auch die C-Library verwenden (also Funktionen wie printf(), scanf() usw., oder gar cprintf() usw.).
Das ist vermutlich einfacher, als ueber die DOS- bzw. BIOS-Interrupts zu gehen.
Wie man mit DOS / mit dem BIOS Zeichen einliest, steht uebrigens in einer DOS- bzw. BIOS-Interrupt-Tabelle, die man im Netz finden kann.
Um Zahlen zu Strings zu konvertieren, dividiert man (fuers Dezimalsystem) eine Zahl durch 10, addiert zum Divisionsrest 48 ('0') dazu, gibt das Zeichen aus, und wiederholt, bis die Zahl 0 ist. Um auch negative Zahlen ausgeben zu koennen, muss man vorher das Vorzeichen pruefen, dann ggf. ein Minuszeichen ausgeben, und die Zahl negieren, bevor sie ausgegeben wird.