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