使用汇编语言

disassemble

disassemble 命令会从当前位置进行反汇编。如果有, 指令和调用目的地会使用源代码行信息进行注释:

例如:

[zxdb] disassemble
miscsvc.cc:118
 ▶ 0x20bc1c7aa60a  mov     dword ptr [rbx + 0x10c], eax
miscsvc.cc:122
   0x20bc1c7aa610  movabs  rax, -0x5555555555555556
   0x20bc1c7aa61a  mov     qword ptr [rbx + 0xe8], rax
   0x20bc1c7aa621  mov     qword ptr [rbx + 0xe8], 0x0
   0x20bc1c7aa62c  mov     rdi, qword ptr [rbx + 0xb0]
   0x20bc1c7aa633  mov     rax, qword ptr [rbx + 0xe8]
   0x20bc1c7aa63a  mov     qword ptr [rbx + 0x20], rax
   0x20bc1c7aa63e  call    0x20d    ➔ std::__2::size<>()

函数

如果您指定了地址或符号,disassemble 命令会针对 相应地址或符号。如果您提供函数名称 对整个函数进行反汇编:

[zxdb] disassemble main
miscsvc.cc:88
   0x20bc1c7aa000  push    rbp
   0x20bc1c7aa001  mov     rbp, rsp
   0x20bc1c7aa004  push    rbx
   0x20bc1c7aa005  and     rsp, -0x20
   0x20bc1c7aa009  sub     rsp, 0x140
   0x20bc1c7aa010  mov     rbx, rsp
   0x20bc1c7aa013  mov     rax, qword ptr fs:[0x10]
   ...

PC 相对偏移量

在某些情况下,您可能需要根据 PC(程序计数器)进行反汇编 相对偏移量。

例如,对于地址 $rip - 0x7disassemble

[zxdb] di -- -0x7 # Disassemble at the address $rip - 0x7
     350     FX_LOGS(FATAL) << "Failed to construct the cobalt app: " << app.status();
     351   }
     352   inspector.Health().Ok();
     353   loop.Run();
   0x591e76352b  xor   edx, edx
   0x591e76352d  call  0x260fae   ➔ async::Loop::Run(async::Loop*, zx::time, bool)
     354   FX_LOGS(INFO) << "Cobalt will now shut down.";
 ▶ 0x591e763532  mov   edi, 0x30
   0x591e763537  call  0x81ab4    ➔ fuchsia_logging::ShouldCreateLogMessage(fuchsia_logging::LogSeverity)
   0x591e76353c  mov   byte ptr [rbp - 0x1b1], 0x0
   0x591e763543  test  al, 0x1
   0x591e763545  jne   0x2
   0x591e763547  jmp   0x74

参数

disassemble 命令接受以下参数:

  • --num=<lines>-n <lines>:要发出的行数或指令数。 如果位置是函数名称,则默认为 给定函数。如果位置是地址或符号,则默认值为 16。

  • --raw-r:除了已解码的指令之外,还会输出原始字节。

逐步执行机器指令

要逐步执行机器说明,您可以使用以下 zxdb 命令:

  • nexti / ni:前进到下一条说明,但不同于调用步骤 有关目标架构的说明。

  • stepi / si:前进一个机器指令。

例如:

[zxdb] nexti
🛑 main(int, const char**) • main.cc:102
main.cc:99
 ▶ 0x23f711346233  mov   edx, 0x20
   0x23f711346238  call  0x35a3a3  ➔ __asan_memcpy
   0x23f71134623d  mov   rdi, qword ptr [rbx + 0x258]
   0x23f711346244  call  0x1677    ➔ $anon::DecodeCommandLine

[zxdb] nexti
🛑 main(int, const char**) • main.cc:102
main.cc:99
 ▶ 0x23f711346238  call  0x35a3a3 ➔ __asan_memcpy
   0x23f71134623d  mov   rdi, qword ptr [rbx + 0x258]
   0x23f711346244  call  0x1677   ➔ $anon::DecodeCommandLine
   0x23f711346249  mov   rdi, qword ptr [rbx + 0x260]

Zxdb 会保留有关最后一个命令是否为程序集的信息 命令或源代码,并显示有关步进或断点的信息 次命中。

如需切换到汇编语言模式,请使用 disassemble

如需切换到源代码模式,请使用 list

regs

regs 命令会显示最常见的 CPU 寄存器。

例如:

[zxdb] regs
General Purpose Registers
      rax  0xfffffffffffffffa = -6
      rbx          0x50b7085b
      rcx                 0x0 = 0
      rdx      0x2023de8c87a0
      rsi  0x7fffffffffffffff
      rdi          0x50b7085b
      rbp      0x224bb1e0b950
      rsp      0x224bb1e0b928
      ...

regs 命令接受以下参数:

  • --all-a:启用所有寄存器类别(不隐含 -e)。

  • --debug-d:输出调试寄存器。

  • --extended-e:启用更详细的标志解码。这让更多 通常对日常调试无用的信息。这个 包含 rflags 内的系统级标志等信息 注册 x64。

  • --float-f:输出专用浮点寄存器。大多数 则应该改用 --vector,因为所有 64 位 ARM 代码和大多数 x64 代码针对浮点数使用矢量寄存器。

  • --vector-v:输出矢量寄存器。

表达式中的寄存器

寄存器可以在变量等表达式中使用。通过 寄存器的规范名称为 $reg(register name)

如需了解详情并查看示例,请参阅 CPU 寄存器

向量寄存器

regs --vector 命令会根据 并采用当前的vector-format设置

使用 get vector-format 查看当前值。

使用 set vector-format <new-value> 设置新的矢量格式。

支持以下值:

  • i8(有符号)或 u8(无符号):8 位整数数组。
  • i16(有符号)或 u16(无符号):16 位整数数组。
  • i32(有符号)或 u32(无符号):32 位整数数组。
  • i64(有符号)或 u64(无符号):64 位整数数组。
  • i128(有符号)或 u128(无符号):128 位整数数组。
  • float:单精度浮点数数组。
  • double:双精度浮点数数组。这是默认值。

以下示例将 vector-format 设置为 double

[zxdb] set vector-format double

以下示例返回矢量寄存器:

[zxdb] regs -v
Vector Registers
  mxcsr 0x1fa0 = 8096

   Name [3] [2] [1]       [0]
   ymm0   0   0   0         0
   ymm1   0   0   0   3.14159
   ymm2   0   0   0         0
   ymm3   0   0   0         0
   ...

矢量寄存器也可以像表达式中的数组一样使用。通过 vector-format 设置用于控制每个寄存器如何转换为数组 值。

例如,要显示解读为 x86 矢量寄存器 ymm1

  1. vector-format 设置为浮点数:

    [zxdb] set vector-format float
    
  2. 输出矢量寄存器 ymm1

    [zxdb] print ymm1[0]
    3.14159
    

转换为数组时,将低位分配给索引 0,递增 。