Menu
Coddy logo textTech

MOV z różnymi rozmiarami

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

Używasz już al (8 bitów) i rax (64 bity). Istnieją też inne rozmiary. Różne rejestry przechowują różne ilości danych.

Rodziny rejestrów x86-64:

RejestrRozmiarBityKiedy używać
rax8 bajtów64 bityPełne liczby, adresy, numery wywołań systemowych
eax4 bajty32 bityDolna połowa rax
ax2 bajty16 bitówDolna połowa eax
al1 bajt8 bitówDolna połowa ax (bity 0-7)
ah1 bajt8 bitówGórna połowa ax (bity 8-15)

Ten sam wzorzec dotyczy innych rejestrów:

64-bitowy32-bitowy16-bitowy8-bitowy (młodszy)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

Dlaczego rozmiar ma znaczenie:

Podczas przenoszenia danych rozmiary źródła i miejsca docelowego powinny być zgodne. Jeśli nie są zgodne, procesor może:

  • Skopiować tylko część danych
  • Skopiować dodatkowe bajty z nieznanej pamięci
  • Spowodować błąd

Przykłady zgodnych rozmiarów:

mov rax, 1000        ; 64-bitowy na 64-bitowy (w porządku)
mov eax, 1000        ; 32-bitowy na 32-bitowy (w porządku)
mov ax, 1000         ; 16-bitowy na 16-bitowy (w porządku)
mov al, 5            ; 8-bitowy na 8-bitowy (w porządku)

Co się dzieje przy niezgodnych rozmiarach:

mov rax, 0x123456789ABC   ; wartość 64-bitowa
mov al, 0xFF              ; al otrzymuje 0xFF, pozostałe bity rax pozostają bez zmian

Gdy przenosisz mniejszą wartość do większego rejestru, starsze bity pozostają takie same. Może to prowadzić do nieoczekiwanych wyników.

Bezpieczna zasada:

Jak dotąd w tym kursie wszystkie dane w pamięci zajmują 1 bajt. Dlatego używasz al (a nie rax).

Podczas przenoszenia danych rozmiar rejestru musi odpowiadać rozmiarowi pamięci:

  • 1 bajt pamięci → użyj al, bl, cl itd.
  • 8 bajtów pamięci → użyj rax, rbx, rcx itd.

W rozdziale 3 dowiesz się o różnych rozmiarach pamięci.

challenge icon

Wyzwanie

Masz już utworzone te adresy danych:

  • source: zawiera wartość 1-bajtową (5)
  • destination: puste miejsce (1 bajt)

Napisz dwie linie asemblera, aby:

  1. Załadować wartość z source do al
  2. Zapisać wartość z al do destination

Spróbuj swoich sił

section .data
    msg db 'destination = '
    msg_len equ $ - msg

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; Najpierw wykonywany jest kod ucznia (wczytuje wartość z source i zapisuje ją w destination)
    
    %include "solution.asm"
    
    ; Wczytaj wartość zapisaną w destination
    mov al, [destination]
    
    ; Zapisz ją
    mov r12, rax
    
    ; Wypisz "destination = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; Wypisz wartość
    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
    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