简单 FASM "Hello world!" 在 DOS 中断时崩溃
Simple FASM "Hello world!" crashes on DOS interrupt
在我的高中作业中,我必须编写一个程序,它使用 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
当使用 SASM IDE 并且您在汇编代码中使用 format ELF
时,FASM 将 assemble 文件到 ELF 对象(.o
文件)然后使用(默认情况下)GCC 的 MinGW 版本和 LD 到 link 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 命令行 运行 生成程序。 Windows 运行 DOS 程序里面的 32 位版本 NTVDM (virtual DOS machine).
在我的高中作业中,我必须编写一个程序,它使用 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
当使用 SASM IDE 并且您在汇编代码中使用 format ELF
时,FASM 将 assemble 文件到 ELF 对象(.o
文件)然后使用(默认情况下)GCC 的 MinGW 版本和 LD 到 link 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 命令行 运行 生成程序。 Windows 运行 DOS 程序里面的 32 位版本 NTVDM (virtual DOS machine).