问题标签 [x86]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
27084 浏览

reference - 一些 x86 ASM 参考/教程?

我正在尝试查找有关 x86 汇编语言的一些参考资料。帮助我理解的教程/示例。-谢谢

0 投票
7 回答
11023 浏览

c - 如何使用 x86 裸机组件获取键盘输入?

我正在尝试将内核的第一部分组合在一起。我目前将整个内核编译为 C 代码,并且我已经设法让它在控制台窗口中显示文本以及所有这些优点。现在,我想开始接受键盘输入,这样我就可以实际使用它并继续进行流程管理。

我正在使用 DJGPP 进行编译,并使用 GRUB 加载。我还使用了一小部分程序集,它基本上直接跳转到我编译的 C 代码中,我很高兴从那里。

我所做的所有研究似乎都指向 $0x16 的 ISR 以从键盘缓冲区中读取下一个字符。据我所知,这应该将 ASCII 值存储在 ah 中,并将键码存储在 al 中,或者类似的东西。我试图在内联汇编中使用以下例程对此进行编码:

调用此代码时,核心立即崩溃。(我在 VirtualBox 上运行它,我觉得没有必要在真实硬件上尝试这种基本的东西。)

现在我实际上有几个问题。没有人能够告诉我(因为我的代码是从 GRUB 启动的)我目前是在实模式还是受保护模式下运行。我没有以一种或另一种方式进行跳跃,我计划在实模式下运行,直到我设置了一个进程处理程序。

那么,假设我在实模式下运行,我做错了什么,我该如何解决?我只需要一个基本的 getc 例程,最好是非阻塞的,但如果谷歌在这方面提供帮助,我会感到很糟糕。一旦我能做到这一点,我就可以从那里做剩下的事情。

我想我在这里要问的是,我在正确的轨道附近吗?通常如何在这个级别上获得键盘输入?

编辑:哦……所以我在保护模式下运行。这当然解释了尝试访问实模式功能时的崩溃。

那么我想我正在寻找如何从保护模式访问键盘 IO。我也许可以自己找到,但如果有人碰巧知道,请随意。再次感谢。

0 投票
3 回答
7619 浏览

keyboard - x86 程序集上的保护模式键盘访问

我正在为我正在开发的一个非常基本的内核处理键盘输入,但我完全被卡住了。我似乎无法在网上找到任何可以显示我需要知道的信息的信息。

我的内核现在在保护模式下运行,所以我不能使用实模式键盘例程而不跳转到实模式并返回,这是我试图避免的。我希望能够从保护模式访问我的键盘。有谁知道如何做到这一点?到目前为止,我发现的唯一一件事是它涉及直接使用输入/输出端口与控制器对话,但除此之外,我感到很困惑。当然,这不是经常出现的事情。通常,Assembly 教程假定您在下面运行操作系统。

我对 x86 程序集非常陌生,所以我只是在寻找一些很好的资源来使用受保护模式下的标准硬件。我正在使用 NASM 编译程序集源代码,并将其链接到使用 DJGPP 编译的 C 源代码。有什么建议么?

0 投票
3 回答
47935 浏览

assembly - 为什么没有包含 EAX 高字节的寄存器?

%AX = (%AH + %AL)

那么为什么不%EAX = (%SOME_REGISTER + %AX)注册一些%SOME_REGISTER呢?

0 投票
2 回答
310 浏览

assembly - 关于位比较的 x86 问题

我的作业的最后一部分有问题。我们得到一个比特流等,在流中是一个整数,文本部分中有 1 的个数。我得到那个整数和它的 24 是正确的,现在我遍历我得到的文本数据,并尝试计算其中的所有 1。但我的过程总是返回零。

我能够确保它正确循环并且确实如此。

文本 = Hello,它是 16 个 1,这是我的 proc,用于循环遍历该文本以计算其中的个数。

proc 的其余部分只是推送/弹出。我真正想要做的是使用 TEST 将 100000000 与一个字节进行比较,如果它是 1 inc AX,则将掩码右移 1 并循环整个字节,而不是 inc 到下一个字节并再次执行。

0 投票
1 回答
1274 浏览

macos - 通过替换为 NOP 来修补 CALLL 在用户空间中有效,但在内核空间中无效

我有一个要修补的设备驱动程序。此设备驱动程序调用 IOLog,我想摆脱日志记录。

如果我用设备驱动程序 (kext) 中的(相应数量的)NOP 替换 CALLL 到 IOLog,内核会崩溃,看起来像一个破碎的堆栈(“Backtrace 终止 - 无效帧指针 0”)。

然而,相同的技术在用户空间中工作得很好(例如,在 OS X 二进制文件中 NOPping NSLogs)。

我在这里想念什么?

0 投票
16 回答
187015 浏览

.net - 如何确定 .NET 程序集是为 x86 还是 x64 构建的?

我有一个任意的.NET 程序集列表。

我需要以编程方式检查每个 DLL 是否是为 x86(而不是 x64 或任何 CPU)构建的。这可能吗?

0 投票
5 回答
3794 浏览

gcc - 在 GCC 中转储寄存器的值

我需要使用 GCC 获取寄存器中的值。

与此类似的东西:

获取 32 位寄存器很容易,但我不确定获取标志的最简单方法是什么。

在本书的示例中:http: //kipirvine.com/asm/

他们通过获取整个 EFLAGS 寄存器并移位有问题的位来做到这一点。我也想过使用 Jcc 和 CMOVcc 来做这件事。

关于如何做到这一点的任何其他建议?一些要验证的测试用例也很有用。

0 投票
2 回答
3853 浏览

assembly - 设置 IRQ 映射

我正在关注几个教程和参考资料,试图设置我的内核。我在一个根本没有解释它的教程中遇到了一些不熟悉的代码。我被告知将其映射16 IRQs (0-15)到 ISR 位置的代码32-47

的代码outportb()如下,但我已经清楚地掌握了它的作用:

我应该提一下,这是在保护模式下的 x86 架构上。此源代码工作正常,我了解它的作用,但我不明白它是如何做到的。有人可以向我解释这里发生了什么,以便万一我需要对此进行扩展,我会知道我在做什么?

0 投票
1 回答
4593 浏览

gcc - 如何在 x64 计算机上使用 gcc 编译 x86 汇编代码

对于学校作业,我必须编写 x86 汇编代码,但我不能使用 gcc 编译它,因为我的计算机是 x64 机器,而 gcc 只需要 x86 代码。是否有一个命令可以让 gcc 接受它的 x86 汇编代码?谢谢

PS 我知道我的代码是有效的,因为它在 x86 机器上编译得很好。