Assembler verstehen!!!
-
Hallo!
Ich bin ziemlich am Anfang was Assembler anbelangt.
Ich möchte grundsätzlich folgendes verstehen.
Die programmierweise in Assembler. Das hinundher schieben von iregndlwelchen Dingen. Sorry aber mir kommt im Moment alles wirklich so vor.
Ich weiss es gibt Allzweckregister,Segmentregister,Zeige und Indexregister und Flagregister. Aber was genau macht man damit.
Ich habe bis jetzt eine Variable angelegt den Typ bestimmt und initilasiert
fertig aus aber in Assembler.?????
Bitte kann mir sinngemäß jemand erklären was hier vor sich geht.
Grüße
Vielen Dank
-
Gerade Variablen anlegen ist doch in Assembler um vieles leichter, als zB. in c++
Kurzes Beispiel eines Assembler codes mit Variablen (TASM):
P386 ;benutzter CPU
model tiny ;speichermodell -> hier ist alles in einem Speichersegment
IDEAL ;geschmackssachedataseg
;hier drunter stehen jetzt initialisierte Variablen, also
;welche, die von Anfang an einen bestimmten Wert haben.
HalloWelt db "Hallo Welt"
Absatz db 0Dh,0Ah
Ende db 24hcodeseg
;hier kommt nun der code
org 100h ;code faengt im Speicher bei Offset 100h an
Start: ;start label
mov ah,09h ;wert in Register ah schreiben
mov dx,offset HalloWelt ;Wert in Register dx schreiben
int 21h ;message schreiben dur Aufrufen von interrupt 33 (21h)
ret ;exit
End Start ;Ende vom Code. Code faengt bei Label "Start" anHoffe das reicht erstmal als Uebersicht, sonst bitte genauere Fragen stellen
-
tasm kompiliert das nicht, der meint in zeile 16 wäre ein 32-bit pointer. habe es mit tasm und tasm32 probiert und beides mal der fehler
-
*vor Kopf hau* Sorry.
Stell IDEAL an erste Stelle dann laeufts.
-
hehe, danke jetzt funktioniert es schonmal zu assemblen und linken, aber das Programm gibt 5 mal Hallo Welt aus, aber dazwischen ist immer voll viele Leerzeichen und so Smilies und andere Zeichen, sieht aus wie Müll aus dem Speicher. Bist du dir sicher, dass das Programm so richtig ist? Oder ist das geplant, das da noch so komische andere Zeichen drin sind (es piept auch nen paar mal durch den PC-Speaker *g*, das liegt w*****einlich an den nicht darstellbaren Zeichen). Ich benutze Windows XP (Hello World Programm aus meinem Buch funzte) und TASM 5
-
Wahrscheinlich falsch gelinkt, denn bei mir lief es. :p
Ich habe folgende Optionen zum Erstellen benutzt:
TASM /MU /OS /Q Drive:\\Path\\Infile.asm Drive:\\Path\\Infile.obj
TLINK Drive:\\Path\\Infile.obj /x /Tdc
-
lol, thx 2 nobuo! woher sollte man das wissen mit den ganzen optionen? die stehen zwar beschrieben, aber wär ich trotzdem nie drauf gekommen :p
in meinem buch "strukturierte einführung" (bin erst kurz nach dem hallo welt programm) musste ich's einfach nur so machen:
tasm hello
tlink hello
-
axo, jetzt ist es irgendwie ne com datei geworden, davor hatte ich ne exe datei bekommen
-
jup. Das sollte auch so sein. Der code war fuer eine .com-Datei gedacht.
-
du musst das Endzeichen angeben, damit der Computer weiß wo das Ende des Strings ist.
zB so
.MODEL SMALL .STACK 100h .DATA HalloMeldung DB 'Hallo, Welt',13,10,'$' .CODE mov ax,@data mov ds,ax ; DS zeigt auf das Datensegment mov ah,9 ; DOS-Funktion String-Ausgabe mov dx,OFFSET HalloMeldung ; Zeiger auf Hallo Welt int 21h ; Ausgabe Hallo Welt mov ah,4Ch ; DOS-Funktion Programmende int 21h ; Programm beenden END
hier sind noch 2 Beispiele
.MODEL SMALL .STACK 100h .DATA Tageszeitfrage DB 'Ist es Nachmittag (J/N)?$' GutenMorgenGruss LABEL BYTE DB 13,10,'Guten Morgen',13,10,'$' GutenTagGruss LABEL BYTE DB 13,10,'Guten Tag',13,10,'$' .CODE mov ax,@data mov ds,ax ; DS zeigt auf das Datensegment mov dx,OFFSET Tageszeitfrage ; Zeiger auf Tageszeitfrage mov ah,9 ; DOS-Funktion Stringausgabe int 21h ; Ausgabe der Frage mov ah,1 ; DOS-Funktion, Zeihchen lesen int 21h ; Zeichen lesen cmp al,'j' ; Mit 'j' beantworten? je Nachmittag ; Ja, es ist nachmittags cmp al,'J' ; Mit 'J' beantworten? jne Vormittag ; Nein, es ist vormittags Nachmittag: mov dx, OFFSET GutenTagGruss jmp GrussAnzeigen Vormittag: mov dx,OFFSET GutenMorgenGruss GrussAnzeigen: mov ah,9 ; DOS-Funktion Stringausgabe int 21h ; Ausgabe des Gruáes mov ah,4Ch ; DOS-Funktion Programmende int 21h ; Programm beenden END mov ah,4Ch ; DOS-Funktion Programmende int 21h ; Programm beenden END
.MODEL SMALL .STACK 100h .DATA MAX_STRING EQU 1000 StringUmzudrehen DB MAX_STRING DUP (?) UmgedrehterString DB MAX_STRING DUP (?) .CODE mov ax,@data mov ds,ax ; DS zeigt auf das Datendegment mov ah,3Fh ;DOS-Funktion: über Handle ; lesen mov bx,0 ; ********eingabegerät mov cx,MAX_STRING ; Maximale Anzahl an Zeichen mov dx,OFFSET StringUmzudrehen ; String hier speichern int 21h ; String lesen and ax,ax ; Zeichen gelesen? jz Fertig ;Alles klar mov bx,OFFSET StringUmzudrehen mov si,OFFSET UmgedrehterString add si,cx ; Zeiger auf das Stringende dec si ; des umgedrehten Strings Umdrehen: mov al,[bx] ; Zeichen holen mov [si],al ; Zeichen umgekehrt abspeichern inc bx ; Zeiger zum nächsten Zeichen dec si ; Zeiger zum vorherigen Zeichen loop Umdrehen ; Nächstes Zeichen, ; falls vorhanden pop cx ; Stringlänge zurückholen mov ah,40h ; DOS über Hndle schreiben mov bx,1 ; ********ausgabegerät mov dx,OFFSET UmgedrehterString ; Zeiger auf den umgedrehten ; String int 21h ; String ausgeben Fertig: mov ah,4Ch ; DOS-Funktion Programm beenden int 21h ; Programm beenden END
-
Das "Endzeichen" "", 24h oder auch 36 (dec)
-
mal zur frage was man mit registern macht. eigentlich daten speichern und verarbeiten. ( ist die schnellste möglichkeit. wenn ma die daten in den registern ablegen kann)
bezie mich mal auf den 8086 ( den sogenanten uhrfater )
ax, bx, cx, dx sind universalregister, mit denen man so zimlich alles machen darf. werte reinschreiben und auslesen, und manipuliren, ohne das da schlimmeres passiert. ggf müssen bei bestimten befehlen, in bestimmten register die operanden stehen ( z.b. mull, div )
cs, ip (code segment und instruction pointer)sind zur bestimmung der momentanen programmposition. wird nach jedem befehl verändert ( ip ) bzw bei jedem sprung ( ip und cs )
ss, sp (stack segment und stack pointer) sind zum arbeiten mit dem stack notwendig. die befehler push, pop, int, ret, iret greifen darauf zu und manipulieren ihn.
ds (data segment) ist der segemnt zeiger/selektor auf das datensegment, mit dessen hilfe lassen sich meist varialben im speicher adressieren,( geht auch teilweise mit es)
es ( extra segment) ein zusätzlicher segment zeiger/selektor wird nur bei ganz bestimmten sachen benötigt, steht sonsten zur freihen verfügung
PSW ( programm status word) hir werden informationen über ergebnisse der letzten operation gespeichert, sowie einstellungen am prozessor vorgenommen, sind zum beispiel interrupte erlaubt oder nicht, oder war das ergebnis der letzten operation gleich 0, ist bei der addition ein überlauf aufgetreten, oder ein vorzeichenwechsel, ....
so nun hör ich mal mit meiner kleinen registerkunde auf. ich hoffe das ich keine vergesen hab.
gruss termite
-
Original erstellt von Termite:
so nun hör ich mal mit meiner kleinen registerkunde auf. ich hoffe das ich keine vergesen hab.
Doch, hast du.
Und zwar SI (source index), DI (destination index) und das FLAGS Register.
Ach ja, 'Urvater' schreibt man nicht 'Uhrfater'
-
hab mich schon gewunder das das nur 2 indexregister waren, und 4 segment register
CS:IP
SS:SP
DS:DI
ES:SIund das flag register nent sich soweit ich weis auch PSW ( program status word)
dank für die korrektur malfunction