提问人:Benjamin Penney 提问时间:11/16/2023 最后编辑:Peter CordesBenjamin Penney 更新时间:11/20/2023 访问量:88
从 BIOS (8086) 读取刻度需要多少?
How much of this is needed to read ticks from the BIOS (8086)?
问:
我有以下函数(带汇编的 C)可以读取 BIOS 滴答声:
static clock_t clock(void);
#pragma aux clock = \
"pushf" \
"push ds" \
"cli" \
"mov ax, 0x0040" \
"mov ds, ax" \
"mov bx, 0x006C" \
"mov ax, [bx]" \
"sti" \
"pop ds" \
"popf" \
parm [ ax ] \
modify [ ax bx ];
这可行,但其中有多少是必要的?有人可以帮我编写一下高尔夫代码吗?我正在使用 8086(微型内存模型),我不确定我是否需要和/或和读取该值之前。如果可以减少操作次数,我也将不胜感激。我对远指针一无所知,并把它捏在一起(第一次)。pushf
popf
cli
sti
答:
2赞
fuz
11/20/2023
#1
您只需要从地址中读取一个单词即可获得滴答计数器的低 16 位。执行此操作的一种简单方法是使用远易失性指针:0000:046c
#include <i86.h>
#define ticks (*(volatile unsigned short __far *)MK_FP(0x0000, 0x046c))
也可以使用其他等效地址。0040:006c
然后,您可以按如下方式访问即时报价计数器:
int now;
now = ticks;
请注意,这只会给您低 2 个字节。如果你想要所有字节,你必须禁用中断来对整个计数器进行原子读取(或循环直到收敛)。
您也可以使用预定义的功能或手册中的指示来实现此目的。clock
_bios_timeofday
评论
mov ax, [0x6c]
modify
ds
es
pushf
cli
sti
popf
return *(volatile clock_t*)MAKE_FAR(0x40, 0x6c);
cli
lds ax, [6Ch]
les
fild dword
fistp dword
cli
sti
CMPXCHG
不带锁
的用例lock