Assembly 访问冲突MASM x86程序集
我在一个项目中工作,目前在我的一行中遇到访问冲突。我想知道我是否能对什么是错的提出第二种意见。以下是我的代码(注意,我在运行时收到错误,但它确实生成):Assembly 访问冲突MASM x86程序集,assembly,x86,masm,Assembly,X86,Masm,我在一个项目中工作,目前在我的一行中遇到访问冲突。我想知道我是否能对什么是错的提出第二种意见。以下是我的代码(注意,我在运行时收到错误,但它确实生成): .data BlueTextOnGray=蓝色+(浅灰色*16) DefaultColor=浅灰色+(黑色*16) arrayD SDWORD 12345678h、1A4B2000h、3434h、7AB9h fib字节1,2 字节数FIBS到COMPUTE dup(0) 提示字节“输入结束整数:”,0 错误字节“无效停止点! .代码 主进程 m
.data
BlueTextOnGray=蓝色+(浅灰色*16)
DefaultColor=浅灰色+(黑色*16)
arrayD SDWORD 12345678h、1A4B2000h、3434h、7AB9h
fib字节1,2
字节数FIBS到COMPUTE dup(0)
提示字节“输入结束整数:”,0
错误字节“无效停止点!
.代码
主进程
mov-eax,BlueTextOnGray
调用SetTextColor
调用Clrscr;清除屏幕
呼叫Crlf;新线路
mov edx,偏移提示
通话记录
调用ReadInt;将整数输入EAX
呼叫Crlf;新线路
lea esi,[fib+2]
mov cl,数字FIBS TO COMPUTE
@@:
mov al,[esi-2]
添加al,[esi-1]
mov[esi],al;您的问题是,无论fib
指向哪个加载到esi
中,该内存页都被标记为只读
通常,访问冲突是由于试图写入GDT中标记为只读的内存位置而导致的。当您试图读取进程根本无权访问的内存位置时,会发生分段错误
正如@Jester所指出的,您没有注意到ECX
中的高阶位。当您在CL
中设置循环控制值时,由于ECX
未知,您的循环可能会运行得远远高于您的预期。这将很快使您进入内存中的只读区域。您的问题是,无论fib
指向加载到esi
中的内存页标记为只读
通常,访问冲突是由于试图写入GDT中标记为只读的内存位置而导致的。当您试图读取进程根本无权访问的内存位置时,会发生分段错误
正如@Jester所指出的,你没有注意到ECX
中的高阶位。当你在CL
中设置循环控制值时,你的循环可能会运行得远远高于你的预期,因为ECX
是未知的。这会很快让你进入内存中的只读区域。fib
在哪里tloop
使用ecx
而不仅仅是cl
,所以你应该设置它的所有32位。@Jesterfib
在.data
字段中初始化。我在原始帖子中添加了它。当你的代码出错时,ESI
有什么值?它比fib
有多远?ecx中有什么,为什么没有你没有读Jester评论的后半部分吗?关键是,无论FIB在哪里,页面都被标记为只读。什么是NUMBER\u FIBS\u COMPUTE
?FIB在哪里?还要注意loop
使用ecx
而不仅仅是cl
,所以你应该设置它的所有32位。@JesterFIB
是在.data
字段。我在原始帖子中添加了它。ESI
在代码出错时有什么值?它比fib
有多远?在ECX中有什么,为什么你没有读Jester评论的后半部分?关键是,无论fib在哪里,页面都被标记为只读。什么是NUMBER\u FIBS\tO_COMPUTE
?数据部分中的fib定义不正确吗?IDK MASM,但我假设它是读写的。我认为代码的迭代次数比预期的要多,因为ECX中的高垃圾,就像Jester最初指出的那样,所以当指针增量到达未映射页面时,它会出错。这可能是一个问题哦,但我看不出他在哪里把它设置为任何类型的有效内存区域。嗯……再看看,我认为你是对的。Jester有它。在数据部分中fib
不是定义正确吗?IDK MASM,但我假设它是读写的。我认为代码只是运行了比预期更多的迭代,因为像ECX中的高垃圾Jester最初指出,指针增量到达未映射页面时会出错。这可能也是一个问题,但我看不出他将其设置为任何类型的有效内存区域。嗯……再看一看,我认为你是对的。Jester有。
.data
BlueTextOnGray = blue + (lightGray * 16)
DefaultColor = lightGray + (black * 16)
arrayD SDWORD 12345678h,1A4B2000h,3434h,7AB9h
fib BYTE 1,2
BYTE NUMBER_FIBS_TO_COMPUTE dup(0)
prompt BYTE "Enter an ending integer: ",0
error BYTE "Invalid stopping point!
.code
main PROC
mov eax,BlueTextOnGray
call SetTextColor
call Clrscr ; Clear the screen
call Crlf ; New line
mov edx,OFFSET prompt
call WriteString
call ReadInt ; Input integer into EAX
call Crlf ; New line
lea esi, [fib+2]
mov cl, NUMBER_FIBS_TO_COMPUTE
@@:
mov al, [esi-2]
add al, [esi-1]
mov [esi], al ;<------------This is where the error occurs
inc esi
loop @B
; here print out the results or examine them with debugger
E1: call Crlf ; New line
call WaitMsg ; "Press any key..."
mov eax,DefaultColor
call SetTextColor
call Clrscr
exit
main ENDP
END main