如果更改CS段寄存器会发生什么?(那你怎么这样做?)

SmR*_*Guy 5 x86 assembly x86-16

我读了这篇文章:http://static.patater.com/gbaguy/day3pc.htm

它包括句子

不要改变CS !!

但是,如果修改了CS段寄存器,究竟会发生什么?为什么这么危险?

nrz*_*nrz 8

cs是代码段.cs:ip,这意味着csip(指令指针)一起指向下一条指令的位置.因此,任何改变csip或同时改变从下一个指令将是获取和执行的地址.

通常你改变csjmp(跳远), call(长调用), ,,retf 或.在8088和8086 也可用(操作码0x0F).将无法在186+中工作,其中操作码0x0F保留用于多字节指令. http://en.wikipedia.org/wiki/X86_instruction_listingsint3intiretpop cspop cs

在跳远或长时间通话中没有任何固有的危险.您只需要知道您跳转或呼叫的位置,并且在保护模式下,您需要有足够的权限来执行此操作.在16位实模式(例如DOS)中,您可以跳转并调用您想要的任何地址,例如.jmp 0xF000:0xFFF0cs0xF000ip0xFFF0,这是BIOS代码的起始地址,并且因此重新启动计算机.不同的内存地址有不同的代码,从而产生不同类型的结果,理论上一切都可能发生(如果你跳转到用于格式化硬盘驱动器的BIOS代码,有效的寄存器和/或堆栈值,那么硬盘驱动器将被格式化'按照要求').在实践中jmp,call对大多数地址而言,很快就会导致无效的操作码或其他一些异常(除以零,分频溢出等).

  • @AlexeyFrunze嗯,只改变`cs`而不改变/设置`ip` /`eip` /`rip`的唯一方法是`pop cs`,只有8088和8086可用.在186+你不能改变`cs`而不改变/设置`ip` /`eip` /`rip`.`pop cs`可能用于8088/8086(或8088/8086仿真器)的混淆代码. (3认同)