dw:定义字
本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 25 课,共 45 课。
db 创建一个字节的数据。但有时你需要存储无法放入单个字节(0-255)的更大数字。为此,你可以使用 dw:定义字(Define Word)。
在 x86 汇编语言中,一个字为 2 字节(16 位)。
语法:
label dw valuelabel:你为这个内存地址取的名称dw:定义字(Define Word)指令value:要存储的数字(0 到 65,535)
示例:
section .data
smallNum dw 1000 ; 2 字节,值为 1000
bigNum dw 65535 ; 2 字节,最大值(所有位均为 1)
price dw 499 ; 2 字节,值为 499一个 word(2 字节)可以存储的内容:
| 类型 | 范围 | 示例 |
|---|---|---|
| 小到中等的数字 | 0 到 65,535 | dw 32000 |
| 内存偏移量(16 位) | 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 | 1 字节 | 0 到 255 | al |
dw | 2 字节 | 0 到 65,535 | ax |
挑战
简单在 .data 单元中,创建一个名为 population、值为 25000 的字。
亲手试试
%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 ; 用 10 除 ax,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
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器