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

时间:2012-09-04 12:41:27

标签: assembly x86 x86-16

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

包括句子

  

不要改变CS !!

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

2 个答案:

答案 0 :(得分:7)

cs是代码段。 cs:ip,表示csip(指令指针)指向下一条指令的位置。因此,对csip或两者的任何更改都会更改从下一条指令获取和执行的地址。

通常您使用cs(跳远),jmp(长途通话),callretfint3更改intiret。在8088和8086中pop cs也可用(操作码0x0F)。 pop cs在186+中不起作用,其中操作码0x0F保留用于多字节指令。 http://en.wikipedia.org/wiki/X86_instruction_listings

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

答案 1 :(得分:-1)

在保护模式和长模式(即非16位模式)下,包括CS的段寄存器不再仅仅是额外的4位地址。它们索引到段描述符表中,具有基数+限制(正常基数= 0限制= 4GiB,即平坦内存模型),但也包含其他属性。

代码段描述符确定CPU模式(例如32位压缩模式与64位长模式)。在64位内核上,64位用户空间进程可以将far jmp转换为某些32位代码。这在实践中没有用,甚至可能在操作系统在上下文切换后返回到您的进程时中断。

TODO:挖掘一个有人展示如何做到这一点的链接。我想最近甚至有一个关于这个的问题,详细解答了如何找到正确的段号。