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
在哪里t
loop
使用
ecx
而不仅仅是
cl
,所以你应该设置它的所有32位。@Jester
fib
.data
字段中初始化。我在原始帖子中添加了它。当你的代码出错时,
ESI
有什么值?它比
fib
有多远?ecx中有什么,为什么没有你没有读Jester评论的后半部分吗?关键是,无论FIB在哪里,页面都被标记为只读。什么是
NUMBER\u FIBS\u COMPUTE
?FIB在哪里?还要注意
loop
使用
ecx
而不仅仅是
cl
,所以你应该设置它的所有32位。@Jester
FIB
是在
.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