微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用AND检查汇编语言中的条件?

如何解决如何使用AND检查汇编语言中的条件?

我正在尝试使用32位NASM检查汇编中的偶数,代码对于奇数有效,但对于偶数却可以输出

Even
Odd
Odd

我的代码

section .data
    even db "Even",0xa;
    odd db "Odd",0xa;
    lene equ $-even;
    leno equ $-odd;

section .text
    global _start;

_start:
    mov ax,0x4;
    and ax,1;
    jz evenn;
    jnz oddd;
    jmp outprog;

evenn:
    mov eax,4;
    mov ebx,1;
    mov ecx,even;
    mov edx,lene;
    int 0x80;

oddd:
    mov eax,odd;
    mov edx,leno;
    int 0x80;

outprog:
    mov eax,1;
    int 0x80;

解决方法

void fun ( int x )
{
   int y;
   y=x&1;
   if(y==0)
   {
     show_even();
   }
   else
   {
     show_odd();
   }
}

本质上就是您要尝试做的事情,并且朝着正确的方向开始,但是在show_odd或show_even之后,您需要采用单独的路径到达函数的结尾,您不想通过第二条路径

您的偶数路径正在通过此代码:

evenn:
    mov eax,4;
    mov ebx,1;
    mov ecx,even;
    mov edx,lene;
    int 0x80;

oddd:
    mov eax,odd;
    mov edx,leno;
    int 0x80;
打印偶数的

属于打印奇数的代码。您要在打印偶数后分支到outprog。

上面的C代码代替了此模型:

void fun ( int x )
{
   int y;
   y=x&1;
   if(y==0)
   {
     show_even();
   }
   show_odd();
}

无论什么情况,总是打印奇数。

您可以将其优化为一条指令。

jz evenn;
jnz oddd;
jmp outprog;

vs

jnz oddd;

仔细研究代码执行路径。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。