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:33] – [Hallo Welt reloaded] 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/ | ||
- | |||
- | ---- | ||
- | {{: | ||
- | === (A1) === | ||
- | |||
- | * Gib 12 Sterne aus | ||
- | * Gib 4 Sterne aus | ||
- | |||
- | |||
- | === 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 Regsiter ebx muss der Filedescriptor, | ||
- | * 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> | ||
- | section .data ; | ||
- | userMsg db 'Bitte Zahl eingeben: ' ; Eingabeprompt | ||
- | lenUserMsg equ $-userMsg | ||
- | dispMsg db 'Du hast die folgende Zahl eingegeben: ' | ||
- | lenDispMsg equ $-dispMsg | ||
- | |||
- | |||
- | |||
- | section .bss ; Beschreibbarer Speicher, vobelegt mit 0-en | ||
- | antwort resb 5 ; 5 Byte | ||
- | |||
- | | ||
- | global _start | ||
- | |||
- | | ||
- | |||
- | ;User prompt ausgeben | ||
- | mov eax, 4 | ||
- | mov ebx, 0 | ||
- | mov ecx, userMsg | ||
- | mov edx, lenUserMsg | ||
- | int 80h | ||
- | |||
- | ;Neu: Benutzereingabe lesen | ||
- | mov eax, 3 ; syscall Nummer: 3 | ||
- | mov ebx, 0 ; lesen von stdin | ||
- | mov ecx, antwort | ||
- | mov edx, 5 ; 5 bytes lang | ||
- | int 80h ; Syscall! | ||
- | |||
- | ;Ausgabe | ||
- | mov eax, 4 | ||
- | mov ebx, 0 | ||
- | mov ecx, dispMsg | ||
- | mov edx, lenDispMsg | ||
- | int 80h | ||
- | |||
- | ;Ausgabe der eingegebenen Zahl | ||
- | mov eax, 4 | ||
- | mov ebx, 0 | ||
- | mov ecx, antwort | ||
- | mov edx, 5 | ||
- | int 80h | ||
- | |||
- | ; Exit code | ||
- | mov eax, 1 | ||
- | mov ebx, 0 | ||
- | int 80h | ||
- | |||
- | </ | ||
- | |||
- | ---- | ||
- | {{: | ||
- | === (A1) === | ||
- | |||
- | Übersetze und teste das Programm. Was passiert, wenn man weniger/ | ||
- | |||