zoukankan      html  css  js  c++  java
  • x86-64指令集

    X86寄存器

    x86寄存器分类:

    • 8个通用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP
    • 1个标志寄存器:EFLAGS
    • 6个段寄存器:CS、DS、ES、FS、GS、SS
    • 5个控制寄存器:CR0、CR1、CR2、CR3、CR4
    • 8个调试寄存器:DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7
    • 4个系统地址寄存器:GDTR、IDTR、LDTR、TR
    • 其他寄存器:EIP、TSC等。

    指令详解

    movsb movsw movsd 这三个指令,都是数据传送指令,都是从源地址[RSI]向目的地址[RDI]传送数据。
    16位模式下:
    源地址是DS:SI,目的地址是ES:DI
    32位模式下:
    源地址是DS:ESI,目的地址是ES:EDI

    注意:在传送完成之后,SI和DI(或者ESI和EDI)会增加或者减小。
    当DF=0 时,表示正向传送,传送之后SI和DI(或者ESI和EDI)的值会增加;
    当DF=1 时,表示反向传送,传送之后SI和DI(或者ESI和EDI)的值会减小;

    他们的区别是:
    MOVSB:传送一个字节,之后SI和DI(或者ESI和EDI)加/减1
    MOVSW:传送一个字,之后SI和DI(或者ESI和EDI)加/减2
    MOVSD:传送一个双字,之后SI和DI(或者ESI和EDI)加/减4
    单纯的movsb/ movsw/ movsd只能执行一次,如果希望处理器自动地反复执行,可以加上指令前缀rep;在寄存器CX(16位模式)或者ECX(32位模式)中设置传送的次数。当CX/ECX不等于0时,则执行movsb/ movsw/ movsd,执行后,CX/ECX的值减一,直到减为0为止。

    Bochs调试

    • sreg 显示段寄存器信息

    初始化

    此时是暂停在BIOS中。而我们的代码是从0x7C00位置开始的,所以先要在那里设一个断点,然后继续运行到断点:

      break 0x7c00
      continue
      (0) Breakpoint 1, 0x00007c00 in ?? ()
      Next at t=4967728
      (0) [0x00007c00] 0000:7c00 (unk. ctxt): mov ax, 0x07c0       ; b8c007
    

    开启trace-reg on后, 再执行单步调试的时候都会显示寄存器的当前状态了

    接下来可以用命令help来查看调试系统的各种基本命令,这里给出了一些常用的命令

    执行控制指令

    指令 含义
    c/cont/continue 连续执行
    s/step/stepi [count] 执行count条指令,默认为1条,会跟进到函数和中断调用的内部
    p/n/next [count] 执行count条指令,默认为1条,但跳过函数和中断调用
    Ctrl+C 停止执行,并回到命令行提示符下
    q/quit/exit 退出调试和执行

    断点设置命令

    指令 含义
    vb/vbreak seg:offset 在虚拟地址上设置指令断点,其中seg和offset可以是以0x开始的十六进制数,或十进制,或者是以0开头的八进制数
    lb/lbreak addr 在线性地址上设置断点,addr同上面的seg和offset
    b/break/pb/pbreak addr 在物理地址上设置断点
    info break 显示当前所有断点的信息
    d/del/delete n 删除一个断点

    内存操作指令

    指令 含义
    x /nuf addr 检查位于线性地址addr处的内存内容
    xp /nuf addr 检查位于物理地址addr处的内存内容

    其中参数n、u、f分别表示:

    n为要显示内存单元的计数值,默认为1

    u表示单元大小,默认值为w

      b(bytes)        1字节
      h(halfwords)    2字节
      w(words)        4字节
      g(giantwords)    8字节
    

    f为显示格式,默认为x

      x(hex)       显示为十六进制数
      d(decimal)   显示为十进制数
      u(unsigned)  显示为无符号十进制数
      o(octal)     显示为八进制数
      t(binary)    显示为二进制数
      c(char)      显示为对应的字符
    

    信息显示和CPU寄存器操作命令

    指令 含义
    r/reg/regs/registers 列表显示CPU寄存器及其内容
    set $reg=val 修改某寄存器的内容。除段寄存器和标志寄存器以外的寄存器都可以修改,如set $eax=0x01234567
    creg 列出所有的CR0-CR4寄存器
    sreg 列出CPU全部状态信息,包括各个段选择子(cs,ds等)以及ldtr和gdtr等。
    print-stack 打印堆栈情况。
    info tab 显示页表

    反汇编命令

    指令 含义
    u/disasm/disassemble start end 反汇编给定线性地址范围的指令。也可以是u /10 反汇编从当前地址开始的10条指令。
  • 相关阅读:
    如何降低客户流失率高的问题
    移动端时代如何进行营销革命
    EDM备忘录:触发式邮件订阅和退订功能介绍
    EDM博主笔记:EDM邮件营销的几个细节问题
    转载好文:如何进行基于情境数据的个性化EDM数据营销
    个性化EDM数据营销的三大提醒
    许可EDM营销是个长期过程
    内容营销三大实用法则(内含干货)-同样可运用在EDM数据营销中
    改善EDM数据营销的关键点
    《FS Book》: 如何让圣诞节邮件营销与众不同
  • 原文地址:https://www.cnblogs.com/alex-gc/p/13867185.html
Copyright © 2011-2022 走看看