问题标签 [68000]

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 投票
2 回答
374 浏览

compiler-construction - 68040 If Else 的分支错误

那里有什么好的 68k 汇编程序员吗?我正在为摩托罗拉 68040 使用商业 Green Hills 编译器,我从代码中看到了一些非常奇怪的行为。有时,代码会进行 if/else 比较,并选择错误的分支。例如:

代码有时会d!?我发现无论何时发生此错误,总会有一个特定的 ISR 中断比较。我查看了为 ISR 生成的程序集,发现了一些对我来说没有意义的东西。首先,看起来浮点状态寄存器 FPSR、FPCR 和 FPIAR 没有保存在 ISR 中。这可以解释为什么 if/elses 选择了错误的分支。FPSR 寄存器用于确定比较的结果,如果该寄存器在 ISR 中被覆盖,则分支可能会采用错误的路径。以下是编译器生成的入口和出口程序集:

我查看了 Programmer's Reference Manual 并且找不到任何暗示 FSAVE 或 FMOVEM 保存 FP 状态寄存器的内容。实际上,我看到一条评论表明它没有,“FSAVE 不保存浮点单元的程序员模型寄存器;它只保存机器的用户不可见部分。” 所以我添加了一些我自己的程序集来保存 ISR 开始时的寄存器,并在最后恢复它们,这极大地提高了性能,但我仍然看到一些问题。以下是我所做的补充;备份变量在 C 代码中键入为 unsigned long:

我很难相信编译器实际上存在错误,因为没有保存寄存器。所以我开始查看 FPx 和 Dx 的值,看看它们是否恢复到正确的值,看起来它们不是。但是,我不是 100% 不会用我的修改来污染汇编代码。以下是我为保存寄存器添加的代码;调试变量的类型为无符号长整数:

简而言之,我的问题是,

1) 生成的程序集是否存在问题,因为它没有保存 FPSR、FPCR 和 FPIAR 寄存器,以及

2)当我进入和退出 ISR 时,我是否正确保存了寄存器的值?

如果我有另一个编译器可以比较,那就太好了。不幸的是,我无法将调试器附加到代码中。我在 C/C++/C#/Java/Python/PHP/等方面有丰富的经验,但我远非汇编专家。

任何想法表示赞赏!

0 投票
2 回答
134 浏览

c - 功能对齐

如何使函数在 4 字节边界与 GCC 对齐,目标 680x0?

-malign-functions=4无论如何,它本身似乎并不能解决问题。某种旨在提高 68020 及更高版本缓存性能的选项?

0 投票
1 回答
6759 浏览

assembly - 在汇编代码 Easy 68k (68000) 中插入换行符

我对组装很陌生,我正在尝试构建一个小程序。我不知道如何使用 Easy68k 在汇编中插入换行符。例如,我开始编写基本的黑杰克模拟器,我需要在问候第一个玩家后进行换行。我尝试将“\n”合并到变量声明中,但它只是打印出来,好像它是文本的一部分。

根据 Easy 68K Help I/O 部分,我可以使用“LF EQU $0A New line (line feed)”,但我不知道如何实现。

0 投票
2 回答
3488 浏览

assembly - 使用 Easy 68K (68000) 在范围内组装随机数

我正在使用 Easy 68K 模拟器创建一个简单的二十一点游戏,并且需要使用随机数来分配卡片。我的牌必须在 2 到 11 的范围内。我似乎每次都得到相同的数字,而且不在我期望的范围内。我的卡值需要以 D3 结尾,所以我有以下随机数代码:

我是通过修改此站点上的代码得出的:https ://notendur.hi.is/voe1/3.%20onn/Tolvuhogun/EASy68K/Examples/tutorial3.X68

我希望能找到生成数字 2 到 11 的帮助。我已经在互联网上搜索了几个小时。我知道我需要使用 Move.B #8, D0 来访问时间,但除此之外,我没有取得太大进展。任何帮助将不胜感激!

0 投票
1 回答
943 浏览

assembly - m68k 十六进制到十进制无法正常工作

我正在为正在开发的 M68k 计算机编写一个小型操作系统,但遇到了一个小问题。我需要能够以十进制(31)向用户显示十六进制值(例如 $1F)。我为此编写了以下代码,但它有一些问题:

该代码在高达 $F 的值上运行良好。例如,如果我输入 $B,它会输出 11。但是,一旦数字超过 $F,它就会开始被破坏。如果我输入 10 美元,我会输出 10 美元,以此类推。它总是在 $xF 之后回绕。

有没有人对它为什么这样做有任何想法?

0 投票
1 回答
524 浏览

assembly - Divide (DIVS) 不适用于 jack crenshaw 让我们构建一个编译器

我正在关注 Jack Crenshaw 在http://compilers.iecc.com/crenshaw上找到的优秀的 Let's Build a Compiler 教程。我正在使用 Easy68k http://www.easy68k.com/ 68000 editor/assembler/simulator 测试生成的 68k 程序集。我已经进入第 2 部分http://compilers.iecc.com/crenshaw/tutor2.txt但 Divide 程序对我来说无法正常工作。

如果我输入“8/2”作为测试,那么编译器会生成以下代码:

在我看来,这实际上是在计算 2/8(即,这是错误的方法),因为之后留在 D0 中的值是 00020000。我可以通过将最后一行重写为 DIVS D0,D1 来解决这个问题,但这会将结果留在根据其他例程,D1 而不是 D0,在我看来,这样的开创性工作不太可能是不正确的。我已经搜索了互联网,但我看不到其他人遇到过这个问题。那么这是否意味着:1)我做错了 - 可能 2)杰克做错了 - 不太可能 3)Easy68k 模拟器做错了 - 不太可能 但是我只是看不出我做错了什么。请帮忙。

0 投票
1 回答
2317 浏览

assembly - MC68000 汇编乘法

假设我们有以下内容:

D1 的值是多少?根据 mc68000 模拟器,它将是 FFFA146A。书上说,每个寄存器的两个最低位字将相乘,结果将作为长字存储。因此,它将是 0xABCD * 0x0012 = 0xC146A。根据这个规则,D1 应该是 000C146A。我注意到 146A 的值与模拟器中的相同,但是 A 来自哪里,Fs 来自哪里?模拟器错了吗?

谢谢

0 投票
1 回答
1174 浏览

assembly - 我无法让这个加法子例程工作

我正在用 Easy68k 为我的汇编语言类编写一个附加程序,但我一直遇到同样的问题。每当我运行该程序时,它允许我输入最多 10 个数字(分配给我的数组的大小),然后它输出消息说它正在计算,但我只是得到一个无休止的 y 与变音符号的打印输出。您可以立即看到我的程序导致它执行此操作的任何问题?

我已经搜索了子例程的语法,因为我很肯定那是我做错了,但我找不到任何东西。

0 投票
4 回答
2544 浏览

macos - OS X Lion 上的 68k 汇编器

我需要在汇编程序中为我的大学课程做一些 68k 的编程工作。我正在寻找在 os x lion 上执行此操作的程序。我发现在 wine 中运行的 easy68k,但我觉得它不能正常工作。有什么猜测吗?

0 投票
2 回答
8346 浏览

assembly - 为什么在带有 DC.W(定义常量)的数字之前不需要 #,只有指令?

我有这行代码:

这基本上意味着X = 5但不应该X DC.W #5

使用 MOVE 时,我总是需要#