问题标签 [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.
assembly - 在从中断处理程序返回之前,我是否必须弹出某些异常推送到堆栈的错误代码?
我已经加载了一个包含 256 个条目的 idt 表,所有条目都指向类似的处理程序:
- 对于异常 8 和 10-14,推送异常编号(这些异常会自动推送错误代码)
- 对于其他人,推送“虚拟”错误代码和异常编号;
- 然后跳转到一个通用处理程序
因此,当公共处理程序进入时,堆栈已正确对齐并包含异常/中断号、错误代码(可能只是一个伪代码)、eflags、cs 和 eip。
我的问题是关于从中断处理程序返回的。我使用iret
从堆栈中取出异常编号和错误代码后返回,但这不适用于异常 nr 8;如果我将错误代码留在堆栈上,则返回正常!
问题:
- 对于将错误代码放在那里的异常,我是否必须将错误代码留在堆栈上?如果是这样,如何
iret
确定它是否必须弹出错误代码? - 一旦我启用中断,我总是会得到异常 8(双重故障),但随后一切正常(我正在开发一个爱好操作系统)。这是正常行为还是我在某处有错误?
linux - ARM架构的Linux交叉编译
我有兴趣在 x86 主机上为 ARM 目标交叉编译 Linux 内核。你有什么好的做法推荐吗?您认为哪个是最好的交叉编译套件?您是否设置了自定义交叉编译环境?如果是,您有什么建议?这是个好主意吗?
gcc - 为什么我的 gcc 输出中有额外的指令?
GCC 编译(使用gcc --omit-frame-pointer -s
):
进入
'$12' 常量在这里做什么,'%esp' 寄存器是什么?
gcc - .com 是什么意思?
我刚刚翻译了这个程序,
使用 gcc 生产组装,
.com 是什么意思?大坝使用堆空间、堆栈空间还是数据空间?
assembly - x86指令“call dword ptr ds:[00923030h]”是什么意思?
下面的 x86 汇编指令有什么作用?
我怀疑这是一个间接调用,但它究竟是如何计算调用地址的呢?
c++ - 在 MSVC++ 中检查字节码时遇到问题
我在工作中一直在使用免费的 Digital Mars 编译器(我知道很淘气),并创建了一些代码来检查编译的函数并查看字节码以用于学习目的,看看我是否可以从编译器的构建方式中学到任何有价值的东西它的功能。但是,在 MSVC++ 中重新创建相同的方法失败得很惨,我得到的结果非常混乱。我有这样的功能:
然后我做:
在这种情况下,我似乎无法让 C++ static_cast 工作(它会引发编译器错误)......因此是 C 风格的强制转换,但这不是重点......我也尝试过使用参考 &test,但这无济于事。
现在,当我检查 testCode 指向的内存内容时,我感到很困惑,因为我看到的甚至看起来都不像有效代码,甚至还有一个调试断点卡在那里......它看起来像这样(目标是 IA -32):
0xe9, 0xbc, 0x18, 0x00, 0x00, 0xcc...
这显然是错误的,0xe9 是相对跳转指令,从 0xbc 字节外看是这样的:
0xcc,0xcc,0xcc……
即按照未分配或未使用内存的预期,内存初始化为调试断点操作码。
我对返回 42 的函数的期望是:
0x8b、0x2a、0x00、0x00、0x00、0xc3
或者至少一些 mov 的味道,然后是 ret (0xc2、0xc3、0xca 或 0xcb)再往下一点
MSVC++ 是出于安全原因采取措施阻止我做这种事情,还是我做了一些愚蠢的事情而没有意识到?使用 DMC 作为编译器,此方法似乎可以正常工作...
我也很难以另一种方式(执行字节),但我怀疑根本原因是相同的。
任何帮助或提示将不胜感激。
assembly - 如何使用 NASM 获取用户输入?
程序需要从用户那里获取一个简单的字符串并将其显示回来。我已经让程序从用户那里获取输入,但我似乎无法存储它。这是我到目前为止所拥有的:
我正在使用 NASM 组装它。
windows - x86 汇编 - Windows 下的非法操作码 0xff /7
我目前正在开发一个 x86 反汇编程序,并开始反汇编一个 win32 PE 文件。大部分反汇编代码看起来不错,但是有一些非法的 0xff /7 操作码的出现(/7 表示 reg=111,0xff 是操作码组 inc/dec/call/callf/jmp/jmpf/push/非法操作数r/m 16/32)。第一个猜测是,/7 是 pop 指令,但它是用 0x8f /0 编码的。我已经对照官方的英特尔架构软件开发人员手册第 2 卷:指令集参考检查了这一点——所以我不只是被误导了。
反汇编示例:(S0000O0040683a 是被另一条指令跳转到的标签)
顺便说一句:gdb 对此进行了同样的反汇编(除了错误 0xff 在我的反汇编中没有产生 -1 ):
所以问题是:Windows的非法操作码异常处理程序中是否有任何默认处理程序,它实现了这个非法操作码中的任何功能,如果是:那里发生了什么?
问候, 博多
assembly - 有人可以解释这个直接组装的 x86 JMP 操作码吗?
在学校,我们一直在使用引导程序来运行没有操作系统的独立程序。我一直在研究这个程序,当启用保护模式时,通过直接将操作码和操作数组装为程序中的数据来执行远跳转。这是给 GNU 汇编器的:
首先,为什么要这样做(而不是指令助记符)?
我一直在查看英特尔手册,但仍然对代码感到有些困惑。特别是在第 2A 卷第 3-549 页中,有一个操作码表。相关条目:
实际的操作码很明显,但第一个字节 0x66 让我感到困惑。参考英特尔手册中的表格, cp 显然意味着后面会跟着一个 6 字节的操作数。接下来的两行显然是 6 个字节。0x66 编码一个“操作数大小覆盖前缀”。这和表中的cp有什么关系?我原以为cp会有一些十六进制值,但是有这个覆盖前缀。有人可以帮我解决这个问题吗?
这是来自 od 的转储:
TARGET_ADDRESS 被定义为 0x00010000。
我也对最后两个字节的重要性感到困惑。然而,这似乎完全是另一个问题。现在已经很晚了,我已经盯着代码和英特尔手册看了好几个小时,所以我希望我能明白我的意思。
感谢您的关注!
assembly - 如何在 BIOS 下使用 U 盘进行低级 IO(与软盘相比)?
我最近一直在研究一些用于软盘驱动器的引导代码。我的目标是修改程序,以便它使用我的 USB 闪存驱动器。现在我看到了 INT 13H 函数是如何与软盘设备一起使用的,但我想我的问题是,与 USB 驱动器的通信会有什么不同?
例如,这里是一段软盘代码(GNU 汇编器):
现在我已经读到将 0x80 移动到 %dl 将选择 BIOS 中的第一个 HDD。在我的特定 BIOS 中,我可以更改驱动器顺序,其中包括 USB 驱动器。我很确定这将变得依赖于 BIOS,但我认为 BIOS 中列出的顺序可能对应于我移入 %dl 的值。我需要追踪一些文档...
我真的不熟悉使用块设备,有人可以指出我一个开始学习更多的好地方吗?
谢谢!