首页
社区
课程
招聘
进来指点一下这个汇编程序[求助]
发表于: 2006-6-17 13:36 4407

进来指点一下这个汇编程序[求助]

2006-6-17 13:36
4407
.486                              
    .model flat, stdcall               
    option casemap :none               
  
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc

    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

.data
    mystr db "abcd",0
.code
start:
    mov si,0
    mov cx,4
    here:
    mov al,mystr[si]
    inc al
    mov mystr[si],al
    inc si
    loop here
    invoke MessageBox,NULL,addr mystr,NULL,MB_OK
    invoke ExitProcess,NULL      
end start

程序的目的是想变mystr "abcd"为"bcde"
但是出错了,

请指点,谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
.486                              
    .model flat, stdcall               
    option casemap :none               
  
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc

    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

.data
    mystr db "abcd",0
.code
start:
    xor esi,esi
    mov ecx,4
    here:
    inc mystr[esi]
    inc esi
    loop here
    invoke MessageBox,NULL,addr mystr,NULL,MB_OK
    invoke ExitProcess,NULL      
end start
2006-6-17 14:11
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
表面上看你的程序并没有错....上面版主给是正确的...但我还是找了下你错的原因...我想是.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....这样就引发了异常了...... 不知道你们怎么看...
2006-6-17 17:03
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
忘了一点...LOOP也有问题...了32格式测试的是ECX不是是为0....如果你只将ESI高字清0..如果不将ECX高字清0 ,那循环就不只是4次了....那就不定了..可能是几万次....
2006-6-17 17:22
0
雪    币: 221
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
5
非常感谢两位的解答~~~~~~~~
2006-6-18 12:39
0
游客
登录 | 注册 方可回帖
返回
//