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ę, jak wczytywać dane z pamięci do rejestru.
Dlaczego to ważne:
Pamiętaj z rozdziału 0: instrukcja może używać najwyżej jednego operandu pamięci, a rejestry są znacznie szybsze niż pamięć, więc ładujesz wartości, na których pracujesz, do rejestrów. Tak to robisz.
Składnia:
mov register, [address]Nawiasy [ ] oznaczają: „przejdź pod ten adres pamięci i pobierz zapisaną tam wartość”.
Wyobraź sobie to tak:
Wyobraź sobie, że pod adresem pamięci number znajduje się pudełko. W środku tego pudełka znajduje się wartość, na przykład liczba 5. Gdy zapiszesz:
mov al, [number] ; Load the value from memory address "number" into alWydajesz procesorowi polecenie: „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 tam. 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 | Bez nawiasów myNumber jest adresem, a nie wartością |
| Rozmiar musi się zgadzać | Jeśli pamięć przechowuje bajt, użyj al (a nie rax) |
Częsty błąd:
; Błędnie: bez nawiasów kwadratowych myNumber jest ADRESEM, a nie wartością
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 wykonuje się jako pierwszy (ładuje wartość do al)
%include "solution.asm"
; Zapisz wartość z al
mov r12, rax
; Wypisz "al = "
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; Wypisz wartość z 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