最小的hello world
来源:互联网 发布:工业设计需要什么软件 编辑:程序博客网 时间:2024/06/05 05:51
author:luojiafei
blog: http://blog.csdn.net/luojiafei
e-mail: 1196722167@qq.com
data: 2012/1/30
(注:这里的最小是指我能做到的最小)
最小的hello world
我们刚学编程的时候就是学习写hello world,现在我就讲一下我所写的最小的hello world.
首先一个用c语言写的hello为
#include <stdio.h>int main() { printf ("Hi World\n"); return 0;}
这个chello文件大小为2984字节。这时主要因为用到了printf和gcc为了你增加了其他段,然而这些段在这里作用不大。那这该如何解决呢?汇编!
以下是用nasm语法编写的hello world汇编:
[section .data]msg:db "Hello World",10 ;10为回车len:equ $-msg[section .text]global _start ;我们必须导出这个入口,让linker知道 _start:movedx,lenmovecx,msgmovebx,1moveax,4int0x80 ;write(1, msg, len),标准输出的fd为1movebx,0moveax,1int0x80 ;exit()
以及对应的makefile:
all:nasm -f elf hello.asm -o hello.old -s hello.o -o hello
运行结果:Hello World
这样生成的elf文件为大约为400字节,一下就比小了很多,主要是因为直接编写系统调用,以及连接时使用-s参数去除符号表等信息来帮文件“瘦身”。
当然如果这样就结束那就太简单了,我们接下来要直接修改文件的机械码。在Linux下有很多关于二进制编辑器,这里我使用ghex.
输入命令ghex2 hello 后便得到其机械码:
下面我们把Hello world后面的内容删除掉,而这样做文件也能正常运行(PS:因为后面都是作用不大的段):
这样文件大小变为176字节,(啊,这已经挺理想了)。但我们可以看到在第一行里有9个内容全部为0的字节,好像被白白浪费了?没错,这些的确是elf的保留字段,也就是目前没有到的字段。但我们的”Hello World\n"这里有12个字节,那怎么办?从一切从实际出发的角度来看,我觉得用一个耍赖的方法,把"Hello World\n"变成"Hi World\n".
下面,我们把最后面的9个字节放到第一行那9个没用的字节里(起始地址为0x07),再把0x86中的A4改为07,再把0xA2开始的两个字节删除(PS:这两字节为了地址对齐,没有实质作用)。最后变成下面这样:
最后为162字节。运行结果:Hi World
其实这里还可以还可以再精简一些,但估计不会减小太多字节,并且用a.out格式的话,字节数应该会更小。望高手指点!
- 最小的hello world
- 最小的C语言Hello,world程序
- 一个最小x86 ELF Hello World程序的诞生
- 最小 Docker 镜像 hello-world 剖析
- JMX的Hello World
- Hello World 的故事
- 汇编的HELLO WORLD!
- JAVA 的HELLO WORLD
- 汇编语言的Hello world
- Python 的Hello World
- 千奇百怪的Hello World
- Itouch 的Hello world
- 汇编的hello world
- C++ 的Hello World!!!
- 美丽的“Hello, World”
- hello world的秘密
- C++的Hello World
- Android的Hello World
- Android camera系统开发之IPC (四)
- 马士兵java 贪吃蛇
- HDU 2187 悼念512汶川大地震遇难同胞——老人是真饿了
- Android camera系统开发之IPC (五)
- windows网络性能测试NetPerf
- 最小的hello world
- C#实现多窗体
- MFC使用Opencv常用函数
- 字符串训练--把句子的单词顺序倒置
- java 枚举类型
- 血战乐金
- [Linux driver] Mutex, semaphore, spinlock的深度解析
- ksoap2- webservice(整理版)
- 创建catalog