文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1. 变量
可在 .data, .bss 或自定义段内定义变量,也就是预留存储空间。
使用 GDB 以符号名查看变量时,需要使用 & 获取地址。这与 NASM 编译器将符号直接当地址不同。
INIT
有初始化值的变量,通常定义在 .data 段内。
variable-name [:] define-directive initial-value, ...
变量名实际会被翻译成地址,可通过 地址 + 偏移量
访问相关数据。
长度单位:
DB
: 1 byteDW
: 2 bytes (word)DD
: 4 bytes (double word)DQ
: 8 bytes (quad word)DT
: 10 bytes (ten bytes)
如果初始化值是字符,那么以 ASCII 的十六进制值存储。
global _start section .data num: dq 0x123456 section .text _start: mov rax, num ; 将地址存储 rax mov rbx, [num] ; 将值存储 rbx exit: mov rax, 60 xor rdi, rdi syscall
(gdb) b exit (gdb) r (gdb) x/xg &num 0x402000 <num>: 0x0000000000123456 (gdb) p/x $rax $1 = 0x402000 (gdb) p/x $rbx $2 = 0x123456
注意,默认数字是十进制,须明确指定十六进制格式。
如果有多个初始化值,那么变长亮度等于 初始化值数量 * 长度单位
。
equ 定义常量,
$ - a
以当前地址 - &a = 长度
。
global _start section .data a: db 1, 2, 3 alen: equ $ - a ; db * 3 = 3 b: dw 1, 2, 3 blen: equ $ - b ; dw * 3 = 6 section .text _start: mov rax, alen mov rbx, blen exit: mov rax, 60 xor rdi, rdi syscall
(gdb) b exit (gdb) r (gdb) p $rax $1 = 3 (gdb) p $rbx $2 = 6
RES
如果没有初始化值,那么使用 RES 前缀。保存在 .bss 段,指定保留内存大小。
global _start section .data a: db 1, 2, 3 ; 多个初始化值。 alen: equ $ - a ; db * 3 = 3 section .bss b: resq 2 ; 2 个 DQ 空间。 blen: equ $ - b ; resq * 2 = 16 section .text _start: mov rax, alen mov rbx, blen mov qword [b], 0x11 mov qword [b+8], 0x22 mov rdx, [b] mov rsi, [b+8] exit: mov rax, 60 xor rdi, rdi syscall
注意,x86 不允许内存到内存直接复制数据。必要时需在操作数前指定数据大小。
TIMES
可使用 times 连续定义初始化值。如果有多个初始化值,那么长度等于 初始化值数量 * 长度单位 * 重复次数
。
global _start section .data a: times 8 dw 1, 2, 3 ; times * dw * 3, 多初始化值。 alen: equ $ - a ; 8 * 2 * 3 = 48 ; 0x30 section .bss b: times 8 resd 2 ; times * resd * 2 blen: equ $ - b ; 8 * 4 * 2 = 64 ; 0x40 section .text _start: mov rax, alen mov rbx, blen exit: mov rax, 60 xor rdi, rdi syscall
(gdb) x/24xh &a 0x402000: 0x0001 0x0002 0x0003 0x0001 0x0002 0x0003 0x0001 0x0002 0x402010: 0x0003 0x0001 0x0002 0x0003 0x0001 0x0002 0x0003 0x0001 0x402020: 0x0002 0x0003 0x0001 0x0002 0x0003 0x0001 0x0002 0x0003 (gdb) disass Dump of assembler code for function _start: => 0x0000000000401000 <+0>: mov eax,0x30 0x0000000000401005 <+5>: mov ebx,0x40
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论