首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

关于irq相干的内联汇编代码,不懂其意思,请高人讲解

2012-08-10 
关于irq相关的内联汇编代码,不懂其意思,请高人讲解代码如下:C/C++ code#define SAVE_AND_DIS_IRQ(eflags)\

关于irq相关的内联汇编代码,不懂其意思,请高人讲解
代码如下:

C/C++ code
#define SAVE_AND_DIS_IRQ(eflags)\__asm__ volatile ("pushfl\n\t"\              "popl %%eax\n\t"\          "movl %%eax,%0\n\t"\    :"=g"(eflags)\);\__asm__ volatile ("cli")#define SAVE_AND_EN_IRQ(eflags)\__asm__ volatile ("pushfl\n\t"\              "popl %%eax\n\t"\          "movl %%eax,%0\n\t"\    :"=g"(eflags)\);\__asm__ volatile ("sti")#define RESTORE_IRQ(eflags)\__asm__ volatile ("movl %0,%%eax\n\t"\              "pushl %%eax\n\t"\          "popfl\n\t"\    :"=m"(eflags)\)

在进行console相关函数中调用形式如下:
C/C++ code
void console_input(unsigned char c) {    unsigned long eflags;    SAVE_AND_DIS_IRQ(eflags);    console.out(c);    if (c == KEY_ENTER) { /*enter.*/        if (!console_cmd_go()) {            console_cmd_clear();            printk('s', CONSOLE_LOGO);        } else {            console_cmd_clear();            //console_input(KEY_ENTER);        }                    } else if (c == 8) {/*backspace*/        console_cmd_delchar();        } else {        console_cmd_addchar(c);    }    RESTORE_IRQ(eflags);    return;}


它的作用进行console操作时关闭中断吗?相关的汇编代码具体如何解释呢?

[解决办法]
第一个宏是保存标志寄存器的值,第二个宏是恢复标志寄存器的值。第一个宏中的pushfl指令是把标志寄存器的值压栈。而popl是把栈顶的值(刚压入栈的flags)弹出到eflags变量中。这样,你可以很容易地读懂第二个宏

cli指令关闭CPU对外部中断的响应,在操作完成之后再使用sti指令开启对外部中断的响应

热点排行