(好的,在 @Michael Petch 的许可下,我想自己给出一个答案,以便将来的搜索者更清楚地了解)
代码和答案适用于x86-64linux系统中,变量是在汇编中定义的.data
部分。
Code
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 中打印数组或数组元素
In GDB:
-
p
命令将把变量视为4 byte;
-
x
命令将把变量视为8 byte.
所以,需要不同的方式来打印一些大小为1/2/4/8字节的数据。
命令示例:
-
p
for 4 bytes.
-
p/x c
, print c
为 4 字节,这是默认值。
-
p
with cast, for 1 / 2 byte
-
p/x (char)a
, print a
作为 1 字节
-
p/x (short)b
, print b
作为 2 字节
-
x
for 8 bytes
-
x/x &d
, print d
8 字节,这是默认值。
-
x
for 1 / 2 / 4 bytes
-
x/bx &a
, print a
作为 1 个字节,
-
x/hx &b
, print b
作为2字节,
-
x/wx &c
, print c
作为4字节,
-
p
for array
-
p/x arr_c@4
, print arr_c
作为长度为 4 的数组,包含 4 个字节的元素,这是默认值。
-
p/x (char[4])arr_a
, print arr_a
作为长度为 4 的数组,包含 1 个字节的元素,
-
p/x (short[4])arr_b
, print arr_b
作为长度为 4 的数组,包含 2 个字节的元素,
-
p/x (long[4])arr_d
, print arr_d
作为长度为 4 的数组,包含 8 个字节的元素,
-
p
for individual array element
-
p/x ((long[4])arr_d)[1]
, treat arr_d
作为长度为 4 的数组,包含 8 个字节的元素,并打印索引为 1 的元素。
Tips:
- 它似乎
p
可以打印 8 字节数组,但无法正确打印单个 8 字节值(不是数组的一部分)。在这种情况下,使用x
反而。
(这只是在我的机器上测试的,如果有任何问题,请随时纠正。)