Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 简单FASM“;你好,世界&引用;DOS中断时崩溃_Assembly_X86_Dos_X86 16_Fasm - Fatal编程技术网

Assembly 简单FASM“;你好,世界&引用;DOS中断时崩溃

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

在我的高中作业中,我必须编写一个程序,它使用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
它只是在崩溃。我连接了调试器,发现它在这一行崩溃:
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