dw - Word Tanımlama
Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 25 / 45.
db bir bayt veri oluşturur. Ancak bazen tek bir bayta (0-255) sığmayan daha büyük sayıları depolamanız gerekir. Bunun için dw kullanılır: Word Tanımla.
x86 assembly'de bir word 2 bayttır (16 bit).
Sözdizimi:
label dw valuelabel: bu bellek adresine verdiğiniz addw: Word tanımlama yönergesivalue: depolanacak sayı (0 ile 65.535 arası)
Örnekler:
section .data
smallNum dw 1000 ; 2 bayt, değer 1000
bigNum dw 65535 ; 2 bayt, maksimum değer (tüm bitler 1)
price dw 499 ; 2 bayt, değer 499Tek bir kelimede (2 bayt) saklayabilecekleriniz:
| Tür | Aralık | Örnek |
|---|---|---|
| Küçük ila orta büyüklükte sayı | 0 to 65,535 | dw 32000 |
| Bellek ofseti (16 bit) | 0 to 65,535 | dw 0x7FFF |
Tek bir satırda birden çok sözcük:
section .data
values dw 100, 200, 300, 400 ; 4 word oluşturur (toplam 8 bayt)Kodunuzda bir sözcük nasıl kullanılır:
Bir sözcük 2 bayt olduğundan, 16 bitlik ax yazmacını (al değil) kullanırsınız:
section .data
myWord dw 1000
section .text
mov ax, [myWord] ; 1000 değerini ax'e yükle
add ax, 500 ; ax 1500 olur
mov [myWord], ax ; 1500'ü myWord'e geri saklaKarşılaştırma: db ve dw
| Yönerge | Boyut | Aralık | Kullanılacak yazmaç |
|---|---|---|---|
db | 1 bayt | 0 - 255 | al |
dw | 2 bayt | 0 - 65,535 | ax |
Görev
Kolay.data bölümünde 25000 değerine sahip population adında bir sözcük oluşturun.
Kendin dene
%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:
; Word değerini ax'e yükle
mov ax, [population]
; ax'i ondalık dizeye dönüştür
mov rsi, buffer
add rsi, 15 ; Buffer'ın sonuna git
mov byte [rsi], 0 ; Null sonlandırıcı
mov cx, 10 ; Ondalık dönüşüm için bölen
convert_loop:
xor dx, dx ; Bölme için dx'i temizle
div cx ; ax'i 10'a böl, ax = bölüm, dx = kalan
add dl, '0' ; Kalanı ASCII'ye dönüştür
dec rsi
mov [rsi], dl ; Basamağı sakla
cmp ax, 0
jnz convert_loop
; Basamak işaretçisini ve uzunluğunu BOZULMADAN ÖNCE kaydet
mov r8, rsi ; r8 = ilk basamağa işaretçi
mov r9, buffer
add r9, 15
sub r9, rsi ; r9 = basamak sayısı
; Mesajı yazdır
mov rax, 1
mov rdi, 1
mov rdx, msg_len
mov rsi, msg
syscall
; Sayıyı yazdır
mov rax, 1
mov rdi, 1
mov rsi, r8
mov rdx, r9
syscall
; Yeni satır yazdır
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Çıkış
mov rax, 60
mov rdi, 0
syscall
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Temel Bilgiler bölümündeki tüm dersler
Kendi başına pratik yap: Assembly playground