Menu
Coddy logo textTech

dw - definiowanie słowa

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

db tworzy jeden bajt danych. Czasami jednak trzeba przechowywać większe liczby, które nie mieszczą się w jednym bajcie (0-255). Do tego służy dw: zdefiniuj słowo.

Słowo w asemblerze x86 ma 2 bajty (16 bitów).

Składnia:

label dw value
  • label: nazwa nadana temu adresowi pamięci
  • dw: dyrektywa Define Word
  • value: liczba do zapisania (od 0 do 65,535)

Przykłady:

section .data
    smallNum dw 1000       ; 2 bajty, wartość 1000
    bigNum   dw 65535      ; 2 bajty, maksymalna wartość (wszystkie bity to 1)
    price    dw 499        ; 2 bajty, wartość 499

Co możesz przechowywać w jednym słowie (2 bajty):

TypZakresPrzykład
Mała lub średnia liczba0 do 65,535dw 32000
Przesunięcie w pamięci (16-bitowe)0 do 65,535dw 0x7FFF

Wiele słów w jednym wierszu:

section .data
    values dw 100, 200, 300, 400    ; Tworzy 4 słowa (łącznie 8 bajtów)

Jak używać słowa w kodzie:

Ponieważ słowo ma 2 bajty, użyj 16-bitowego rejestru ax (a nie al):

section .data
    myWord dw 1000

section .text
    mov ax, [myWord]    ; Załaduj wartość 1000 do ax
    add ax, 500         ; ax przyjmuje wartość 1500
    mov [myWord], ax    ; Zapisz 1500 z powrotem w myWord

Porównanie: db vs dw

DyrektywaRozmiarZakresUżywany rejestr
db1 bajt0 do 255al
dw2 bajty0 do 65,535ax
challenge icon

Wyzwanie

Łatwy

Utwórz słowo o nazwie population i wartości 25000 w sekcji .data.

Spróbuj swoich sił

%include "data.asm"

section .data
    msg db 'population = '
    msg_len equ $ - msg
    newline db 0xa

section .bss
    buffer resb 16

section .text
    global _start

_start:
    ; Załaduj wartość typu word do ax
    mov ax, [population]
    
    ; Przekształć ax w ciąg cyfr dziesiętnych
    mov rsi, buffer
    add rsi, 15          ; Przejdź na koniec bufora
    mov byte [rsi], 0    ; Znak kończący ciąg
    
    mov cx, 10           ; Dzielnik do konwersji na zapis dziesiętny
    
convert_loop:
    xor dx, dx           ; Wyzeruj dx przed dzieleniem
    div cx               ; Podziel ax przez 10, ax = iloraz, dx = reszta
    add dl, '0'          ; Przekształć resztę w znak ASCII
    dec rsi
    mov [rsi], dl        ; Zapisz cyfrę
    cmp ax, 0
    jnz convert_loop

    ; Zachowaj wskaźnik do cyfry i długość, ZANIM zostaną nadpisane
    mov r8, rsi          ; r8 = wskaźnik do pierwszej cyfry
    mov r9, buffer
    add r9, 15
    sub r9, rsi          ; r9 = liczba cyfr
    
    ; Wypisz komunikat
    mov rax, 1
    mov rdi, 1
    mov rdx, msg_len
    mov rsi, msg
    syscall
    
    ; Wypisz liczbę
    mov rax, 1
    mov rdi, 1
    mov rsi, r8
    mov rdx, r9
    syscall
    
    ; Wypisz znak nowej linii
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    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