【发布时间】:2018-08-06 01:34:12
【问题描述】:
在我的高中作业中,我必须编写一个程序,它使用 DOS 中断来输入和输出字符串,而不是 std printf/scanf 但是当我尝试运行这个程序时:
format ELF
use16
section '.data' writeable
msg db 'Hello, world!', 0
section '.text' executable
public _main
_main:
mov ebp, esp; for correct debugging
mov ah, 1
int 21h
mov ah,4Ch
int 21h
xor eax, eax
ret
这只是崩溃。我附加了调试器,发现它在这条线上崩溃:int 21h。我完全不知道它为什么会发生。
我使用 FASM、SASM IDE 和 Windows XP SP3 x32
【问题讨论】:
-
这在很多层面上都是错误的。对于初学者,它使用
ELF而不是 windows。我很惊讶你甚至让它以某种方式运行。然后,它使用int 21h,这是一个DOS中断。可能有一种方法可以让 Windows 为您提供与 DOS 兼容的环境(或不提供)。最后,你为什么还在用 XP? -
我用的是Linux,但是作业需要windows环境,所以我用VM。
-
如果你使用 linux 并且想运行 DOS 的东西,请使用
dosbox。 -
@Jester 。 ELF 在这里工作的原因是因为他使用
format ELF而不是format ELF executable。没有可执行的 fasm 将输出一个 elf 对象。在 Windows SASM 下,它将将该 ELF 对象链接到带有 MingGW 版本的 GCC 的 PE32 可执行文件。该版本的 GCC 和 LD 理解 ELF 和 PE 格式,因此它可以使用 ELF 对象来生成最终的 PE32 可执行文件。当然,在 windows 程序中使用 DOS 中断是行不通的。 -
这只是病态:D
标签: assembly x86 dos x86-16 fasm