简单的 FASM “Hello world!” DOS中断崩溃

Posted

技术标签:

【中文标题】简单的 FASM “Hello world!” DOS中断崩溃【英文标题】:Simple FASM "Hello world!" crashes on DOS interrupt 【发布时间】: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 【参考方案1】:

当使用 SASM IDE 并在汇编代码中使用 format ELF 时,FASM 会将文件汇编为 ELF 对象(.o 文件),然后(默认情况下)使用 MinGW 版本的 GCC 和 LD 来链接该对象ELF 对象到 Windows 可执行文件 (PE32)。这些可执行文件作为本地 Windows 程序运行,而不是 DOS。您不能在 Windows PE32 可执行文件中使用 DOS 中断,因为该环境中不存在 DOS 中断。最终结果是它在int 21h 上崩溃。

如果您想创建一个可以在 32 位 Windows XP 中运行的 DOS 可执行文件,您可以这样做:

format MZ                   ; DOS executable format
stack 100h

entry code:main             ; Entry point is label main in code segment

segment text
msg db 'Hello, world!$'     ; DOS needs $ terminated string

segment code
main:
    mov   ax, text
    mov   ds, ax            ; set up the DS register and point it at
                            ; text segment containing our data
    mov   dx, msg
    mov   ah, 9
    int   21h               ; Write msg to standard output

    mov   ah, 4Ch
    int   21h               ; Exit DOS program

这将生成一个带有exe 扩展名的DOS 程序。不幸的是,您不能使用 SASM IDE 来调试或运行 DOS 程序。您可以从 32 位 Windows XP 命令行运行生成的程序。 32 位版本的 Windows 在NTVDM (virtual DOS machine) 中运行 DOS 程序。

【讨论】:

以上是关于简单的 FASM “Hello world!” DOS中断崩溃的主要内容,如果未能解决你的问题,请参考以下文章

MVC 模式中的“Hello World”

Dubbo框架的Hello World

带有 .inc 文件的 fasm 和 glut 简单示例

PHP 配置apache 配置文件,输出 hello world

解析cocos2d-lua项目中的Hello World

cocos2d-x之浅析Hello World