【发布时间】:2014-05-14 18:35:32
【问题描述】:
我一直在使用 NASM 在 Linux 上进行汇编编码,现在我正在尝试在 Windows 上学习同样的方法。按照 Ray Duncan 的高级 MS-DOS 编程,图 3-7 列出了一个基于 MASM 的 hello world 程序,它基本上使用中断 21h 打印“hello world”。这与在 Linux 上使用中断 80h 做同样的事情是同义的,感觉就像在家里一样。我想在 Windows 上使用 NASM 做同样的事情。
网络上的大多数示例使用 Windows API,例如 _GetStdHandle、_WriteConsoleA 等,或者使用 C 库,例如 _printf。我想做它的骨头。沿着以下片段:
global _start
section .data
str: db 'hello, world',0xA
strLen: equ $-str
section .text
_start:
mov ah,40h
mov bx,1
mov cx, strLen
mov dx, str
int 21h
mov ax,4c00h
int 21h
希望我没有模棱两可:)
【问题讨论】:
-
中断 21h 是一个 DOS 调用,因此将在 DOS 下运行。我建议您打开一个 DOS 窗口,然后从那里运行您的程序以查看输出。
-
32 位 Windows 系统将运行 16 位 DOS 程序,因此如果适合您,您可以使用 Ray Duncan 版本。但是,64 位 Windows 系统不再具有 MS-DOS 子系统/仿真,因此它不会在那里工作。您将需要使用 Windows API,或者如果您更喜欢使用本机 NT API(它们非常相似,但通常没有文档记录)。如果您想使用实际的系统函数调度程序,请查看 Russinovich 的“Windows Internals”一书 - 实际使用的系统调度机制非常依赖于处理器和 Windows 版本。
标签: windows assembly nasm masm