Snu*_*ies 5 assembly dos tasm dosbox x86-16
配置:
MS-DOS 16 BIT(在.asm文件中写入,然后用TASM和TLINK编译它们)
Windows 7 x64
我在Assembly中创建了一个简单的程序,它只应该打开一个文件并为其写一个文本.
这是代码:
assume cs:code, ds:data
data segment
fileName db "input.txt", 0 ; We assure it is an ASCIIZ(ero) file.
toWrite db "Hello World!", "$"
data ends
code segment
writeToFile:
; pentru functia 3Dh
mov AH, 3Dh
mov AL, 0h
mov dx, offset fileName
int 21h
ret
start_program:
mov ax, data
mov ds, ax
CALL writeToFile
mov ax, 4c00h
int 21h
code ends
end start_program
Run Code Online (Sandbox Code Playgroud)
我用TurboDebugger看看会发生什么.奇怪的是,它总是具有AX
价值0005
意义Access Denied
我在互联网上可以找到的所有东西都是ASSEMBLY access denied open file
关于它DLL
的,但这并没有帮助.
我已经尝试了任何东西,从重新启动程序到打开dosbox"作为管理员".可悲的是,没有任何效果,我没有想法.
同样奇怪的是,我的一位朋友说,在激活他的窗户10之后,一切都运转正常.
只获得"拒绝访问"的原因是什么?我提到我能够创建,删除和关闭文件,但我无法打开它们.
为了正确操作,您的writeToFile过程需要
我注意到,您将在该文件中写入的文本以“$”结束。我想知道您是否知道实际写入文件的 DOS 函数仅适用于指定的长度CX
,而不适用于任何类型的分隔符。对于这个“$”字符,您可能还有其他正当理由 -;
writeToFile:
mov ax, 3D01h ; 01h=WriteAccess
mov dx, offset fileName
int 21h
jc NOK
mov bx, ax ; Handle
mov dx, offset toWrite
mov cx, 12 ; Length of "Hello World!"
mov ah, 40h
int 21h
jc NOK
cmp ax, cx
jne NOK
NOK:
ret
Run Code Online (Sandbox Code Playgroud)
将NOK标签放在哪里以及在那里做什么完全取决于您想花多少精力来处理 DOS 返回的错误。在这个非常简单的程序中,您可能只是从 中返回call
并让程序终止。