鱼C论坛

 找回密码
 立即注册
查看: 4766|回复: 20

关于win32汇编中条件判断语句的问题

[复制链接]
发表于 2013-1-5 12:24:02 | 显示全部楼层 |阅读模式
5鱼币
4%HWHLYRA}ZYB17ZA%BS49D.jpg
问下代码中的.if   ebx和if  !ebx是什么意思啊???

最佳答案

查看完整内容

你可能看错了哦 ZF位置1代表结果为0 ZF位置0代表结果为非0 jne也就是结果不等于0(非0)时跳转 也就是ZF为0时跳转 举个例子 cmp 1,1 结果为0 那么ZF置1 je会跳(结果为0时会跳) jne不会跳(-1,1,2,3。。。。只要结果非0就跳)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-1-5 12:24:03 | 显示全部楼层

你可能看错了哦
ZF位置1代表结果为0
ZF位置0代表结果为非0

jne也就是结果不等于0(非0)时跳转
也就是ZF为0时跳转
举个例子
cmp 1,1
结果为0
那么ZF置1
je会跳(结果为0时会跳)
jne不会跳(-1,1,2,3。。。。只要结果非0就跳)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 12:31:50 | 显示全部楼层
win32貌似不懂,第一句应该是判断ebx是否为真 非0则为真,第二句应该是非0则为假,我是猜的,别当真啊:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 12:33:33 | 显示全部楼层
本帖最后由 s0512 于 2013-1-5 12:46 编辑

路过。。。学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 12:43:18 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 15:07 编辑

.if ebx
如果EBX不为0时
.if !ebx
!取逻辑否,非零认为是真,零认为是假,
也就是
如果ebx=1那么
.if ebx为真
.if !ebx为假
(不为0的值都会这样)
\

如果ebx=0
那么.if ebx为假
.if !ebx为真
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-5 13:30:27 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-1-5 12:43
.if ebx
如果EBX不为0时
.if !ebx

那里面判断真假是靠ebx本身的值来判断的吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 13:31:24 | 显示全部楼层
这是win32 汇编吗?学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-5 13:33:41 | 显示全部楼层
代码不好写 发表于 2013-1-5 13:31
这是win32 汇编吗?学习了。

是win32的............................
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 14:49:59 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 15:07 编辑
雪绒★~花飘 发表于 2013-1-5 13:30
那里面判断真假是靠ebx本身的值来判断的吗???


是的。

抱歉不小心举例把EBX写成a了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-5 15:52:21 | 显示全部楼层
0Q($@FZY6CB@DZVKX$_ER4F.jpg
图中是上段代码的反汇编里面的or   ebx,ebx和.if     ebx,    .if  !ebx有关系吗???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-5 15:55:07 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-1-5 14:49
是的。

抱歉不小心举例把EBX写成a了

0Q($@FZY6CB@DZVKX$_ER4F.jpg
这个是上面代码的反汇编里面的   or    ebx,ebx     和代码中的.if       ebx 有关系吗??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 16:27:21 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 17:38 编辑

回答错误,重新编辑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 16:29:26 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-1-5 16:27
or ebx ,ebx对应的就是.if !ebx的判断
加上后面je跳,对应的就是.continue
也就是or 操作后je判断是否为0 ...

我感觉也是,一般判断是否执行了xor ebx,ebx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 17:01:03 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 17:07 编辑
雪绒★~花飘 发表于 2013-1-5 15:55
这个是上面代码的反汇编里面的   or    ebx,ebx     和代码中的.if       ebx 有关系吗??

说实话,这段代码怎么对应怎么奇怪,我再看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 17:47:06 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 18:19 编辑

  .while eax >1                 
        mov esi,1               
        .continue               
        mov esi,2
  .endw
  .repeat                        
        mov esi,1
        .break .if !ebx         
        .continue
        mov esi,2
.until eax > 1
.repeat
        mov esi,1
        .break
.untilcxz

我自己编译自己用IDA看了下反汇编代码
终于理清了
xt:00401000                 jmp     short loc_40100E;调至开头第一句
.text:00401000
.text:00401002 ; ---------------------------------------------------------------------------
.text:00401002
.text:00401002 loc_401002:                             ; CODE XREF: .text:00401011j
.text:00401002                 mov     esi, 1
.text:00401007                 jmp     short loc_40100E;.continue语句,跳出,略过这个循环,直接进行下一次循环
.text:00401007
.text:00401009 ; ---------------------------------------------------------------------------
.text:00401009                 mov     esi, 2;上面三句为while循环的内容
.text:00401009
.text:0040100E
.text:0040100E loc_40100E:                             ; CODE XREF: .text:startj
.text:0040100E                                         ; .text:00401007j
.text:0040100E                 cmp     eax, 1
.text:00401011                 ja      short loc_401002;上面两句判断eax是否大于1,则跳转至401002,对应.while eax>1
.text:00401011
.text:00401013
.text:00401013 loc_401013:                             ; CODE XREF: .text:00401026j
.text:00401013                 mov     esi, 1
.text:00401018                 or      ebx, ebx
.text:0040101A                 jz      short loc_401028;.break .if !ebx代表如果EBX为0,则跳出,
                                ;上面两句判断EBX是否为0,为0则直接跳出整个repeat循环
.text:0040101A
.text:0040101C                 jmp     short loc_401023;执行.continue语句,跳过这次循环,转向until循环判断
.text:0040101C
.text:0040101E ; ---------------------------------------------------------------------------
.text:0040101E                 mov     esi, 2
.text:0040101E
.text:00401023
.text:00401023 loc_401023:                             ; CODE XREF: .text:0040101Cj
.text:00401023                 cmp     eax, 1
.text:00401026                 jbe     short loc_401013;until循环判断
.text:00401026
.text:00401028
.text:00401028 loc_401028:                             ; CODE XREF: .text:0040101Aj
.text:00401028                 mov     esi, 1
.text:0040102D                 jmp     short near ptr byte_401031;.break,程序直接结束

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-5 17:47:51 | 显示全部楼层
bigfatcat 发表于 2013-1-5 16:29
我感觉也是,一般判断是否执行了xor ebx,ebx

or   ebx ,   ebx执行过后出现了je的跳转,je 指令从哪里知道该不该跳转的呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 17:50:27 | 显示全部楼层
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 17:59 编辑
雪绒★~花飘 发表于 2013-1-5 17:47
or   ebx ,   ebx执行过后出现了je的跳转,je 指令从哪里知道该不该跳转的呢??


ZF位为1时跳转

也就是逻辑运算结果为0时,ZF位会被置1
那么je就会跳转

举个例子吧
例如ebx=54的话
or ebx ,ebx
54的二进制为110110
or操作就是对应的两位如果其中一位为1,那么结果为1
          110110
          110110
结果:110110=54那么ZF置0

上面一位对应下面一位进行运算

如果ebx=0
or ebx
        00000000
        00000000
结果 00000000=0 那么ZF置1

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-5 18:00:23 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-1-5 17:47
.while eax >1                 
        mov esi,1               
        .continue               ...

额我没看不懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-1-5 18:21:51 | 显示全部楼层
雪绒★~花飘 发表于 2013-1-5 18:00
额我没看不懂啊

你可能这方面经验比较少,以后你应该很轻松
那么我简单点讲哦,直接中文翻译好了
  .while eax >1       ;当EAX>1时,条件成立,执行下面三条语句(下面三条语句就是while的循环内容)                    
        mov esi,1     ;不译           
        .continue     ;该语句功能就是跳至该循环的条件判断处,也就是.while eax>1那边进行判断           
        mov esi,2     ;不译
  .endw                      ;while语句结束标志,也就是代表一个WHILE循环内容的范围
  .repeat             ;无条件反复语句,无条件反复循环下面5条语句           
        mov esi,1     ;不译
        .break .if !ebx;条件跳出语句,此语句意思就是当ebx=0时,跳出整个repeat循环,跳至mov esi,1         
        .continue     ;跳至条件判断处,也就是跳到until eax>1处
        mov esi,2     ;不译
.until eax > 1        ;直到eax>1,也就是eax<=1时执行循环循环内容为下面三句,但是遇到.repeat又跳回去了
.repeat                      ;repeat语句结束标志
        mov esi,1     ;不译
        .break        ;直接跳至程序结束
.untilcxz             ;until循环结束标志

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-1-5 18:30:42 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-1-5 17:50
ZF位为1时跳转

也就是逻辑运算结果为0时,ZF位会被置1

那jne就是zf 位为1就跳转,为0就不跳转吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 00:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表