dw - הגדרת מילה
חלק מהיחידה יסודות במסלול ה-Assembly של Coddy. שיעור 25 מתוך 45.
db יוצר בית אחד של נתונים. אבל לפעמים צריך לאחסן מספרים גדולים יותר שלא נכנסים לבית יחיד (0-255). לשם כך משתמשים ב־dw: הגדרת מילה.
מילה באסמבלי x86 היא בת 2 בייטים (16 סיביות).
תחביר:
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 בתים):
| סוג | טווח | דוגמה |
|---|---|---|
| מספר קטן עד בינוני | 0 עד 65,535 | dw 32000 |
| היסט בזיכרון (16-bit) | 0 עד 65,535 | dw 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 עד 255 | al |
dw | 2 בתים | 0 עד 65,535 | ax |
אתגר
קלצרו מילה בשם 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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
4הגדרת נתונים
מקטע .datadb - הגדרת ביתdw - הגדרת מילהdd - הגדרת מילה כפולהdq - הגדרת מילה מרובעתמחרוזות עם dbהסימן $סיכום: בניית data.asmתרגלו בעצמכם: Assembly אונליין