Menu
CoddyTech

dd:定义双字

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

dw 创建 2 字节的数据。但有时你需要更大的数字。这时可以使用 dd:定义双字(Define Double Word)。

在 x86 汇编中,一个双字是 4 字节(32 位)。

语法:

label dd value

示例:

section .data
    myNumber dd 50000        ; 4 字节,值为 50000
    bigNum   dd 4000000      ; 4 字节,值为 4000000
    max32    dd 4294967295   ; 32 位最大值

对照表:

指令大小范围要使用的寄存器
db1 字节0 到 255al
dw2 字节0 到 65,535ax
dd4 字节0 到 4,294,967,295eax

如何在代码中使用双字:

section .data
    myNumber dd 50000

section .text
    mov eax, [myNumber]    ; 将值加载到 eax
    add eax, 10000         ; eax 变为 60000
    mov [myNumber], eax    ; 将值存回

重要规则:

规则说明
使用 eax 加载或存储eax 是 32 位寄存器
challenge icon

挑战

简单

在 .data 单元中创建一个名为 distance、值为 125000 的双字。

亲手试试

%include "data.asm"

section .data
    msg db 'distance = '
    msg_len equ $ - msg
    newline db 0xa

section .bss
    buffer resb 32

section .text
    global _start

_start:
    ; 将双字值加载到 eax
    mov eax, [distance]
    
    ; 将 eax 转换为十进制字符串
    mov rsi, buffer
    add rsi, 31          ; 移到 buffer 末尾
    mov byte [rsi], 0    ; 空终止符
    
    mov ecx, 10          ; 十进制转换的除数

convert_loop:
    xor edx, edx         ; 将 edx 清零,以便进行除法运算
    div ecx              ; 将 eax 除以 10,eax = 商,edx = 余数
    add dl, '0'          ; 将余数转换为 ASCII 字符
    dec rsi
    mov [rsi], dl        ; 存储数字
    cmp eax, 0
    jnz convert_loop

    ; 在数字指针和长度被覆盖之前,先保存它们
    mov r8, rsi          ; r8 = 指向第一个数字的指针
    mov r9, buffer
    add r9, 31
    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 在线编辑器