嗨,我正在编写一些中断过程。
我在Ubuntu 18.04上并使用gcc -7.3.0。
当前,我使用以下前缀和后缀来打包我的中断服务程序(无错误代码):
Create Table #TestData
(
ID int,
Category int,
DateFrom datetime,
DateTo datetime NULL,
ExpectedResult int
)
insert into #TestData
(
ID,
Category,
DateFrom,
DateTo,
ExpectedResult
)
select
1,
1,
'01 Mar 2019',
'06 Mar 2019',
7
union all
select
2,
1,
'08 Mar 2019',
'09 Mar 2019',
3
union all
select
3,
1,
'11 Mar 2019',
'14 Mar 2019',
3
union all
select
1,
2,
'04 Mar 2019',
'07 Mar 2019',
4
union all
select
2,
2,
'08 Mar 2019',
'15 Mar 2019',
10
union all
select
3,
2,
'18 Mar 2019',
'24 Mar 2019',
6
select * from #TestData
drop table #TestData
函数如下:
#define Ent_Int __asm__ __volatile__ ("\
pushq %rax\n\t\
movq %es, %rax\n\t\
pushq %rax\n\t\
movq %ds, %rax\n\t\
pushq %rax\n\t\
pushq %rbx\n\t\
pushq %rcx\n\t\
pushq %rdx\n\t\
pushq %rbp\n\t\
pushq %rdi\n\t\
pushq %rsi\n\t\
pushq %r8\n\t\
pushq %r9\n\t\
pushq %r10\n\t\
pushq %r11\n\t\
pushq %r12\n\t\
pushq %r13\n\t\
pushq %r14\n\t\
pushq %r15\n\t\
movq $0x10, %rdi\n\t\
movq %rdi, %es\n\t\
movq %rdi, %ds\n\t");
#define Ret_Int __asm__ __volatile__ ("\
popq %r15\n\t\
popq %r14\n\t\
popq %r13\n\t\
popq %r12\n\t\
popq %r11\n\t\
popq %r10\n\t\
popq %r9\n\t\
popq %r8\n\t\
popq %rsi\n\t\
popq %rdi\n\t\
popq %rbp\n\t\
popq %rdx\n\t\
popq %rcx\n\t\
popq %rbx\n\t\
popq %rax\n\t\
movq %rax, %ds\n\t\
popq %rax\n\t\
movq %rax, %es\n\t\
popq %rax\n\t\
leave\n\t\
iretq");
但是,从OSDEV中,我发现属性(中断)可以使生活更轻松。
但是,当我编译函数时,会出现错误消息:
./ OSFiles / Codes / INT.c:288:1:抱歉,未实现:中断服务程序中不允许SSE指令
但是,该函数内部没有SSE指令。所以我想问:
1,如何正确编写ISR
2,gcc如何区分带/不带错误代码的INT。
如果能说明具有或不具有中断属性的已编译程序集的详细区别,将非常感谢。