微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我不遵循在异常处理程序中保存寄存器的约定?

如何解决为什么我不遵循在异常处理程序中保存寄存器的约定?

在我的 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 的指导方针,但我只是不明白为什么会这样?

但是:

  1. 那些寄存器是调用者保存的,我在调用 funciton_call 之前保存它们并再次加载它们,那么有什么问题?

  2. 调用不是函数调用的 jmp 之前我不需要保存它们...

另外我应该如何在不破坏我的整个代码的情况下解决这个问题?


第一次编辑:

.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 举报,一经查实,本站将立刻删除。