首页
社区
课程
招聘
[旧帖] [己解决]菜鸟求助,简单汇编问题 0.00雪花
发表于: 2007-12-5 11:20 4329

[旧帖] [己解决]菜鸟求助,简单汇编问题 0.00雪花

2007-12-5 11:20
4329
这是自己写的一段小程序,本意是显示3次messagebox后结束。
但是实际效果是个死循环。messagebox一直弹不停。
想用od加载看看怎么回事,结果每次都只执行一次??

为什么正常运行和用od加载运行的效果会不一样呢?

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .386
    .model flat,stdcall
    option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include    windows.inc
include    user32.inc
includelib  user32.lib
include    kernel32.inc
includelib  kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .data

szCaption  db  'hi',0
szText    db  'hello!',0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    .code
start:
    xor  al,al
    mov  ecx,3
lab:    
    inc  al
    invoke  MessageBox,NULL,offset szText,offset szCaption,MB_OK
    jnz  exit                   ;这里不论是jz还是jnz都是死循环
    loop  lab
exit:    
    invoke  ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    end  start

这是自己写的一段小程序,本意是显示3次messagebox后结束。
但是实际效果是个死循环。messagebox一直弹不停。
想用od加载看看怎么回事,结果每次都只执行一次??

为什么正常运行和用od加载运行的效果会不一样呢?

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
2
你对al累加首先就是有问题的。API一般都回用EAX标识返回值,你每次累加的AL是不确定的。而且你没有次数检测。
2007-12-5 14:35
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
loop 循环会检测ecx的值是否为0
invoke  MessageBox ...
会把 ecx的值改掉,所以要在 MessageBox  前 保存ecx

        push ecx
        invoke MessageBox,0,addr sBuf,0,MB_OK
        pop ecx
        loop lab
你说用OD 结果每次都只执行一次,这个就不明白了。
2007-12-5 15:52
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
多谢 xiaolz,push exc / pop ecx 后 果然只执行3次了。
但是用od加载还是只执行一次?郁闷。
2007-12-5 17:49
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
嗯,谢谢,这里没有用al,我是想比较在用ecx控制好,还是在al里累加,然后比较al是否等于3好。

有了刚才的经验,如果这里要用al比较的话,也要先 push al,然后pop 出来才可以。
2007-12-5 17:51
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
检查了一下。只执行一次是因为
start:
    xor  al,al
    mov  ecx,3
lab:   
    inc  al  ;这里会把 ZF 标志位置为0(结果不为0会置为0)
    invoke  MessageBox,NULL,offset szText,offset szCaption,MB_OK
    jnz  exit                   ;ZF=0 时跳转

如果不去掉 jnz exit 这句,因该不管是直接运行还是OD里运行都只是1次 MessageBox.
你的代码应该跟上面的不同。
2007-12-5 22:34
0
游客
登录 | 注册 方可回帖
返回
//