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

时间:2018-02-26 14:49:18

标签: assembly dos fasm

在我的高中作业中,我必须编写一个程序,使用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

1 个答案:

答案 0 :(得分:3)

使用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程序。