雪绒★~花飘 发表于 2013-1-5 12:24:02

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


问下代码中的.if   ebx和if!ebx是什么意思啊???

メ㊣逆ご帅☆ 发表于 2013-1-5 12:24:03

雪绒★~花飘 发表于 2013-1-5 18:30 static/image/common/back.gif
那jne就是zf 位为1就跳转,为0就不跳转吗?

你可能看错了哦
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就跳)

huise865 发表于 2013-1-5 12:31:50

win32貌似不懂,第一句应该是判断ebx是否为真 非0则为真,第二句应该是非0则为假,我是猜的,别当真啊:lol

s0512 发表于 2013-1-5 12:33:33

本帖最后由 s0512 于 2013-1-5 12:46 编辑

路过。。。学习!

メ㊣逆ご帅☆ 发表于 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为真

雪绒★~花飘 发表于 2013-1-5 13:30:27

メ㊣逆ご帅☆ 发表于 2013-1-5 12:43 static/image/common/back.gif
.if ebx
如果EBX不为0时
.if !ebx


那里面判断真假是靠ebx本身的值来判断的吗???

代码不好写 发表于 2013-1-5 13:31:24

这是win32 汇编吗?学习了。

雪绒★~花飘 发表于 2013-1-5 13:33:41

代码不好写 发表于 2013-1-5 13:31 static/image/common/back.gif
这是win32 汇编吗?学习了。

是win32的............................

メ㊣逆ご帅☆ 发表于 2013-1-5 14:49:59

本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 15:07 编辑

雪绒★~花飘 发表于 2013-1-5 13:30 http://bbs.fishc.com/static/image/common/back.gif
那里面判断真假是靠ebx本身的值来判断的吗???

是的。

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

雪绒★~花飘 发表于 2013-1-5 15:52:21


图中是上段代码的反汇编里面的or   ebx,ebx和.if   ebx,    .if!ebx有关系吗???

雪绒★~花飘 发表于 2013-1-5 15:55:07

メ㊣逆ご帅☆ 发表于 2013-1-5 14:49 static/image/common/back.gif
是的。

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


这个是上面代码的反汇编里面的   or    ebx,ebx   和代码中的.if       ebx 有关系吗??

メ㊣逆ご帅☆ 发表于 2013-1-5 16:27:21

本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 17:38 编辑

回答错误,重新编辑

bigfatcat 发表于 2013-1-5 16:29:26

メ㊣逆ご帅☆ 发表于 2013-1-5 16:27 static/image/common/back.gif
or ebx ,ebx对应的就是.if !ebx的判断
加上后面je跳,对应的就是.continue
也就是or 操作后je判断是否为0 ...

我感觉也是,一般判断是否执行了xor ebx,ebx

メ㊣逆ご帅☆ 发表于 2013-1-5 17:01:03

本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 17:07 编辑

雪绒★~花飘 发表于 2013-1-5 15:55 static/image/common/back.gif
这个是上面代码的反汇编里面的   or    ebx,ebx   和代码中的.if       ebx 有关系吗??
说实话,这段代码怎么对应怎么奇怪,我再看看

メ㊣逆ご帅☆ 发表于 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,程序直接结束

雪绒★~花飘 发表于 2013-1-5 17:47:51

bigfatcat 发表于 2013-1-5 16:29 static/image/common/back.gif
我感觉也是,一般判断是否执行了xor ebx,ebx

or   ebx ,   ebx执行过后出现了je的跳转,je 指令从哪里知道该不该跳转的呢??

メ㊣逆ご帅☆ 发表于 2013-1-5 17:50:27

本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 17:59 编辑

雪绒★~花飘 发表于 2013-1-5 17:47 http://bbs.fishc.com/static/image/common/back.gif
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

雪绒★~花飘 发表于 2013-1-5 18:00:23

メ㊣逆ご帅☆ 发表于 2013-1-5 17:47 static/image/common/back.gif
.while eax >1               
      mov esi,1               
      .continue               ...

额我没看不懂啊

メ㊣逆ご帅☆ 发表于 2013-1-5 18:21:51

雪绒★~花飘 发表于 2013-1-5 18:00 static/image/common/back.gif
额我没看不懂啊

你可能这方面经验比较少,以后你应该很轻松
那么我简单点讲哦,直接中文翻译好了
.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循环结束标志

雪绒★~花飘 发表于 2013-1-5 18:30:42

メ㊣逆ご帅☆ 发表于 2013-1-5 17:50 static/image/common/back.gif
ZF位为1时跳转

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


那jne就是zf 位为1就跳转,为0就不跳转吗?
页: [1] 2
查看完整版本: 关于win32汇编中条件判断语句的问题