_divide_error:
pushl $IntFuncName # 首先把将要调用的函数地址入栈。
no_error_code: # 这里是无出错号处理的入口处,公用代码
xchgl %eax,(%esp) # 交换内容,eax 被交换入栈。
pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds # !!16 位的段寄存器入栈后也要占用4 个字节。
push %es
push %fs
pushl $0 # 将出错码入栈。默认的给它留空
lea 44(%esp),%edx # 取原调用返回地址处堆栈指针位置,并压入堆栈。
pushl %edx
movl $0x10,%edx # 内核代码数据段选择符。
mov %dx,%ds
mov %dx,%es
mov %dx,%fs
call *%eax # 调用C 函数do_divide_error()。
addl $8,%esp # 让堆栈指针重新指向寄存器fs 去掉pushl $0 pushl %edx
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax # 弹出原来eax 中的内容。
iret
pushl $IntFuncName # 首先把将要调用的函数地址入栈。
no_error_code: # 这里是无出错号处理的入口处,公用代码
xchgl %eax,(%esp) # 交换内容,eax 被交换入栈。
pushl %ebx
pushl %ecx
pushl %edx
pushl %edi
pushl %esi
pushl %ebp
push %ds # !!16 位的段寄存器入栈后也要占用4 个字节。
push %es
push %fs
pushl $0 # 将出错码入栈。默认的给它留空
lea 44(%esp),%edx # 取原调用返回地址处堆栈指针位置,并压入堆栈。
pushl %edx
movl $0x10,%edx # 内核代码数据段选择符。
mov %dx,%ds
mov %dx,%es
mov %dx,%fs
call *%eax # 调用C 函数do_divide_error()。
addl $8,%esp # 让堆栈指针重新指向寄存器fs 去掉pushl $0 pushl %edx
pop %fs
pop %es
pop %ds
popl %ebp
popl %esi
popl %edi
popl %edx
popl %ecx
popl %ebx
popl %eax # 弹出原来eax 中的内容。
iret