dq - definiowanie poczwórnego słowa
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 27 z 45.
dd tworzy 4 bajty danych. Czasami jednak potrzebujesz jeszcze większych liczb lub adresów pamięci. Do tego służy dq: zdefiniuj quad word.
Słowo poczwórne w asemblerze x86 ma 8 bajtów (64 bity).
Składnia:
label dq valuePrzykłady:
section .data
myNumber dq 10000000000 ; 8 bajtów, wartość 10 miliardów
bigNum dq 123456789012 ; Bardzo duża liczba
address dq msg ; Adres pamięci etykiety "msg"Tabela porównawcza:
| Dyrektywa | Rozmiar | Zakres | Rejestr do użycia |
|---|---|---|---|
db | 1 bajt | od 0 do 255 | al |
dw | 2 bajty | od 0 do 65,535 | ax |
dd | 4 bajty | od 0 do 4,294,967,295 | eax |
dq | 8 bajtów | Bardzo duży (2⁶⁴-1) | rax |
Jak używać słowa poczwórnego w kodzie:
section .data
myNumber dq 5000000000
section .text
mov rax, [myNumber] ; Załaduj wartość do rax
add rax, 1000000000 ; rax przyjmuje wartość 6 miliardów
mov [myNumber], rax ; Zapisz z powrotemSpecjalne zastosowanie: przechowywanie adresów
dq służy również do przechowywania adresów pamięci (wskaźników):
section .data
message db 'Hello', 0
pointer dq message ; Przechowuje adres messageWażna zasada:
| Zasada | Wyjaśnienie |
|---|---|
Użyj rax, aby wczytać lub zapisać | rax to rejestr 64-bitowy |
Wyzwanie
ŁatwyUtwórz słowo poczwórne o nazwie universe_age i wartości 13800000000 w sekcji .data.
Spróbuj swoich sił
%include "data.asm"
section .data
msg db 'universe_age = '
msg_len equ $ - msg
newline db 0xa
section .bss
buffer resb 64
section .text
global _start
_start:
; Wczytaj wartość 64-bitową do rax
mov rax, [universe_age]
; Przekształć rax na ciąg dziesiętny
mov rsi, buffer
add rsi, 63 ; Przejdź na koniec bufora
mov byte [rsi], 0 ; Znak końca ciągu
mov rcx, 10 ; Dzielnik do konwersji dziesiętnej
convert_loop:
xor rdx, rdx ; Wyzeruj rdx przed dzieleniem
div rcx ; Podziel rax przez 10, rax = iloraz, rdx = reszta
add dl, '0' ; Przekształć resztę na znak ASCII
dec rsi
mov [rsi], dl ; Zapisz cyfrę
cmp rax, 0
jnz convert_loop
; Zapisz wskaźnik na cyfrę i długość, ZANIM zostaną nadpisane
mov r8, rsi ; r8 = wskaźnik na pierwszą cyfrę
mov r9, buffer
add r9, 63
sub r9, rsi ; r9 = liczba cyfr
; Wyświetl komunikat
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; Wyświetl liczbę
mov rax, 1
mov rdi, 1
mov rsi, r8
mov rdx, r9
syscall
; Wyświetl 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