如何将使用int 80h系统调用的NASM汇编代码在Windows环境下编译生成可双击运行的EXE文件
如何把NASM汇编代码转成Windows可双击运行的EXE
嘿,我来帮你搞定这个问题!首先得明确:你当前的汇编代码是Linux x86专属的——用了int 80h这种Linux系统调用,Windows完全不识别这套逻辑。所以咱们得先把代码改成Windows平台适配的版本,再走编译链接的步骤。
第一步:改成Windows兼容的汇编代码
下面是适配Win32控制台的版本,用Windows官方API实现和你原代码一样的功能(提示输入名字,输出问候):
extern _GetStdHandle@4 extern _WriteConsoleA@20 extern _ReadConsoleA@20 extern _ExitProcess@4 section .data msg db "Enter your name: ", 0Dh, 0Ah msg_len equ $ - msg hello db "Hello, " hello_len equ $ - hello section .bss name resb 255 bytes_read resd 1 bytes_written resd 1 section .text global _main _main: ; 获取标准输出句柄 push -11 ; STD_OUTPUT_HANDLE的常量值 call _GetStdHandle@4 mov ebx, eax ; 打印提示信息 push 0 push bytes_written push msg_len push msg push ebx call _WriteConsoleA@20 ; 获取标准输入句柄 push -10 ; STD_INPUT_HANDLE的常量值 call _GetStdHandle@4 mov ebx, eax ; 读取用户输入的名字 push 0 push bytes_read push 255 push name push ebx call _ReadConsoleA@20 ; 再次获取标准输出句柄 push -11 call _GetStdHandle@4 mov ebx, eax ; 打印"Hello, " push 0 push bytes_written push hello_len push hello push ebx call _WriteConsoleA@20 ; 打印用户输入的名字 push 0 push bytes_written push dword [bytes_read] push name push ebx call _WriteConsoleA@20 ; 退出程序 push 0 call _ExitProcess@4
第二步:用NASM + MinGW ld编译链接
假设你已经装好了NASM和MinGW,并且把它们的路径加到了系统PATH里(这样CMD里能直接调用nasm和ld),跟着下面的步骤来:
- 把上面的代码存成
hello.asm - 打开命令提示符,切换到代码所在的文件夹,先执行汇编命令:
这里nasm -f win32 hello.asm -o hello.obj-f win32是告诉NASM生成32位Windows目标文件,格式是COFF。 - 接着用MinGW的ld链接成EXE:
ld -m i386pe hello.obj -o hello.exe -lkernel32-m i386pe指定生成Windows的PE格式可执行文件-lkernel32是链接kernel32.dll——咱们用到的那些Win32 API都在这个动态库里
做完这两步,你就能双击生成的hello.exe了,它会弹出控制台窗口,让你输入名字,然后输出问候语。
为啥你的原代码不能直接转?
再给你解释下本质问题:你的原代码用的是int 80h,这是Linux的系统调用入口,Windows的系统调用机制完全不一样(用的是int 2Eh或者syscall,参数传递规则也不同)。另外,Windows的可执行文件是PE格式,Linux是ELF格式,两者结构完全不兼容,所以必须改写代码并重新编译成PE格式的EXE才行。
内容的提问来源于stack exchange,提问作者Star Dev
相关产品推荐
相关产品推荐

