Assembly 简单FASM“;你好,世界&引用;DOS中断时崩溃
在我的高中作业中,我必须编写一个程序,它使用DOS中断来输入和输出字符串,而不是std printf/scanf 但当我尝试运行此程序时:Assembly 简单FASM“;你好,世界&引用;DOS中断时崩溃,assembly,x86,dos,x86-16,fasm,Assembly,X86,Dos,X86 16,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 i
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
它只是在崩溃。我连接了调试器,发现它在这一行崩溃:int21h
。我完全不知道为什么会这样。我使用FASM、SASM IDE和Windows XP SP3 x32当使用SASM IDE并且您在汇编代码中使用
格式ELF
时,FASM将把文件组装到一个ELF对象(.o
文件),然后(默认情况下)使用GCC和LD的明版本将该ELF对象链接到Windows可执行文件(PE32)。这些可执行文件作为本机Windows程序而不是DOS运行。您不能在Windows PE32可执行文件中使用DOS中断,因为该环境中不存在DOS中断。最终结果是它在int21h
上崩溃
如果要创建可在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在内部运行DOS程序。这在很多级别上都是错误的。首先,它使用的是ELF
,而不是windows。我很惊讶你居然能让它运行起来。然后,它使用int21h
,这是一种DOS中断。也许有一种方法可以让windows为您提供与DOS兼容的环境(或不兼容)。最后,你为什么还用XP?我用的是Linux,但作业需要windows环境,所以我用的是VM。如果你用的是Linux,想运行DOS,请使用dosbox
@Jester。ELF在这里工作的原因是,他使用的是格式ELF
,而不是格式ELF可执行文件
。如果没有可执行文件,fasm将输出一个elf对象。在Windows SASM下,它将ELF对象链接到一个PE32可执行文件,其中包含一个MingGW版本的GCC,该版本的GCC和LD都理解ELF和PE格式,因此它可以使用ELF对象生成最终的PE32可执行文件。当然,在windows程序中使用DOS中断将不起作用。这只是病态:D