Menu
CoddyTech

dw:定义字

本课属于 Coddy Assembly 学习旅程的“基础知识”单元。第 25 课,共 45 课。

db 创建一个字节的数据。但有时你需要存储无法放入单个字节(0-255)的更大数字。为此,你可以使用 dw:定义字(Define Word)。

在 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

一个 word(2 字节)可以存储的内容:

类型范围示例
小到中等的数字0 到 65,535dw 32000
内存偏移量(16 位)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

指令大小范围使用的寄存器
db1 字节0 到 255al
dw2 字节0 到 65,535ax
challenge icon

挑战

简单

在 .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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

基础知识中的所有课

自己练习: Assembly 在线编辑器