Menu
Coddy logo textTech

Wywołanie systemowe write (1)

Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 35 z 45.

Wiesz już, jak zakończyć działanie programu. Jednak ciche zakończenie nie jest zbyt przydatne. Chcesz, aby program wypisywał dane wyjściowe, żeby użytkownik mógł coś zobaczyć.

Do tego potrzebujesz wywołania systemowego write.

Czym jest wywołanie systemowe write?

Wywołanie systemowe write informuje system operacyjny, że ma wyświetlić tekst na ekranie (lub zapisać go w pliku). Dzięki niemu Twój program generuje dane wyjściowe.

Numer systemowy syscall dla write to 1.

Jak działa write:

W przeciwieństwie do wywołania systemowego exit (które wymaga tylko jednego argumentu), write wymaga trzech argumentów:

ArgumentRejestrCo robiPrzykład
Deskryptor plikurdiGdzie zapisywać (1 = ekran)mov rdi, 1
Adres buforarsiGdzie w pamięci znajduje się tekstmov rsi, message
Liczba bajtówrdxIle bajtów wydrukowaćmov rdx, 13

Wywołanie systemowe write w akcji:

mov rax, 1      ; numer wywołania systemowego dla write
mov rdi, 1      ; deskryptor pliku 1 = stdout (ekran)
mov rsi, msg    ; adres ciągu znaków do wypisania
mov rdx, 13     ; liczba bajtów do wypisania
syscall         ; zleć systemowi operacyjnemu wypisanie

Aby wyświetlić komunikat na ekranie, potrzebujemy 5 wierszy. Najpierw wpisujemy numer wywołania systemowego 1 do rax, aby zapisywać. Następnie wpisujemy 1 do rdi, aby powiedzieć systemowi operacyjnemu, że ma wyświetlić tekst na ekranie.

Następnie umieszczamy adres ciągu znaków (msg) w rsi. Potem umieszczamy liczbę bajtów (13) w rdx. Na koniec wykonujemy syscall, aby poprosić system operacyjny o wyświetlenie tekstu.

Co się dzieje, gdy wykonujesz write:

  1. Procesor przechodzi do jądra Linux
  2. Jądro widzi: "wywołanie systemowe write"
  3. Odczytuje rdi (gdzie zapisać), rsi (gdzie znajduje się tekst) i rdx (ile bajtów)
  1. Wyświetla tekst na ekranie
  2. Zwraca sterowanie do twojego programu

Łącząc to z ciągiem znaków:

section .data
    msg db 'Hello', 0x0a    ; ciąg znaków ze znakiem nowej linii

section .text
    global _start

_start:
    mov rax, 1              ; wywołanie systemowe write
    mov rdi, 1              ; stdout
    mov rsi, msg            ; adres ciągu znaków
    mov rdx, 6              ; długość (Hello + znak nowej linii = 6 bajtów)
    syscall

    mov rax, 60             ; wywołanie systemowe exit
    mov rdi, 0
    syscall

Ten program wyświetla Hello, a następnie kończy działanie.

challenge icon

Wyzwanie

Napisz program, który wypisuje komunikat "Hi", a po nim znak nowej linii. Użyj wywołania systemowego write.

Ciąg znaków jest już zdefiniowany w zestawie testowym. Musisz jedynie przygotować argumenty wywołania systemowego.

Spróbuj swoich sił

section .data
    msg db 'Hi', 0x0a
    msgLen equ $ - msg

section .text
    global _start

_start:
    ; TODO: Przygotuj i wywołaj wywołanie systemowe write, aby wypisać msg
    ; Użyj rax=1, rdi=1, rsi=msg, rdx=msgLen

    ; Zakończ program
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Edytor online Assembly