我想通过将CPU标志压入堆栈来读取它们,然后将它们弹出到这样的寄存器中:

uint32_t getEflags() {
    uint32_t eflags;
    asm ("pushf");
    asm ("pop %eax");
    asm ("mov %%eax, %0" : "=r"(eflags));
    return eflags;
}

现在,我发现这是一个错误,因为pushf仅压入EFLAGS的低16位,然后将它们弹出到32位寄存器中(我需要pushfd )。

这意味着我基本上弹出的次数比开始时要多-返回此处时堆栈会发生什么?

===============>>#1 票数:4 已采纳

指令集参考说明:

将堆栈指针减4(如果当前操作数大小属性为32),并将EFLAGS寄存器的全部内容压入堆栈

它还说:

PUSHF(推送标志)和PUSHFD(推送标志为双)助记符引用相同的操作码。 PUSHF指令适用于操作数大小属性为16的情况,PUSHFD指令适用于操作数大小属性为32的情况。某些汇编程序可能在使用PUSHF时将操作数大小强制为16,而在使用PUSHFD时强制将操作数大小强制为32。 其他人可能会将这些助记符视为同义词(PUSHF / PUSHFD),并使用操作数大小属性的当前设置来确定要从堆栈中推入的值的大小,而与所使用的助记符无关。

所以那没问题。 不过,您的asm已损坏,应该是这样的:

__asm__ __volatile__(
    "pushf\n\t"
    "pop %0"
: "=rm" (eflags));

  ask by maxdev translate from so

未解决问题?本站智能推荐:

2回复

如何更改字符串的前景色(32位汇编内核)?

我目前正在编写自己的操作系统(只是为了好玩,我16岁)并且我已经创建了outprint功能的问题。 我想更改文本颜色(不是背景颜色),但它不起作用。 我创建了自己的printf函数SystemOutPrint/ln (以Java命名,因为我的“主要”语言,对于那些有意思的人),并且发现我
1回复

Kernel.c无法执行完整的代码[从头开始使用操作系统]

我是操作系统的初学者,我正在尝试从头开始构建os(在本教程之后 )。 虽然我可以执行作者提供的代码。 但是,当我添加我的自定义引导程序(显然会占用更多内存,并等待键盘中断来加载内核),然后尝试按照本教程中的说明添加驱动程序时,我的内核不会执行完整的代码(可能是,也可能不是)。 实际上,
1回复

NASM:`loader.s:8:错误:解析器:预期指令`[关闭]

关闭。 这个问题是题外话。 它当前不接受答案。 了解更多 。 想改善这个问题吗? 更新问
2回复

可以使用此ASM引导程序调用内核吗? 怎么样?

我做了一个小引导程序。 现在,我想加载C ++内核。 我可以使用我的小引导程序吗? 这是一个非常简单的引导程序,这是我第一次制作引导程序(带有教程)。 我在Windows中使用NASM来编译asm代码。
2回复

使用ld链接文件以输出二进制文件会在OS开发中出错

我正在学习操作系统教程。 我创建了2个文件。 boot.asm kernel.c kernel.c如下: 内核用于将字符写入文本模式视频显示区域。 使用Windows版本的GCC编译内核: 我使用LD将内核对象链接到二进制文件: 我得到的错误
1回复

在不使用C库的情况下在0xb8000处显示文本视频内存

我一直在用C编写内核。我一直在使用GCC交叉编译器,在Windows系统上编写并以16位实模式为目标。 我没有可用于编写内核的C库。 我已经开始使用一些代码来假设将字符直接打印到屏幕上。 这是kernel.c一个函数: 我使用GCC使用参数-m16编译了我的代码,以生成将以实模式运
3回复

直接打印到文本视频存储器时出现意外输出

我正在用C开发内核,并创建了一些要在屏幕上显示在视频内存上的东西。 我希望视频存储器中的第一个字节是要打印的字符,第二个字节告诉颜色。 但是我的程序有一些不同之处,但是可以用! 这是非常意外和不寻常的。 我的内核代码- 它在*vid上打印字符,在*(vid+2)上打印颜色,然
2回复

查找一个地址范围内有多少免费和已使用的页面

我正在尝试将liballoc移植到我为自己的论文编写的小内核上。 为了做到这一点,我需要一个扫描一定范围地址以查找空闲(和二手)页面的函数。 我编写了该函数,该函数从扫描并寻址(应该是按页对齐),并在页面空闲或已使用时进行打印: 这段代码有效,但是有一个问题:使用的某些页面将免费显示
2回复

在gcc 32位代码中未定义对_GLOBAL_OFFSET_TABLE_的引用,用于琐碎的功能,独立的OS

我有一个小的C代码文件(function.c): 我正在使用64位计算机。 但是,我想编写一个小的32位OS。 我想将代码编译成“纯”程序集/二进制文件。 我用以下代码编译我的代码: gcc function.c -c -m32 -o file.o -ffreestandi
1回复

无法识别的仿真模式:MinGW32上的elf_i386

我正在尝试创建一个内核,我无法将C输出与程序集链接起来。 ld 。 我收到错误: 无法识别的仿真模式:elf_i386 我正在使用Windows 10专业版与MinGW32和MSYS。 我正在使用的代码: link.ld kernel.c kerne