gpt4 book ai didi

assembly - 对非常量 TSS 段使用 jmp 指令

转载 作者:行者123 更新时间:2023-12-02 06:30:00 34 4
gpt4 key购买 nike

JMP instruction referece.

根据文档,我们可以对常量远段执行jmp:

jmp 0x18:00

此处,0x18 是 GDT(全局描述符表)中的有效段选择器。

jmp 可以与包含有效 GDT 条目的段寄存器一起使用,即代码/数据段描述符:

mov es, 0x18
jmp es:0x0

这里,0x18是一个TSS(Task State Segment)描述符,当跳转到时,CPU会执行一个任务切换,自动将其状态保存到当前TSS中,然后用保存的状态填充新的 TSS。

但是,TSS 是一个系统段描述符,因此不能加载到任何段寄存器中(如 Intel 文档所建议的)。那么,如何使用动态分配的 TSS 在运行时跳转到任务?

我能想到的唯一方法是使用iret指令,但我觉得它很hack,因为我需要修改链接字段,然后将EFLAGS中的NT位设置为执行反向链接任务切换。

最佳答案

push WORD <TSS_selector>
push DWORD 0
jmp FAR [esp]

假设 32 位代码和一个可用的堆栈。
这将使调用线程中的堆栈不平衡且未对齐,您可能需要使用专用内存位置:

mov WORD [tss_pointer + 4], <TSS_selector>
jmp FAR [tss_pointer]

tss_pointer dd 0, dw 0

关于assembly - 对非常量 TSS 段使用 jmp 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40511390/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com