如何解决为什么我不遵循在异常处理程序中保存寄存器的约定?
在我的 previous question 中,我在汇编中发布了此代码 (x86-64 att),它替换了无效操作码的处理程序(如果 what_to_do
函数返回 0,则可能会调用前一个):
.globl my_ili_handler
.text
.align 4,0x90
my_ili_handler:
movq (%rsp),%r8 # loading %rip from stack
movb (%r8),%dil # reading first byte in the invalid opcode
cmpb $0x0F,%dil
jne function_call
movb 1(%r8),%dil # else read the 2nd byte instead
addq $1,%r8
function_call:
addq $1,%r8
pushq %rbp # save old %rbp
movq %rsp,%rbp # move %rbp to top
# %rax,%rdi,%rsi,%rdx,%rcx,%r8,%r9,%r10,%r11 caller saved.
subq $8,%rsp
pushq %r8 # backup %r8
call what_to_do # unsigned int what_to_do(unsigned char magic)
popq %r8 # restore %r8
leave # push return address and jump
cmpl $0,%eax
je old_handler
mov %eax,%edi # zero the upper part of %rdi
addq $8,%rsp # pop old %rip from stack
pushq %r8
jmp end
old_handler:
jmp *old_ili_handler(%rip)
end:
iretq # go back to user space
你们中的许多人指出我没有遵循有关保存 r8 和 rdx 的指导方针,但我只是不明白为什么会这样?
但是:
第一次编辑:
.globl my_ili_handler
.text
.align 4,%r11 caller saved.
subq $72,%rsp
# backup all caller-saved registers
pushq %rax
pushq %rdi
pushq %rsi
pushq %rdx
pushq %rcx
pushq %r8
pushq %r9
pushq %r10
pushq %r11
call what_to_do # unsigned int what_to_do(unsigned char magic)
# restore all caller-saved registers
popq %r11
popq %r10
popq %r9
popq %r8
popq %rcx
popq %rdx
popq %rsi
popq %rdi
popq %rax
leave # (mov %rbp,%rsp) & (pop %rbp)
cmpl $0,%rsp # pop old %rip from stack
pushq %r8
jmp end
old_handler:
jmp *old_ili_handler(%rip)
end:
iretq # go back to user space
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。