Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
faecher:informatik:oberstufe:techinf:assembler:beispiele1:start [13.09.2021 19:03] – [Benutzereingabe] sbel | faecher:informatik:oberstufe:techinf:assembler:beispiele1:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ===== Beispiele ===== | ||
- | |||
- | ==== Hallo Welt reloaded ==== | ||
- | |||
- | <code asm> | ||
- | section .data | ||
- | msg db ' | ||
- | len equ $ - msg ;Laenge der Message | ||
- | | ||
- | |||
- | |||
- | | ||
- | global _start | ||
- | |||
- | | ||
- | mov edx, | ||
- | mov ecx, | ||
- | mov ebx,1 ;file descriptor (stdout) | ||
- | mov eax,4 ;system call number (sys_write) | ||
- | int 0x80 ;call kernel | ||
- | |||
- | mov edx,9 ;message length | ||
- | mov ecx, | ||
- | mov ebx,1 ;file descriptor (stdout) | ||
- | mov eax,4 ;system call number (sys_write) | ||
- | int 0x80 ;call kernel | ||
- | |||
- | mov eax,1 ;system call number (sys_exit) | ||
- | int 0x80 ;call kernel | ||
- | |||
- | </ | ||
- | |||
- | Hier kommt wieder der **Linux-Systemaufruf** '' | ||
- | |||
- | * Lege die Nummer des Systemaufrufs in das EAX-Register | ||
- | * Speichere die Argumente für den Systemaufruf in den Registern EBX, ECX, usw. | ||
- | * Rufe den Interrupt (80h) auf | ||
- | * Das Ergebnis des Systemaufrufs wird normalerweise im EAX-Register zurückgegeben. | ||
- | |||
- | Um das erfolgreich zum Einsatz zu bringen, muss man wissen, was ein Systemaufruf in welchem Register erwartet, damit er funktioniert, | ||
- | |||
- | ^ Name ^ %eax ^ %ebx ^ %ecx ^ %edx ^ %esx ^ %edi ^ | ||
- | | Write | 4 | unsigned int (Output Stream) | ||
- | |||
- | Das kann man sich ein wenig wie eine Funktion/ | ||
- | |||
- | === Weitere System-Calls: | ||
- | |||
- | |||
- | ^ Name ^ %eax ^ %ebx ^ %ecx ^ %edx ^ %esx ^ %edi ^ | ||
- | | Exit | 1 | int (Exit Code) | - | - | - | - | | ||
- | | Fork | 2 | struct pt_regs | ||
- | | Read | 3 | unsigned int | char * | size_t | ||
- | | Write | 4 | unsigned int (Output Stream) | ||
- | | Open | 5 | const char * | int | int | - | - | | ||
- | | Close | 6 | unsigned int | - | - | - | - | | ||
- | |||
- | ==== Benutzereingabe ==== | ||
- | |||
- | |||
- | Mit dem Sys-Call 3 lässt sich also eine Eingabe realisieren - " | ||
- | |||
- | Damit das funktioniert muss man mehrere Dinge beachten: | ||
- | |||
- | * Man benötigt einen reservierten, | ||
- | * Ins Register eax muss der Wert 3 geschrieben werden | ||
- | * Ins Register ecx muss die Adresse des in .bss reservierten Bereichs | ||
- | * Ins Register edx muss die Länge der zu lesenden Informationen | ||
- | * Dann wird der Syscall durch den Interrupt 0x80 ausgelöst | ||
- | |||
- | <code asm> | ||
- | |||
- | </ |