汇编代码(yasm
):
section .data
src db 1,2,3
src
数组的每个元素都是1个字节。
在GDB
中,如何打印整个数组或指定索引处的元素,例如打印值为2的元素。
答案 0 :(得分:2)
(好的,我想通过@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中:
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
。(这只是在我的机器上测试过,如果有任何问题,请随时更正。)