debugging - 汇编调试器如何操作寄存器?
问题描述
调试器如何操作工作 CPU 上的寄存器?
我正在使用 nasm 和 afd 和 dosbox(不知道也不能使用任何替代设置,因为我的大学需要这个设置)。运行win 10。对装配来说真的很新。阅读此线程 ,但一切都超出了我的想象。所以请像我 5 岁一样解释一下。也许是对初学者的一些参考
解决方案
DOSBOX 内置的调试器很简单:它有一个旁通道来访问整个机器状态。
在多任务操作系统下,有像 Linuxptrace
这样的系统调用可以操纵另一个进程的状态。
在 DOS 下,调试器必须将自己插入到与被调试程序不同的内存区域中。x86 ISA 本身具有调试功能,例如 FLAGS(跟踪标志)中的 TF 用于单步执行。
一旦调试器控制了 CPU(即 CPU 正在执行调试器代码),它就可以将寄存器的旧值保存在某处(在堆栈上或静态位置)。
它可以将它们全部恢复(使用指令)并通过使用从内存加载 CS:IP 和 FLAGSmov
的方法返回到正在调试的程序。iret
SS:SP 必须对其有效(返回信息将在SS:SP
被调试进程的正下方)。所以实模式 DOS 调试是“侵入性的”,并且会破坏 SS:SP 以下的空间。与具有虚拟内存的多任务操作系统不同。
不使用任何寄存器(即在恢复所有内容之后)返回正在调试的进程的另一种方法是far jmp cs:[mem]
使用绝对寻址模式。但这无法恢复 FLAGS,因此如果您想在恢复执行正在调试的进程时设置 TF,它将无法正常工作。
推荐阅读
- swift - 将 Realm Optional 中的数据加载到 Swift 中的文本字段/字符串中
- node.js - Visual Studio Code - Node.js 调试器“断点已设置但尚未绑定”
- android - Livedata导致recyclerview更新导致edittext焦点丢失
- kubernetes - Kubernetes 暴露不适用于文件
- c# - 与具有额外数据的实施者的公共接口?
- keras - 有状态与无状态 LSTM
- tableau-api - Tableau 计算字段,具有特定条件
- python - 熊猫正则表达式提取物为 re.search 提供不同的输出?
- html - A transparent image I'm linking to isn't transparent when being displayed
- java - 序言中不允许使用 Android Studio 项目内容