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

dw - تعريف Word

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

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

الـ word في لغة التجميع x86 هي 2 بايت (16 بت).

الصيغة:

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

أمثلة:

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

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

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

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

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

كيفية استخدام كلمة (word) في الكود الخاص بك:

بما أن الكلمة (word) تتكون من 2 بايت، فأنت تستخدم المسجل (register) بسعة 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 بايتمن 0 إلى 255al
dw2 بايتمن 0 إلى 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:
    ; تحميل قيمة الكلمة (word) في ax
    mov ax, [population]
    
    ; تحويل ax إلى سلسلة نصية عشرية
    mov rsi, buffer
    add rsi, 15          ; الانتقال إلى نهاية المخزن المؤقت
    mov byte [rsi], 0    ; متمم صفري
    
    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اختبر نفسك

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

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