Warm tip: This article is reproduced from serverfault.com, please click

assembly-在x86-64中的中断期间程序寄存器存储在哪里

(assembly - Where are program registers stored during an interrupt in x86-64)

发布于 2020-12-06 21:02:42

对于大学作业,我的任务是使用x86-64中的汇编代码覆盖Divide-By-Zero中断处理程序,以使除法运算结果为被除数-1。

因此,据我了解,我需要在返回程序之前更改除法寄存器的值。

如何获得程序的原始寄存器值并进行更改?它们存储在哪里?

Questioner
Carmel
Viewed
0
Peter Cordes 2020-12-07 05:46:28

中断/异常仅将CS:RIP,RFLAGS和用户空间SS:RSP保存在异常帧本身中。所有其他寄存器值均未修改。x86不像其他ISA那样注册组切换。

中断处理程序必须保存/恢复他们要使用的每个寄存器,以确保它们修改用户空间状态。你需要使用它来获得几个暂存寄存器(除非你进行多个假设并且仅支持一个操作数大小和指令长度),但是要修改的用户空间状态部分仍在寄存器中。


幸运的是,取决于除法指令https://www.felixcloutier.com/的操作数大小,股息位于固定位置,即AH:AL(又名AX),DX:AX,EDX:EAX或RDX:RAX。x86 / idivdiv(或者,如果你包含16/32位兼容模式用户空间,则也可能仅是AL aam imm8

因此,你不必解码寻址模式,只需解码前缀和操作码即可确定实际涉及RDX和RAX的哪些部分。

但是要在除法指令之后返回RIP指针,实际上你需要确定指令长度,例如2字节div ecxvs. div word [rdi + r10*2 + 256](9字节:REX和操作数大小的前缀,操作码,modrm + SIB + disp32)。

你确实知道该长度小于15个字节(包括可能的冗余前缀),否则它将以#UD而不是#DE出现错误。