这个Linux / 32bit x86组件“Hello,World”能否做得更小?
以下32位x86
Linux程序打印一个任意长度的字符串(只要程序可以,无论如何)并且之后退出(0):
.global _start ; notice on entry here,all regs but %esp are zero _start: call .L0 ; offset == strlen,provided by your assembler .byte 'H','e','l','o',',' ','W','r','d' .L0: pop %ecx ; ret addr is starting addr of string mov -4(%ecx),%edx ; argument to `call`,4 bytes: strlen inc %ebx ; stdout == 1 movb $4,%al ; SYS_write == 4 int $0x80 xchg %eax,%ebp ; %ebp is still zero xchg %eax,%ebx ; SYS_exit == 1,return value == 0 int $0x80 如果一个人愿意牺牲位置独立性(相反,强制链接器插入字符串地址),而不关心程序返回零,可以将其归结为: .global _start _start: movb $4,%al inc %ebx mov $.L0,%ecx ; this address is calculated when linking movb $.Lend-.L0,%dl ; strlen,calculated by assembler int $0x80 xchg %eax,%ebx int %0x80 .L0: .byte 'H','d' .Lend: 这两个都可以通过-32 -o x.o x.S组装/链接; ld -s -m elf_i386 x.o,运行得很好.第二个是26字节的代码.如果您在打印Hello,World之后允许崩溃,则将最后两条指令保留为23字节.那是我能走的最低点. 一直困扰着我的问题,是否有可能从中挤出几个字节?对我的纯粹猜测给出了这些可能的线索: >以某种方式使用’Hello,World’部分作为代码? 或者,可以证明这实际上是最小的表现良好(没有崩溃/返回代码为零)Linux / x86“Hello,World”? 编辑 澄清一下,问题不在于最小化ELF可执行文件的大小;这方面的技术是众所周知的.我明确询问Linux 32位x86汇编程序的大小,该程序执行的编译代码与以下代码相同: int main(int argc,char **argv) { puts("Hello,World"); exit(0); /* or whatever code */ } 会做. 解决方法
这是在1999年完成的.看看
this page(剧透:最终结果是一个45字节的ELF文件).一定要阅读
the postscript.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |