【发布时间】:2012-08-29 03:03:00
【问题描述】:
我看了这篇文章:http://static.patater.com/gbaguy/day3pc.htm
它包括句子
永远不要改变 CS!!
但是如果你确实修改了CS 段寄存器会发生什么呢?为什么这么危险?
【问题讨论】:
-
CS= 代码段。我想改变它(在某种意义上)等同于变态的jmp。 -
该文件似乎很不可靠:“永远不要更改
CS!!,但您可以像这样阅读CS:mov ds,cs;将CS的值放入@987654330 @S。”好吧,在 x86 中没有像mov ds,cs这样的指令,也没有任何其他mov segreg,segreg。要读取cs的值,您可以使用mov reg,cs; mov ds,reg(其中reg可以是ax、bx、cx等...)或push cs; pop ds。此外,如果您决定永远不更改cs,则所有中断调用都没有问题(例如BIOS、DOS 和Linux 服务)。 web.itu.edu.tr/kesgin/mul06/intel/instr/mov.html -
@nrz:不存在通过
far调用访问的“Linux 服务”之类的东西(中断/系统调用的工作方式不同;即使这些导致cs发生变化,调用者 无法控制目标cs将是什么,这由操作系统在设置IDT 条目/系统调用msrs 时决定)。确认所有其他内容,显然cs可以 被更改,除非目标代码段存在并且设置为目标eip是可访问的,任何这样的调用都会导致#GP错误,应用程序将中止。 -
刚刚阅读了由原始问题链接的文档:我确实想知道为什么现在没有最终受虐狂的人会尝试 16bit x86 汇编编程。如果有的话,那会伤到你的大脑,让你在余生中停止组装......
-
@FrankH “Linux 服务”是指
int 0x80(32 位)或syscall(64 位)。我同意你关于为什么不学习 x86 16 位汇编的评论。我认为现在没有任何理由开始使用 x86 16 位汇编学习汇编,即使那是我十多年前开始学习的(在 DOS 环境中)。我目前正在学习 Linux 64 位汇编,我相信它在未来很多年都会有用。