(好的,我想在@Michael Petch 的许可下自己提出一个答案,以便将来的搜索者更清楚)
代码和答案适用于 x86-64 linux 系统,变量在程序集的.data 部分中定义。
代码
tmp.asm (yasm)
; yasm assembly program,
; compile: yasm -f elf64 -g dwarf2 tmp.asm && ld tmp.o
; execute: ./a.out
section .data
a db 1
b dw 2
c dd 4
d dq 0x1234567890abcde
arr_a db 1,2,3,4
arr_b dw 1,2,3,4
arr_c dd 1,2,3,4
arr_d dq 1,2,3,0x1234567890abcde
section .text
global _start
_start:
mov rax,1
; exit
mov eax,1
mov ebx,5
int 0x80
在 GDB 中打印数组或数组元素
在 GDB 中:
-
p 命令会将变量视为4 字节;
-
x 命令会将变量视为 8 字节。
因此,需要不同的方式来打印大小为 1 / 2 / 4 / 8 字节的数量。
示例命令:
-
p 4 个字节。
-
p/x c,将 c 打印为 4 字节,这是默认设置。
-
p 带强制转换,用于 1 / 2 字节
-
p/x (char)a,将 a 打印为 1 个字节
-
p/x (short)b,将 b 打印为 2 个字节
-
x 8 个字节
-
x/x &d,将 d 打印为 8 字节,这是默认值。
-
x 1 / 2 / 4 个字节
-
x/bx &a,将 a 打印为 1 个字节,
-
x/hx &b,将 b 打印为 2 个字节,
-
x/wx &c,将 c 打印为 4 字节,
-
p 用于数组
-
p/x arr_c@4,将arr_c打印为长度为4的数组,包含4字节的元素,这是默认值。
-
p/x (char[4])arr_a,将arr_a打印为长度为4的数组,包含1个字节的元素,
-
p/x (short[4])arr_b,将arr_b打印为长度为4的数组,包含2字节的元素,
-
p/x (long[4])arr_d,将arr_d打印为长度为4的数组,包含8字节的元素,
-
p 用于单个数组元素
-
p/x ((long[4])arr_d)[1],将arr_d视为长度为4的数组,包含8字节的元素,并打印索引为1的元素。
提示:
- 似乎
p 可以打印 8 字节数组,但不能正确打印单个 8 字节值(这不是数组的一部分)。在这种情况下,请改用 x。
(这只是在我的机器上测试,如果有任何问题,请随时纠正。)