问题标签 [80286]
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 - How to program in 16 bit protected mode with more than 64kb of data?
I want to write some code for the 16 bit protected mode, specifically a simple operating system with some programs. I know this sounds silly and it probably is, but I'm interested in understanding how to write programs under these constraints.
I'd like to know what kinds of conventions have been employed in the various operating systems working in 16 bit protected mode (e.g. OS/2 and Win 3.1). What ABI did they use? How are far pointers passed around? Were there multiple ABIs for different code models?
To clarify, I know what far pointers are and how they are used on the API level. What I'd like to know is how this works on assembly level. Are segments for far pointers passed on the stack? Are there any special conventions?
cross-compiling - 带有 Open Watcom 的 COM 可执行文件
我正在尝试为运行 PC-DOS 的旧 i286 机器制作一个小实用程序,目标格式为普通的 COM 可执行文件。
编译器选择是 Open Watcom,并且在文档中说它可以链接 DOS .COM 文件,但文档要么模棱两可,要么如示例所示不起作用,所以我最终得到一个 .EXE 文件(带有 MZ 标头) 或多个链接器/编译器错误。
那么,如何使用 Open Watcom 编译器制作 .COM 可执行文件?
assembly - 组装说明:AAA
我正在查看伪代码:BCD 指令的隐藏力量。以下是网站内容的片段:
那么,让我们来看看AAA是做什么的。这是等效的伪代码(来自英特尔):
对于像这样的典型英特尔文档兼容使用,情况确实如此:
上面的算法似乎没有给出代码中注释的结果,所以我假设这里省略了一些步骤。评论声明如下:“al=21=15h => 它是十进制的!”。
我对代码的解释如下:
- 在加法指令之后,存储在 AL 寄存器中的值将是 15 (0Fh)。
- 由于它大于 10,因此将向该值添加 6 并与 0Fh 进行与运算,这将导致 1s 值存储在 AL 寄存器中(“AL = (AL + 6) AND 0FH;”)。AL 寄存器的值现在应该是 05h。
- 该算法将 1 添加到 AH 寄存器,我假设这是结转,因为我们对 AL 寄存器的 4 位进行了与运算和归零(“AH = (AH + 1);”)。
但是,没有提及在运行“AH = (AH + 1);”行之前存储在 AH 寄存器中的值。如果它被初始化为零,它只适用于 20 以下的数字。现在假设它被初始化为零,我希望结果存储为 AH=1 和 AL=5,但注释说“;al =21=15h => 是十进制的!”。似乎在执行这段代码之前和之后做了其他事情。
你能向我解释一下我在这里缺少什么吗?
另外,这里如何使用 CF/AF 标志?
- 我知道当第 3 位有进位时设置了 AF 标志。这是否用于调整 AL 寄存器以使其存储评论中提到的 15h 值?如前所述,该算法似乎确实表明十位值存储在 AH 寄存器中,而个位值存储在 AL 寄存器中。
- 为什么在这里设置CF?这是从 MSB 结转的,但我在这个特定的添加/转换中看不到任何结转。我希望在溢出之类的情况下设置它。
assembly - 为什么在尝试处理 286 上的异常而不是现代 CPU 或 Bochs 上的异常时会出现三重错误?
我正在尝试在 AMD 286 系统上使用异常处理来初始化保护模式。我已经在 Bochs 上调试了下面的代码,它在那里运行良好。在 Pentium 4 机器上运行时也是如此。但是在 286 上,当它到达int3
指令时,它只会出现三倍错误。可观察到的行为是:如果我注释掉int3
,我会无限期地在屏幕上显示“OK”,而在代码原样的情况下,系统会重新启动。
该代码将由FASM 编译,并将二进制文件放入HDD 或FDD 的引导扇区。我实际上是从 1.4M 软盘上运行它的。
我想我正在使用 286 不支持的一些 CPU 功能,但究竟是什么以及在哪里?