dw - تعريف Word
جزء من قسم الأساسيات في رحلة Assembly على Coddy — الدرس 25 من 45.
db ينشئ بايتًا واحدًا من البيانات. ولكن في بعض الأحيان تحتاج إلى تخزين أرقام أكبر لا تتسع في بايت واحد (0-255). لذلك، تستخدم dw — Define Word (تعريف كلمة).
الـ word في لغة التجميع x86 هي 2 بايت (16 بت).
الصيغة:
label dw valuelabel— الاسم الذي تعطيه لعنوان الذاكرة هذاdw— توجيه تعريف الكلمة (Define Word)value— الرقم المراد تخزينه (من 0 إلى 65,535)
أمثلة:
section .data
smallNum dw 1000 ; بایتان، القيمة 1000
bigNum dw 65535 ; بایتان، القيمة القصوى (جميع البتات 1)
price dw 499 ; بایتان، القيمة 499ما يمكنك تخزينه في كلمة واحدة (2 بايت):
| النوع | النطاق | مثال |
|---|---|---|
| رقم صغير إلى متوسط | 0 إلى 65,535 | dw 32000 |
| إزاحة الذاكرة (16 بت) | 0 إلى 65,535 | dw 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
| التوجيه | الحجم | النطاق | المسجل المستخدم |
|---|---|---|---|
db | 1 بايت | من 0 إلى 255 | al |
dw | 2 بايت | من 0 إلى 65,535 | ax |
التحدي
سهلقم بإنشاء 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4تعريف البيانات
قسم .datadb - تعريف Bytedw - تعريف Worddd - تعريف Double Worddq - تعريف Quad Wordالسلاسل النصية باستخدام dbالرمز $ملخص: بناء data.asm2أنظمة العد
لماذا النظام الثنائي؟الأعداد الثنائيةمن العشري إلى الثنائيلماذا النظام الست عشري؟من الست عشري إلى العشريمن العشري إلى الست عشريASCII والست عشري5استدعاء النظام Exit Syscall
ما هو الـ Syscall؟استدعاء النظام Exit Syscall (60)رموز الخروج (Exit Codes)ملخص: الخروج النظيف (Clean Exit)