我刚刚开始在 win32 上学习一些 x86 程序集,并且使用 .asm 文件的 ide 附带的自定义构建规则将 masm 与 Visual Studio 2008 一起使用。我一直在尝试使用 DOS 中断打印到控制台,但我收到消息:“ASMTest.exe 中 0x00401004 处的未处理异常:0xC0000005:访问冲突读取位置 0xffffffff。” 在第 8 行。我正在尝试输出单个 ascii 字符“A”(41h)这是 masm 代码:
.386
.MODEL flat, stdcall
.CODE
start:
mov dl, 41h
mov ah, 2
int 21h
ret
end start
当我使用 debug.exe 并使用“a”命令输入所有 .CODE 指令并运行它(“g”)时,它工作正常。
谁能告诉我如何正确使用 DOS 中断?谢谢!
编辑:在 win32 上编程时,Managu 是正确的,您应该使用像 WriteConsoleA 这样的 Windows api 调用,而不是使用 DOS 中断。这是一个有用的资源。如果有人正在寻找执行此操作的代码(就像我一样),这里是:
.386
.MODEL flat, stdcall
; Windows API prototypes
GetStdHandle proto :dword
WriteConsoleA proto :dword, :dword, :dword, :dword, :dword
ExitProcess proto :dword
STD_OUTPUT_HANDLE equ -11
.DATA
HelloWorldString db "hello, world", 10, 0
.CODE
strlen proc asciiData:dword
; EAX used as count, EBX as ascii char pointer, EDX (DL) as ascii char
mov eax, -1
mov ebx, asciiData
mov edx, 0
BeginLoop:
inc eax ; ++count (init is -1)
mov dl, [ebx] ; *dl = *asciiptr
inc ebx ; ++asciiptr
cmp dl, 0 ; if (*dl == '\0')
jne BeginLoop ; Goto the beginning of loop
ret
strlen endp
main proc
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov ecx, eax
invoke strlen, addr HelloWorldString
invoke WriteConsoleA, ecx, addr HelloWorldString, eax, 0, 0
ret
main endp
end
(将入口点设置为 main)