assembly 从BIOS(8086)读取时钟信号需要多少时间?

f8rj6qna  于 4个月前  发布在  iOS
关注(0)|答案(1)|浏览(70)

我有下面的函数(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一起工作(微型内存模型),我不确定在阅读值之前是否需要pushfpopfclisti。如果有可能减少数字操作,我也会很感激。我对远指针一无所知,并捏造了这一点第一次(First Time)

ruyhziif

ruyhziif1#

你只需要从地址0000:046c中读取一个字,就可以得到滴答计数器的低16位。一个简单的方法是使用一个远位volatile指针:

#include <i86.h>

#define ticks (*(volatile unsigned short __far *)MK_FP(0x0000, 0x046c))

字符串
也可以使用其他等效地址,如0040:006c
然后,您可以像这样访问滴答计数器:

int now;

now = ticks;


注意,这将只给你给予低2字节。如果你想要所有的字节,你必须禁用中断来做整个计数器的原子读取(或循环直到收敛)。
您也可以使用本手册中指定的预定义函数clock_bios_timeofday

相关问题