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 valuelabel: nazwa nadana temu adresowi pamięcidw: dyrektywa Define Wordvalue: 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ść 499Co możesz przechowywać w jednym słowie (2 bajty):
| Typ | Zakres | Przykład |
|---|---|---|
| Mała lub średnia liczba | 0 do 65,535 | dw 32000 |
| Przesunięcie w pamięci (16-bitowe) | 0 do 65,535 | dw 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 myWordPorównanie: db vs dw
| Dyrektywa | Rozmiar | Zakres | Używany rejestr |
|---|---|---|---|
db | 1 bajt | 0 do 255 | al |
dw | 2 bajty | 0 do 65,535 | ax |
Wyzwanie
ŁatwyUtwó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
Ta 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-644Definiowanie danych
Sekcja .datadb - definiowanie bajtudw - definiowanie słowadd - definiowanie podwójnego słowadq - definiowanie poczwórnego słowaCiągi znaków z dbSymbol $Podsumowanie: budowanie data.asm2Systemy 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ńczeniePoćwicz samodzielnie: Edytor online Assembly