【问题标题】:Access Violation MASM x86 Assembly访问冲突 MASM x86 程序集
【发布时间】:2016-11-22 02:03:43
【问题描述】:

我正在从事一个项目,目前我的一条线路出现访问冲突。我想知道我是否可以就问题所在获得第二意见。这是我的代码(注意,我在运行时收到错误,但它确实生成了):

.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

有没有我遗漏的规则。我已经完成了研究,但似乎找不到适合我情况的答案。

任何帮助都会很棒! (另请注意,我还没有完成它,所以可能还有其他错误。)

谢谢!

【问题讨论】:

  • fib 在哪里?还要注意loop 使用ecx 而不仅仅是cl 所以你应该设置它的所有32位。
  • @Jester fib.data 字段中初始化。我在原帖上面加了
  • 当你的代码出错时ESI有什么价值?距离fib 有多远? ECX 里有什么,你为什么不看 Jester 评论的后半部分?
  • 嗯,关键是,无论FIB在哪里,页面都被标记为只读。
  • 什么是NUMBER_FIBS_TO_COMPUTE

标签: assembly x86 masm


【解决方案1】:

您的问题是,无论fib 指向哪里(加载到esi),该内存页都被标记为只读。

通常,访问冲突是由尝试写入在 GDT 中标记为只读的内存位置引起的。当您尝试从您的进程根本无权访问的内存位置读取时,会发生分段错误。

正如@Jester 指出的那样,您没有注意ECX 中的高位。当您在CL 中设置循环控制值时,由于ECX 未知,您的循环可能会运行得比您预期的要高得多。这会很快让您进入记忆中的只读区域。

【讨论】:

  • fib 不是在数据部分正确定义了吗? IDK MASM,但我认为那是读写的。我认为代码运行的迭代次数比预期的要多,因为就像 Jester 最初指出的那样,ECX 中的垃圾很高,所以当指针增量到达未映射的页面时它会出错。
  • 这也可能是个问题,但我看不出他在哪里设置了任何类型的有效内存区域。
  • 嗯...再看一遍,我认为你是对的。小丑有它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多