访问违规MASM x86程序集

时间:2016-11-22 02:03:43

标签: assembly x86 masm

我正在开展一个项目,目前我正在接收一个访问冲突。我想知道我是否能对错误得到第二意见。这是我的代码(注意,我在运行时得到错误,但它确实构建了):

.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

是否有我失踪的规则。我做了我的研究,但似乎无法找到适合我情况的答案。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题是,esi指向加载到ECX的任何地方,该内存页面都标记为只读。

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

正如@Jester指出的那样,你没有注意CL中的高位。当您在ECX中设置循环控制值时,由于class AppAsset extends AssetBundle { public $basePath = '@webroot'; public $baseUrl = '@web'; public $css = [ 'css/site.css', ]; public $js = [ ]; public $depends = [ 'yii\web\YiiAsset', 'yii\bootstrap\BootstrapAsset', ]; } 未知,您的循环可能会远远超出您的预期。这会很快让你进入你记忆中的只读区域。