Menu
Coddy logo textTech

dw - הגדרת מילה

חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 25 מתוך 45.

db יוצר בית אחד של נתונים. אבל לפעמים צריך לאחסן מספרים גדולים יותר שלא נכנסים לבית יחיד (0-255). לשם כך משתמשים ב־dw: הגדרת מילה.

מילה באסמבלי x86 היא בת 2 בייטים (16 סיביות).

תחביר:

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 בתים):

סוגטווחדוגמה
מספר קטן עד בינוני0 עד 65,535dw 32000
היסט בזיכרון (16-bit)0 עד 65,535dw 0x7FFF

כמה מילים בשורה אחת:

section .data
    values dw 100, 200, 300, 400    ; יוצר 4 מילים (8 בתים בסך הכול)

איך להשתמש במילה בקוד שלך:

מכיוון שמילה היא 2 בתים, משתמשים באוגר 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בית אחד0 עד 255al
dw2 בתים0 עד 65,535ax
challenge icon

אתגר

קל

צרו מילה בשם 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    ; תו סיום אפס
    
    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בחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: Assembly אונליין