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 位最大值对照表:
| 指令 | 大小 | 范围 | 要使用的寄存器 |
|---|---|---|---|
db | 1 字节 | 0 到 255 | al |
dw | 2 字节 | 0 到 65,535 | ax |
dd | 4 字节 | 0 到 4,294,967,295 | eax |
如何在代码中使用双字:
section .data
myNumber dd 50000
section .text
mov eax, [myNumber] ; 将值加载到 eax
add eax, 10000 ; eax 变为 60000
mov [myNumber], eax ; 将值存回重要规则:
| 规则 | 说明 |
|---|---|
使用 eax 加载或存储 | eax 是 32 位寄存器 |
挑战
简单在 .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
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
基础知识中的所有课
自己练习: Assembly 在线编辑器