Sehr interessant, ich wollte mir das eh mal ein bisschen zu gemüte führen, da kommst Du mir gerade recht
Du hast im obigen Post zweimal den dritten Schritt O.o(Bzw. auf den 3. folgt der 3.)
Linux / Nasm / Beispielprogramme
- darksider3
- Beiträge: 347
- Registriert: Fr Sep 14, 2012 6:26 pm
- Wohnort: /dev/sda1
- Kontaktdaten:
Re: Linux / Nasm / Beispielprogramme
effizienz ist, wenn ich ein loch bohre und hinterher mein nachbar auch ein bild aufhängen kann... ^^
Meine Homepage und der Microblog von mir
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki
Meine Homepage und der Microblog von mir
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki
-
- Beiträge: 27
- Registriert: Do Okt 31, 2013 9:03 pm
Re: Linux / Nasm / Beispielprogramme
Stimmt, da hab ich wohl tatsächlich zweimal "Schritt 3" als Überschrift, aber der Inhalt geht schon chronologisch korrekt weiter. Leider hab ich keine Editierfunktion gefunden zum das verbessern.darksider3 hat geschrieben:Sehr interessant, ich wollte mir das eh mal ein bisschen zu gemüte führen, da kommst Du mir gerade recht
Du hast im obigen Post zweimal den dritten Schritt O.o(Bzw. auf den 3. folgt der 3.)
Derzeit bin ich am recherchieren, wie man Gleitkommazahlen verarbeitet, und habe vor, ein paar Vergleichsprogramme zu schreiben, die ein paar simple mathematische Operationen durchführen, und zwar jeweils die "normale" Variante, und dann noch mittels FPU-Befehlen, und unter Benutzung von SSE-Erweiterungen. Weiß aber noch nicht, wann ich dazu komme, das ganze in die Realität um zu setzen.
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Linux / Nasm / Beispielprogramme
Man kann hier die Postings nur eine Stunde lang überarbeiten, danach verschwindet der Editierbutton. Der Grund liegt darin, damit man eine Aussage, auf die reagiert wurde, nicht einfach entfernen kann - ansonsten wird der Thread ja unlogisch.osculumobscenum hat geschrieben:Stimmt, da hab ich wohl tatsächlich zweimal "Schritt 3" als Überschrift, aber der Inhalt geht schon chronologisch korrekt weiter. Leider hab ich keine Editierfunktion gefunden zum das verbessern.darksider3 hat geschrieben:Sehr interessant, ich wollte mir das eh mal ein bisschen zu gemüte führen, da kommst Du mir gerade recht
Du hast im obigen Post zweimal den dritten Schritt O.o(Bzw. auf den 3. folgt der 3.)
Dein Posting hat bereits einen tutorial-artigen Charakter. Vielleicht denkst Du doch mal drüber nach, die Texte im Wiki anzuordnen. Das Wiki lässt sich einerseits jederzeit editieren, zum anderen ist es strukturiert aufgebaut, während in einem Forum vorrangig nach Alter des Postings sortiert werden - also mit steigendem Alter nach hinten wegrutschen.
Es ist absolut in Ordnung, wenn Du die Listings im Wiki vorstellst, obwohl noch kein Assembler-Tutorial existiert, so bleiben die Sachen aber auch auffindbar und korrigierbar.
Ich benutze das Wiki teils, um Dinge, die ich recherchiert habe, wiederauffindbar zu halten und durch die Erklärungen auch mir selbst besser zu verdeutlichen: Was man erklärt muss man ja erstmal selbst verstanden haben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
- Beiträge: 27
- Registriert: Do Okt 31, 2013 9:03 pm
Re: Linux / Nasm / Beispielprogramme
Wiki-Einträge oder gar Tutorials zu schreiben scheint mir bedeutend mehr Aufwand zu sein, und den zeitlichen Rahmen zu sprengen, den ich investieren kann. (Leider.)
Können die Posts ggf. auch ohne offizielle Editierfunktion von den Admins korrigiert werden?
Können die Posts ggf. auch ohne offizielle Editierfunktion von den Admins korrigiert werden?
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Linux / Nasm / Beispielprogramme
Klar. Der Chef-Admin guckt sich den Thread auch an und überlegt sich, wie er ihn am Laufen halten kann, bzw. ob und wann er Zeit hat, diesen Thread ins Wiki zu kopieren.osculumobscenum hat geschrieben:Wiki-Einträge oder gar Tutorials zu schreiben scheint mir bedeutend mehr Aufwand zu sein, und den zeitlichen Rahmen zu sprengen, den ich investieren kann. (Leider.)
Können die Posts ggf. auch ohne offizielle Editierfunktion von den Admins korrigiert werden?
Besser wäre, wenn Du das allerdings selbst machen könntest - auch der Reputation halber.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
-
- Beiträge: 27
- Registriert: Do Okt 31, 2013 9:03 pm
Re: Linux / Nasm / Beispielprogramme
Ohne große Vorworte hier mal ein Programm, erklärende Worte dazu weiter unten:
Also ... wenn wir unseren Quellcode so anschauen, dann sehen wir, dass zunächst das obligatorische "Hello World" ausgegeben wird, davor und danach ein paar nop's "ausgeführt" werden, sprich die CPU *nichts* tut, dann folgt ein Sprung nach unten, dann eine Registeränderung für RAX, und dann ein Sprung nach oben...und dann eine Endlosschleife???
Falsch. Hier haben wir etwas, was mit den sogenannten Hochsprachen (meines Wissens) nicht relaisiert werden kann:
mit dem
springen wir tatsächlich nicht zum nächsten Befehl, sondern ein Byte weiter, soll heißen, wir springen direkt IN den Befehl rein. Es werden also die nachfolgenden Opcodes anders interpretiert, als sie zunächst da stehen.
Der Befehl
steht im Maschinencode zunächst als "b8 eb 05 00 00" da. (Die Bytes, die in RAX geladen werden sollen, tauchen also in umgekehrter Reihenfolge auf. Und dadurch, dass wir mit dem oben angeführten Sprungbefehl nicht direkt zu dem Label "ex2" springen, sondern ein Byte weiter, haben wir der CPU plötzlich nicht mehr die Opcodes "b8 eb 05 00 00" vor die Nase gesetzt, sondern vielmehr die Position eins nach hinten gerückt, also "eb 05". Und diese 2 Opcodes sagen der CPU schlicht und ergreifend "springe 5 Bytes nach unten". In unserem Falle also über diesen letzten jmp-Befehl weg, irgendwo in diese "nop's". Somit findet also keine endlose Schleife statt, sondern das Programm wird wie gewollt beendet.
Kleine Assembler-Spielerei, um sich die Möglichkeiten dieser Sprache ein wenig zu betrachten.
Code: Alles auswählen
; zum testen von Sprüngen direkt in Opcodes
; nasm -f elf64 [dateiname.asm]
; ld -s -o [dateiname] [dateiname.o]
[bits 64]
global _start ; Programmstart
section .text
_start:
nop
nop
mov rax, 4 ; schreiben
mov rbx, 1 ; an die Konsole /stdout
mov rcx, message
mov rdx, length
int 80h ; Ausführung
nop
nop
jmp ex2+1 ; Sprung
nop
nop
ex2:
mov rax, 000005ebh
jmp ex2
nop
nop
ex:
mov rax,1 ; Programmende
int 80h
section .data
message: db 'Hello, world!',0x0A ; message and newline
length: equ $-message
Falsch. Hier haben wir etwas, was mit den sogenannten Hochsprachen (meines Wissens) nicht relaisiert werden kann:
mit dem
Code: Alles auswählen
jmp ex2+1
Der Befehl
Code: Alles auswählen
mov rax, 000005ebh
Kleine Assembler-Spielerei, um sich die Möglichkeiten dieser Sprache ein wenig zu betrachten.
-
- Beiträge: 27
- Registriert: Do Okt 31, 2013 9:03 pm
Re: Linux / Nasm / Beispielprogramme
Dateien anlegen, rein schreiben, daraus lesen, schließen.
Code: Alles auswählen
; 64-bit ...demonstriert Umgang mit Dateien
; Netzfund, modified by myself
; nasm -f elf64 file.asm
; ld -s -o file file.o
[bits 64]
global _start ; global entry point export for ld
section .data
_start:
;create the file
mov eax, 8
mov ebx, file_name
mov ecx, 0777 ; read, write and execute by all
int 0x80 ; call kernel
mov [fd_out], eax ; store file-handle
; write into the file
mov edx,len ; number of bytes
mov ecx, msg ; message to write
mov ebx, [fd_out] ; file descriptor
mov eax,4 ; system call number (sys_write)
int 0x80 ; call kernel
; close the file
mov eax, 6 ; close ...
mov ebx, [fd_out] ; ... via handle
int 0x80
; write the message indicating end of file write
mov eax, 4 ; write...
mov ebx, 1 ; ...to console / stdout
mov ecx, msg_done ; text
mov edx, len_done ; textlength
int 0x80
;open the file for reading
mov eax, 5
mov ebx, file_name ; which file
mov ecx, 0 ; for read only access
mov edx, 0777 ; read, write and execute by all
int 0x80
mov [fd_in], eax ; store handle
;read from file
mov eax, 3 ; read from file
mov ebx, [fd_in] ; via handle
mov ecx, info ; where to store the read text
mov edx, 27 ; bufferlength
int 0x80
; close the file
mov eax, 6 ; close ...
mov ebx, [fd_in] ; ... via handle
int 0x80
; print the info
mov eax, 4 ; write ...
mov ebx, 1 ; to console / stdout
mov ecx, info ; text
mov edx, 27 ; textlength
int 0x80
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
file_name db 'myfile.txt',0
msg db 'Testtext to write.........',0xa
len equ $-msg
msg_done db 'Written to file', 0xa
len_done equ $-msg_done
section .bss
fd_out resb 1
fd_in resb 1
info resb 27