gpt4 book ai didi

c - 使用内联汇编更新内部系统寄存器

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:19 25 4
gpt4 key购买 nike

我想在我目前正在进行的项目中使用内联汇编。该项目是关于从头开始构建一个简单的操作系统。

我已经完成了开始编写内核代码和屏幕驱动程序的部分。

问题出在屏幕驱动程序中,我认为问题出在将屏幕光标(闪烁的光标)保存到内部寄存器中/从内部寄存器中检索的代码中。

这是我的代码中使用内联汇编的地方。

我已将内联汇编部分与屏幕驱动程序分开放在一个单独的文件中,以便正确测试它的功能。

这是 test.c :

# include <stdio.h>

// scree device I/O ports
# define REG_SCREEN_CTRL 0x3D4
# define REG_SCREEN_DATA 0x3D5

unsigned char port_byte_in ( unsigned short port ) {

// A handy C wrapper function that reads a byte from the specified port
// "= a " ( result ) means : put AL register in variable RESULT when finished
// " d " ( port ) means : load EDX with port
unsigned char result ;
__asm__ ("in %%dx, %%al" : "=a" (result) : "d" (port));
return result ;

}

void port_byte_out ( unsigned short port , unsigned char data ) {
// " a " ( data ) means : load EAX with data
// " d " ( port ) means : load EDX with port
__asm__ ("out %%al, %%dx" : :"a" (data) , "d" (port));
}

unsigned short port_word_in ( unsigned short port ) {
unsigned short result ;
__asm__ ("in %%dx, %%ax" : "=a" (result) : "d" (port));
return result ;
}

void port_word_out ( unsigned short port , unsigned short data ) {
__asm__ ("out %%ax, %%dx" : :"a" (data) , "d" (port));
}

void main (){
int i = 10;

printf("%d\n",i);
port_byte_out ( REG_SCREEN_CTRL , 14);
port_byte_out ( REG_SCREEN_DATA , ( unsigned char )( i >> 8));
port_byte_out ( REG_SCREEN_CTRL , 15);


port_byte_out ( REG_SCREEN_CTRL , 14);
int j = port_byte_in ( REG_SCREEN_DATA ) << 8;
printf("%d\n",j);
port_byte_out ( REG_SCREEN_CTRL , 15);
j += port_byte_in ( REG_SCREEN_DATA );
printf("%d\n",j);
}

通过运行 test.c 它给了我:

10
Segmentation fault (core dumped)

我期待的是一些值而不是段错误。

非常感谢任何帮助,谢谢。

最佳答案

INOUT 指令是有特权的。您通常不能从 Linux 中的用户空间可执行文件调用它们。

您可以使用 ioperm()iopl()系统调用,使您的可执行文件有权直接访问 I/O 端口。请注意,这些系统调用都需要您的可执行文件以根用户身份运行。

关于c - 使用内联汇编更新内部系统寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16155215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com