8086程序使用循环将您的名称打印为ascii的十六进制值数组

时间:2015-11-25 00:48:49

标签: windows assembly x86 x86-64

这是我的代码,但是当我使用我的调试器时,一旦我到达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 

3 个答案:

答案 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?