MOV z pamięci do rejestru
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 17 z 45.
Do tej pory przenosiłeś liczby bezpośrednio do rejestrów (natychmiastowo) i kopiowałeś wartości między rejestrami. Teraz nauczysz się wczytywać dane z pamięci do rejestru.
Dlaczego to ważne:
Pamiętasz z rozdziału 0: procesor nie może pracować bezpośrednio z pamięcią. Najpierw dane muszą zostać załadowane do rejestrów. Oto jak to zrobić.
Składnia:
mov register, [address]Nawiasy [ ] oznaczają: „przejdź pod ten adres pamięci i pobierz zapisaną tam wartość”.
Pomyśl o tym w ten sposób:
Wyobraź sobie, że pod adresem pamięci number znajduje się pudełko. W tym pudełku jest wartość, na przykład liczba 5. Kiedy zapisujesz:
mov al, [number] ; Load the value from memory address "number" into alInformujesz CPU: „Przejdź do pudełka o nazwie number, pobierz dowolną wartość, która jest w środku (w tym przypadku 5), i skopiuj ją do rejestru al”.
Po wykonaniu tej instrukcji wartość 5 jest teraz przechowywana w al. Oryginalna wartość w pudełku pod adresem number pozostaje na miejscu. Nie zostaje usunięta.
Ważne zasady:
| Zasada | Wyjaśnienie |
|---|---|
| Źródłem musi być adres pamięci | [label] lub [address] |
| Nawiasy kwadratowe są wymagane | mov al, myNumber ładuje adres, a nie wartość |
| Rozmiary muszą być zgodne | Jeśli pamięć przechowuje bajt, użyj al (nie rax) |
Częsty błąd:
; Niepoprawnie: ładuje ADRES myNumber, a nie wartość
mov al, myNumber
; Poprawnie: ładuje WARTOŚĆ przechowywaną pod adresem myNumber
mov al, [myNumber]Wyzwanie
Napisz jedną linię kodu asemblera, aby załadować wartość z adresu pamięci value do rejestru al.
Spróbuj swoich sił
section .data
msg db 'al = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; Kod ucznia jest wykonywany jako pierwszy (ładuje wartość do al)
%include "solution.asm"
; Zapisz wartość z al
mov r12, rax
; Wyświetl "al = "
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; Wyświetl wartość w al
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Zakończ program
mov rax, 60
mov rdi, 0
syscallTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Maszyna
Czym jest CPUPamięćRejestry a pamięćJak działają instrukcjeWzorzec dwóch plikówArchitektura x86-642Systemy liczbowe
Dlaczego system binarny?Liczby binarneZamiana z systemu dziesiętnego na binarnyDlaczego system szesnastkowy?Zamiana z systemu szesnastkowego na dziesiętnyZamiana z systemu dziesiętnego na szesnastkowyASCII i system szesnastkowy5Wywołanie systemowe zakończenia
Czym jest syscall?Wywołanie systemowe zakończenia (60)Kody zakończeniaPodsumowanie: prawidłowe zakończenie3Pierwsza instrukcja – MOV
Czym jest MOV?MOV z wartością natychmiastowąMOV między rejestramiMOV z pamięci do rejestruMOV z rejestru do pamięciLEA – załaduj adresMOV z różnymi rozmiaramiĆwiczenie: zamiana rejestrówPowtórka: wyzwanie MOVPoćwicz samodzielnie: Edytor online Assembly