Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

dw - تعريف Word

جزء من قسم الأساسيات في رحلة Assembly على Coddy. الدرس 25 من 45.

ينشئ db بايتًا واحدًا من البيانات. لكنك تحتاج أحيانًا إلى تخزين أعداد أكبر لا تتسع لها بايتة واحدة (0-255). لذلك، تستخدم dw: Define Word.

تتكوّن word في تجميع x86 من 2 bytes (16 bits).

البنية النحوية:

label dw value
  • label: الاسم الذي تمنحه لعنوان الذاكرة هذا
  • dw: توجيه Define Word
  • value: الرقم المراد تخزينه (من 0 إلى 65,535)

أمثلة:

section .data
    smallNum dw 1000       ; 2 بايت، القيمة 1000
    bigNum   dw 65535      ; 2 بايت، القيمة القصوى (جميع البتات 1)
    price    dw 499        ; 2 بايت، القيمة 499

ما يمكنك تخزينه في كلمة واحدة (2 bytes):

النوعالنطاقمثال
عدد صغير إلى متوسط0 إلى 65,535dw 32000
إزاحة الذاكرة (16-bit)0 إلى 65,535dw 0x7FFF

كلمات متعددة في سطر واحد:

section .data
    values dw 100, 200, 300, 400    ; ينشئ 4 كلمات (8 بايتات إجمالاً)

كيفية استخدام word في التعليمات البرمجية:

نظرًا لأن word يتكون من 2 bytes، فإنك تستخدم السجل ذي 16 بت ax (وليس al):

section .data
    myWord dw 1000

section .text
    mov ax, [myWord]    ; حمّل القيمة 1000 إلى ax
    add ax, 500         ; ax يصبح 1500
    mov [myWord], ax    ; خزّن 1500 مرة أخرى في myWord

مقارنة: db مقابل dw

التوجيهالحجمالنطاقالسجل الذي يجب استخدامه
db1 byte0 إلى 255al
dw2 bytes0 إلى 65,535ax
challenge icon

التحدي

سهل

أنشئ word باسم population بالقيمة 25000 في قسم .data.

جرّب بنفسك

%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:
    ; حمّل قيمة الكلمة إلى ax
    mov ax, [population]
    
    ; حوّل ax إلى سلسلة عشرية
    mov rsi, buffer
    add rsi, 15          ; انتقل إلى نهاية buffer
    mov byte [rsi], 0    ; منهي null
    
    mov cx, 10           ; المقسوم عليه للتحويل العشري
    
convert_loop:
    xor dx, dx           ; صفّر dx للقسمة
    div cx               ; اقسم ax على 10، ax = حاصل القسمة، dx = الباقي
    add dl, '0'          ; حوّل الباقي إلى ASCII
    dec rsi
    mov [rsi], dl        ; خزّن الرقم
    cmp ax, 0
    jnz convert_loop

    ; احفظ مؤشر الرقم والطول قبل أن يتم الكتابة فوقهما
    mov r8, rsi          ; r8 = مؤشر إلى الرقم الأول
    mov r9, buffer
    add r9, 15
    sub r9, rsi          ; r9 = عدد الأرقام
    
    ; اطبع الرسالة
    mov rax, 1
    mov rdi, 1
    mov rdx, msg_len
    mov rsi, msg
    syscall
    
    ; اطبع الرقم
    mov rax, 1
    mov rdi, 1
    mov rsi, r8
    mov rdx, r9
    syscall
    
    ; اطبع سطرًا جديدًا
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; خروج
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: Playground لـ Assembly