gpt4 book ai didi

assembly - Masm x86 程序集崩溃时的 DOS 中断

转载 作者:行者123 更新时间:2023-12-02 21:42:49 24 4
gpt4 key购买 nike

我刚刚开始学习 win32 上的一些 x86 汇编,并且我使用了 masm 和 Visual Studio 2008,使用 .asm 文件的 ide 附带的自定义构建规则。我一直在尝试使用 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 中断。 This是一个有用的资源。如果有人正在寻找执行此操作的代码(就像我一样),这里是:

.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)

最佳答案

当您使用debug.exe输入此代码时,您正在汇编一个16位(8086架构,“实模式”)dos程序。您指定的语义对于此类程序是正确的。然而,当您使用 MASM 组装此处的程序,然后链接它时,您正在尝试创建一个 32 位(i386 体系结构,“保护模式”)Windows 程序。我可能是错的,但我认为在后一种情况下你甚至不能合法地调用 int 21h。

关于assembly - Masm x86 程序集崩溃时的 DOS 中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1414260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com