我很好奇以前是否已经这样做过,而不一定是否具有实用价值(尽管空间效率的提高是显而易见的)。是否在同一机器代码中编码了多个指令?例如:
(这是完全弥补的)
0xAEA2 - >添加R3 0xA2
0xEAE6 - > mov R1 0xE6
0xAAAA ......
通过将一个半字节向左移动来重新解释机器代码变为:
0xEA2E - > mov R1 0x2E
0xAE5A - >添加R3 0x5A
答案 0 :(得分:4)
在Smalltalk 78(所有现代Smalltalk方言的前身之一)的实现中,有一个双字节存储参数0 字节码,其第二个字节是加载参数0 。这样,跳转到存储指令开头的代码执行存储,同时跳转到它的中间(!)导致加载。您可以在Reviving Smalltalk-78 - Bert Freudenberg - IWST 2014 - 分钟30 -
中了解详情答案 1 :(得分:1)
初学者' Redcode指南,版本1.22,版权所有1997-2004 Ilmari Karonen:
...
核心战争(或核心战争)是一种编程游戏,其中汇编程序试图在模拟计算机的内存中相互摧毁。程序(或 warriors )使用称为 Redcode 的特殊语言编写,并由名为 MARS 的程序运行( Memory Array Redcode模拟器)...
这款游戏的乐趣在于重新解释机器代码后,通过类似于你的半自动转移的操作进行修改。
答案 2 :(得分:1)
这不是新的。多年前,我们曾经进行过小型代码优化竞赛。例如,下面的代码仅用42个字节实现C函数strcpy
,strncpy
和stpcpy
。我在1993年写了这篇文章.16位8086汇编语言,C-callable,参数在栈上传递,调用者清理堆栈。
注意strcpy
的入口点是指令的第一个字节,它将接下来的两个字节加载到AX寄存器中。 db 3Ch
是另一条指令的第一个字节,它占用下一个字节(or al
),然后执行STC
指令,该指令是{{1}的第二个字节由or al,0F9h
执行的指令。
创建列表文件以获取操作码,然后跟踪三个入口点中的每一个都会发生什么,这是有益的。
当我们修补现有代码时,这些技巧派上了用场。有时我们可以在不更改任何关键部分的地址的情况下对.COM文件进行二进制补丁。当我们必须使用16字节(或更大)对齐的东西时,这很重要,而且我们并不想浪费15个字节的死区,因此我们可以添加另一条指令。哦,当你只有64 K字节可以使用时你会玩的游戏。
strncpy
我记得花了好几个小时想出那个只是为了让我的一个朋友在这些比赛中一直打败我。他花了几分钟时间仔细研究并刮掉了另一个字节。