我有以下函数(带有汇编的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.如果有可能减少数字操作,我也会很感激.我对远方指针一无所知,并(第一次)捏造了这一点.

推荐答案

您只需从地址0000:046c读取一个字,即可获得滴答计数器的低16位.要做到这一点,一种简单的方法是使用远不稳定的指针:

#include <i86.h>

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

其他类似于0040:006c的地址也可以使用.

然后,您可以按如下方式访问记号计数器:

int now;

now = ticks;

请注意,这将只给您提供低2个字节.如果您想要所有字节,则必须禁用中断以对整个计数器进行原子读取(或循环直到收敛).

您还可以使用预定义函数clock_bios_timeofday来实现此目的,如the manual中所示.

C++相关问答推荐

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

有效地计算由一组点构成的等边三角形和等腰三角形的数量

C中出现分段错误后关闭文件

不同到达时间的轮询实现

GCC预处理宏和#杂注GCC展开

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

为什么GCC C23中的关键字FALSE不是整数常量表达式?

文件权限为0666,但即使以超级用户身份也无法打开

插座打开MacOS组件

Square不与Raylib一起移动

我的C函数起作用了,但我不确定为什么

使用TCL C API导航到列表中的元素

链接到底是如何工作的,我在这里到底做错了什么

不同原型的危险C函数是可能的

在C++中允许使用字符作为宏参数

为什么电路板被循环删除?

在C中,为什么这个带有递增整数的main函数从不因溢出而崩溃?

未为同一文件中的函数执行DirectFunctionCall

使用 GCC 将一个函数中初始化的 struct 体实例通过指针传递到 C 中的另一个函数会产生不同的结果