Menu
Coddy logo textTech

dw - Word Tanımlama

Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 25 / 45.

db bir baytlık veri oluşturur. Ancak bazen tek bir bayta (0-255) sığmayan daha büyük sayıları saklamanız gerekir. Bunun için dwDefine Word kullanırsınız.

x86 assembly'de bir word 2 bayttır (16 bit).

Sözdizimi:

label dw value
  • label — bu bellek adresine verdiğiniz ad
  • dw — Define Word yönergesi
  • value — saklanacak 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 499

Bir word (2 bayt) içinde saklayabilecekleriniz:

TürAralıkÖrnek
Küçük ila orta büyüklükte sayı0 ile 65.535 arasıdw 32000
Bellek ofseti (16-bit)0 ile 65.535 arasıdw 0x7FFF

Tek satırda birden fazla word:

section .data
    values dw 100, 200, 300, 400    ; 4 word oluşturur (toplam 8 bayt)

Kodunuzda bir word nasıl kullanılır:

Bir word 2 bayt olduğu için, 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'ü tekrar myWord içine sakla

Karşılaştırma: db vs dw

YönergeBoyutAralıkKullanılacak yazmaç
db1 bayt0 ile 255 arasıal
dw2 bayt0 ile 65.535 arasıax
challenge icon

Görev

Kolay

.data bölümünde 25000 değerine sahip population adında bir word 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          ; Tamponun sonuna git
    mov byte [rsi], 0    ; Boş sonlandırıcı
    
    mov cx, 10           ; Ondalık dönüşüm için bölen
    
convert_loop:
    xor dx, dx           ; Bölme işlemi 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
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Temeller bölümündeki tüm dersler