x86 Assembly(polyglot),13个字节
字节码:
31 c0 b4 80 48 70 05 04 40 83 e0 60 c3
定义一个函数,如果将其解释为32位,则返回32,如果是64位,则返回64,如果是16位,则返回32767。
我想制作一个可以在Windows和Linux上运行的多语言软件,但这比我想象的要难得多。因为我不确定在没有链接的情况下甚至可以在非16位Windows上打印任何值。
说明
此代码使用两个告诉来确定其运行的体系结构。第一个是指令0x48,在16位和32位上,是dec %eax
,但是在64位上,它是指令大小的前缀。第二个告诉是同一条指令,但是,当我们在值0x8000上执行它时,仅当寄存器大小为16位时才翻转最高有效位,设置溢出标志并让我们使用jo
。
在16位中,此代码解释如下:
0: 31 c0 xor %ax,%ax /* 0x0000 */
2: b4 80 mov $0x80,%ah /* 0x8000 */
4: 48 dec %ax /* 0x7fff */
5: 70 05 jo c /* taken */
7: 04 40 add $0x40,%al
9: 83 e0 60 and $0x60,%ax
c: c3 ret /* 0x7fff */
在32位中,此代码解释如下:
0: 31 c0 xor %eax,%eax /* 0x00000000 */
2: b4 80 mov $0x80,%ah /* 0x00008000 */
4: 48 dec %eax /* 0x00007fff */
5: 70 05 jo c /* not taken */
7: 04 40 add $0x40,%al /* 0x00007f3f */
9: 83 e0 60 and $0x60,%eax /* 0x00000020 */
c: c3 ret
在64位中,此代码解释如下:
0: 31 c0 xor %eax,%eax /* 0x00000000 */
2: b4 80 mov $0x80,%ah /* 0x00008000 */
4: 48 70 05 rex.W jo c /* not taken */
7: 04 40 add $0x40,%al /* 0x00008040 */
9: 83 e0 60 and $0x60,%eax /* 0x00000040 */
c: c3 ret