Linux / Nasm / Beispielprogramme

Pascal, Basic und andere nicht aufgelistete
Benutzeravatar
darksider3
Beiträge: 347
Registriert: Fr Sep 14, 2012 6:26 pm
Wohnort: /dev/sda1
Kontaktdaten:

Re: Linux / Nasm / Beispielprogramme

Beitrag von darksider3 » So Nov 03, 2013 10:59 am

Sehr interessant, ich wollte mir das eh mal ein bisschen zu gemüte führen, da kommst Du mir gerade recht :D

Du hast im obigen Post zweimal den dritten Schritt O.o(Bzw. auf den 3. folgt der 3.)
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

osculumobscenum
Beiträge: 25
Registriert: Do Okt 31, 2013 9:03 pm

Re: Linux / Nasm / Beispielprogramme

Beitrag von osculumobscenum » So Nov 10, 2013 6:49 pm

darksider3 hat geschrieben:Sehr interessant, ich wollte mir das eh mal ein bisschen zu gemüte führen, da kommst Du mir gerade recht :D

Du hast im obigen Post zweimal den dritten Schritt O.o(Bzw. auf den 3. folgt der 3.)
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.

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. :-)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Linux / Nasm / Beispielprogramme

Beitrag von Xin » Mo Nov 11, 2013 11:27 am

osculumobscenum hat geschrieben:
darksider3 hat geschrieben:Sehr interessant, ich wollte mir das eh mal ein bisschen zu gemüte führen, da kommst Du mir gerade recht :D

Du hast im obigen Post zweimal den dritten Schritt O.o(Bzw. auf den 3. folgt der 3.)
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.
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.

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.

osculumobscenum
Beiträge: 25
Registriert: Do Okt 31, 2013 9:03 pm

Re: Linux / Nasm / Beispielprogramme

Beitrag von osculumobscenum » Di Nov 12, 2013 9:13 pm

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?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Linux / Nasm / Beispielprogramme

Beitrag von Xin » Di Nov 12, 2013 9:53 pm

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?
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.
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.

osculumobscenum
Beiträge: 25
Registriert: Do Okt 31, 2013 9:03 pm

Re: Linux / Nasm / Beispielprogramme

Beitrag von osculumobscenum » Di Nov 19, 2013 11:31 pm

Ohne große Vorworte hier mal ein Programm, erklärende Worte dazu weiter unten:

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				
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

Code: Alles auswählen

jmp ex2+1	
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

Code: Alles auswählen

mov rax, 000005ebh
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.

osculumobscenum
Beiträge: 25
Registriert: Do Okt 31, 2013 9:03 pm

Re: Linux / Nasm / Beispielprogramme

Beitrag von osculumobscenum » Mi Nov 20, 2013 9:45 pm

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


Antworten