表面上看你的程序并没有错....上面版主给是正确的...但我还是找了下你错的原因...我想是.486的错误吧...用这个描述符之后指默认是32位下的指命格式....所以虽然你在用mov al mystr[si]取字符..但是编译器在编译是确用了
MOV AL , MYSTR[ESI]这样当然就出错了呀...下我是用OD加载后的结果..
00401000 >/$ 66:BE 0000 mov si, 0
00401004 |. 66:B9 0400 mov cx, 4
00401008 |> 8A0435 003040>/mov al, [esi+403000] ;esi FFFF0000
0040100F |. FEC0 |inc al
00401011 |. 880435 003040>|mov [esi+403000], al
00401018 |. 66:46 |inc si
0040101A |.^ E2 EC \loopd short 00401008
0040101C |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0040101E |. 6A 00 push 0 ; |Title = NULL
00401020 |. 68 00304000 push 00403000 ; |Text = "abcd"
00401025 |. 6A 00 push 0 ; |hOwner = NULL
00401027 |. E8 08000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
0040102C |. 6A 00 push 0 ; /ExitCode = 0
0040102E \. E8 07000000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess
00401033 CC int3
00401034 $- FF25 08204000 jmp [<&USER32.MessageBoxA>] ; USER32.MessageBoxA
0040103A .- FF25 00204000 jmp [<&KERNEL32.ExitProcess>] ; kernel32.ExitProcess
00401040 00 db 00
看到了吧...情况并不是你想的那样....ESI的高字是FFFF....这样就引发了异常了......
不知道你们怎么看...