当前位置: 技术问答>linux和unix
Linux内核函数
来源: 互联网 发布时间:2016-01-28
本文导语: 发现设置时间是从读端口开始的,读端口的汇编看不懂,请教大家说说: #define outb_p(value,port) __asm__ ("outb %%al,%%dxn" "tjmp 1fn" "1:tjmp 1fn" "1:"::"a" (value),"d" (port)) #define inb_p(port) ({ unsigned char _v; __asm__ ...
发现设置时间是从读端口开始的,读端口的汇编看不懂,请教大家说说:
#define outb_p(value,port)
__asm__ ("outb %%al,%%dxn"
"tjmp 1fn"
"1:tjmp 1fn"
"1:"::"a" (value),"d" (port))
#define inb_p(port) ({
unsigned char _v;
__asm__ volatile ("inb %%dx,%%aln"
"tjmp 1fn"
"1:tjmp 1fn"
"1:":"=a" (_v):"d" (port));
_v;
})
#define CMOS_READ(addr) ({
outb_p(0x80|addr,0x70);
inb_p(0x71);
})
struct tm time;
do {
time.tm_sec = CMOS_READ(0);
time.tm_min = CMOS_READ(2);
time.tm_hour = CMOS_READ(4);
time.tm_mday = CMOS_READ(7);
time.tm_mon = CMOS_READ(8);
time.tm_year = CMOS_READ(9);
} while (time.tm_sec != CMOS_READ(0));
#define outb_p(value,port)
__asm__ ("outb %%al,%%dxn"
"tjmp 1fn"
"1:tjmp 1fn"
"1:"::"a" (value),"d" (port))
#define inb_p(port) ({
unsigned char _v;
__asm__ volatile ("inb %%dx,%%aln"
"tjmp 1fn"
"1:tjmp 1fn"
"1:":"=a" (_v):"d" (port));
_v;
})
#define CMOS_READ(addr) ({
outb_p(0x80|addr,0x70);
inb_p(0x71);
})
struct tm time;
do {
time.tm_sec = CMOS_READ(0);
time.tm_min = CMOS_READ(2);
time.tm_hour = CMOS_READ(4);
time.tm_mday = CMOS_READ(7);
time.tm_mon = CMOS_READ(8);
time.tm_year = CMOS_READ(9);
} while (time.tm_sec != CMOS_READ(0));
|
register int __res __asm__("ax");
1. register 是c语言的语法,即所谓的“寄存器变量”,使用频繁的变量可以储存在cpu的寄存器内以提高效率。大部分时候都不用手动设置,编译器自动优化。
2. __res 变量名......
3. 指定变量__res保存在寄存器ax中。但是这里有两种情况,加“volatile”和不加“volatile”。不加“volatile”的时候,虽然__res也是存在ax里面,但是当gcc认为__res,是处于“以后不会再被使用到了”之内的情况,就可能会把ax派做其他用途。使用“volatile”的时候,gcc不会按照自己的想法来做所谓的“最佳化改动”。参见 volatile 的解释。