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