关于win32汇编中条件判断语句的问题
问下代码中的.if ebx和if!ebx是什么意思啊???
雪绒★~花飘 发表于 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就跳)
win32貌似不懂,第一句应该是判断ebx是否为真 非0则为真,第二句应该是非0则为假,我是猜的,别当真啊:lol 本帖最后由 s0512 于 2013-1-5 12:46 编辑
路过。。。学习!
本帖最后由 メ㊣逆ご帅☆ 于 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 12:43 static/image/common/back.gif
.if ebx
如果EBX不为0时
.if !ebx
那里面判断真假是靠ebx本身的值来判断的吗??? 这是win32 汇编吗?学习了。 代码不好写 发表于 2013-1-5 13:31 static/image/common/back.gif
这是win32 汇编吗?学习了。
是win32的............................ 本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 15:07 编辑
雪绒★~花飘 发表于 2013-1-5 13:30 http://bbs.fishc.com/static/image/common/back.gif
那里面判断真假是靠ebx本身的值来判断的吗???
是的。
。
抱歉不小心举例把EBX写成a了
图中是上段代码的反汇编里面的or ebx,ebx和.if ebx, .if!ebx有关系吗???
メ㊣逆ご帅☆ 发表于 2013-1-5 14:49 static/image/common/back.gif
是的。
。
抱歉不小心举例把EBX写成a了
这个是上面代码的反汇编里面的 or ebx,ebx 和代码中的.if ebx 有关系吗??
本帖最后由 メ㊣逆ご帅☆ 于 2013-1-5 17:38 编辑
回答错误,重新编辑
メ㊣逆ご帅☆ 发表于 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:07 编辑
雪绒★~花飘 发表于 2013-1-5 15:55 static/image/common/back.gif
这个是上面代码的反汇编里面的 or ebx,ebx 和代码中的.if ebx 有关系吗??
说实话,这段代码怎么对应怎么奇怪,我再看看 本帖最后由 メ㊣逆ご帅☆ 于 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,程序直接结束
bigfatcat 发表于 2013-1-5 16:29 static/image/common/back.gif
我感觉也是,一般判断是否执行了xor ebx,ebx
or ebx , ebx执行过后出现了je的跳转,je 指令从哪里知道该不该跳转的呢?? 本帖最后由 メ㊣逆ご帅☆ 于 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 17:47 static/image/common/back.gif
.while eax >1
mov esi,1
.continue ...
额我没看不懂啊 雪绒★~花飘 发表于 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 17:50 static/image/common/back.gif
ZF位为1时跳转
也就是逻辑运算结果为0时,ZF位会被置1
那jne就是zf 位为1就跳转,为0就不跳转吗?
页:
[1]
2