如何通过中断将20字节汇编Hello World程序压缩至20字节以内
小于20字节的Hello World COM程序压缩实现
原代码编译后恰好为20字节,利用软中断调用的硬件特性结合DOS加载COM程序的默认上下文状态,可以将体积压缩到19字节甚至更小,具体实现方法如下:
- 核心中断相关原理:x86架构执行软中断指令时,CPU会自动将中断返回地址、段寄存器、标志寄存器压入栈中;同时DOS提供的
INT 21h系统服务只要求AH寄存器为对应功能号,不需要完整初始化AX全部位,存在可复用的默认状态空间。 - 具体优化步骤:
- 第一步省出1字节:把原代码中2字节的
MOV AH,9替换为1字节的XCHG AX,BP。MS-DOS 2.0及以上版本加载COM程序时,BP寄存器的高8位默认固定为0x09,执行交换指令后AH的值恰好为0x09,完全满足INT 21h9号打印字符串功能的功能号要求。 - 可选进阶压缩(再省2字节):调整代码顺序将字符串直接放在
INT 21h指令之后,利用INT 21h执行时自动压入栈的返回地址(就是字符串首地址),用1字节的POP DX替换原来3字节的MOV DX,108,最终可压缩到17字节。
- 第一步省出1字节:把原代码中2字节的
- 19字节兼容版本对应汇编代码(可直接用DEBUG编译):
A XCHG AX,BP MOV DX,107 INT 21 RET DB 'HELLO WORLD$' R CX 13 N MYHELLO.COM W
该版本总长度19字节,比原版本小1字节,可在所有主流DOS兼容环境下正常运行,输出完整的
HELLO WORLD字符串后正常退回命令行。
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

