大理寺少卿 发表于 2025-1-8 21:32:19

调试器原理与编写06

### 实现多个内存断点

!(./notesimg/1655306761206-34b1941a-fcd5-48ae-889d-eea18a46a67e.png)

#### 多文件编译设置

把要编译和链接的文件加入选项

!(./notesimg/1655307482343-a75ae75d-72bf-41d8-8746-08c246ae5143.png)

#### 汇编解析输入的命令

strtoul将字符串转为指定进制的数值   结果是返回值

会自动跳过空格   如果 转换不了结果为空

参数    字符串    转换后指针位置   进制

```
.while TRUE
      ;提示:
      invoke crt_printf,offset g_szCommandTip
      ;输入命令
      invoke crt_gets, offset g_szCommand
      .if eax <= 0
            .continue
      .endif
      
      ;解析命令
      .if g_szCommand == 'b'&& g_szCommand == 'm' && g_szCommand == 'l'
         
      
      .elseif g_szCommand == 'b'&& g_szCommand == 'm' && g_szCommand == 'c'
      
      
      .elseif g_szCommand == 'b' && g_szCommand == 'm'
      
            ;解析命令
            ;16进制地址
            invoke crt_strtoul, offset g_szCommand + 2, addr @pEnd, 16
            mov @dwAddr, eax
            .if eax == 0
                ;地址错误
                .continue
            .endif
         
            ;长度
            invoke crt_strtoul, @pEnd, addr @pEnd, 16
            mov @dwLen, eax
            .if eax == 0
                ;长度错误
                .continue
            .endif
         
            ;设置内存断点
            invoke SetBm, @dwAddr, @dwLen
      .elseif g_szCommand == 'g'
            .break
      .endif
      
      
    .endw
```

#### 调试器框架

[📎Cr42Dbger.zip](https://github.com/x7dbg/Notes/blob/master/%E4%B8%89%E9%98%B6%E6%AE%B5/03.%E8%B0%83%E8%AF%95%E5%99%A8/Cr42Dbger.zip)

页: [1]
查看完整版本: 调试器原理与编写06