Assembly Gdb-打印数组或数组元素,具有不同大小的元素

Assembly Gdb-打印数组或数组元素,具有不同大小的元素,assembly,gdb,Assembly,Gdb,汇编代码(yasm): src数组的每个元素是1字节 在GDB中,如何打印整个数组或指定索引处的元素,例如打印值为2的元素。(好的,在@Michael Petch的允许下,我想自己给出一个答案,以便将来的搜索者更加清楚) 代码和答案适用于x86-64linux系统,变量在汇编.data部分中定义 代码 tmp.asm(yasm) 在GDB中打印数组或数组元素 在GDB中: p命令将变量视为4字节 x命令将变量视为8字节 所以,需要不同的方式来打印大小为1/2/4/8字节的数字 示例命令:

汇编代码(
yasm
):

src
数组的每个元素是1字节

GDB
中,如何打印整个数组或指定索引处的元素,例如打印值为2的元素。

(好的,在@Michael Petch的允许下,我想自己给出一个答案,以便将来的搜索者更加清楚)

代码和答案适用于x86-64linux系统,变量在汇编
.data
部分中定义


代码 tmp.asm(yasm)


在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
      ,以2字节打印
      b
  • 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
      ,打印长度为4的数组,包含4字节的元素,这是默认值
    • p/x(char[4])arr_a
      ,将
      arr_a
      打印为长度为4的数组,包含1字节的元素
    • p/x(short[4])arr_b
      ,将
      arr_b
      打印为长度为4的数组,包含2字节的元素
    • p/x(长[4])arr\u d
      ,将
      arr\u d
      打印为长度为4的数组,包含8字节的元素
  • p
    用于单个数组元素
    • p/x((long[4])arr\u d)[1]
      ,将
      arr\u d
      视为长度为4的数组,包含8字节的元素,并打印索引为1的元素
提示:

  • 似乎
    p
    可以打印8字节数组,但不能正确打印单个8字节值(这不是数组的一部分)。在这种情况下,请改用
    x

(这只是在我的机器上测试的,如果有任何问题,请随时更正。)

p/x(char[3])src
?打印3个元素的整个数组。@MichaelPetch酷!似乎
p/x((char[4])src)[1]
可以打印数组的单个元素。如果你把它作为一个答案,我会接受的。请随意给出答案。很高兴它有帮助。如果
string
是字节数组,则可能重复
x/s&string
section .data
src db 1,2,3
; 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