这是我的代码,但是当我使用我的调试器时,一旦我到达int21 h命令,我就会收到错误:
Unhandled exception at 0x00007FF6E9B01034 in MP2_KyleRuiter.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
程序:
ExitProcess PROTO
.data
string DB 4bh, 79h, 6ch, 65h, 20h, 52h, 75h, 69h, 74h, 65h, 72h, 00h ; My Name
COUNT = ($-string) ; string length calculation
.code
main proc
mov rcx,COUNT ; loop counter
mov rsi,offset string
L1:
mov dl,[rsi] ;gets character from the array
mov ah,2 ;displays character
inc rsi; points to next character
Loop L1 ;decrements rcx until 0
mov rax, 4c00h
int 21h ; displays
RET
main ENDP
END
答案 0 :(得分:3)
int 21h
&合。是16位MS-DOS的东西,而你编写的其余代码是x86 64位汇编。在64位Windows上,您正在调用上帝知道的中断处理程序,这会导致崩溃。
如果你想在64位Windows下运行时打印东西,你必须调用相关的系统调用(GetStdHandle
来获取控制台的句柄,WriteFile
来写入数据); MASM通过INVOKE
指令使这相对简单。
答案 1 :(得分:1)
您不能在64位Windows可执行文件中使用DOS中断,例如int 21h
。现代Windows不是基于DOS的系统,因此它不再使用该接口。
如果要编写DOS可执行文件,则需要使用16位指令,并在模拟器中运行(如DOSBox)。
如果要编写64位Windows可执行文件,则需要使用Windows库调用。
选择一个。
答案 2 :(得分:-1)
int 21h,AH设置为4Ch表示终止返回码。看起来您的调试器不知道如何跨越/进入终止。我认为这是有道理的。
系住我的最后一个。我有所纠正。
您可能会觉得这很有帮助: Why does using "int 21h" on Assembly x86 MASM cause my program to crash?