【问题标题】:How to use AND to check condition in Assembly language? [duplicate]如何使用 AND 来检查汇编语言中的条件? [复制]
【发布时间】:2020-12-18 08:54:07
【问题描述】:

我正在尝试检查汇编中的偶数奇数,使用 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, 4;
    mov ebx, 1;
    mov ecx, odd;
    mov edx, leno;
    int 0x80;

outprog:
    mov eax, 1;
    int 0x80;

【问题讨论】:

  • lene 是 9,所以 evenn 打印“偶数/奇数”。然后在evenn之后,没有跳转到outprog,所以它再次打印“Odd”。
  • @pri 我认为这应该是一个答案而不是评论。
  • start 中连续的三个分支表明您应该了解控制流的工作原理。所有三个都应该替换为一个:jnz oddd.
  • @luserdroog:是的,但幸运的是它已经是In NASM labels next to each other in memory are causing printing issues 上的答案,所以没有人需要在这里重复。
  • 感谢@prl 对控制流的澄清,我认为它们与主程序是分开的

标签: if-statement assembly x86 nasm


【解决方案1】:
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, 4;
    mov ebx, 1;
    mov ecx, odd;
    mov edx, leno;
    int 0x80;

打印偶数然后落入打印奇数的代码。您想在打印 Even 后分支到 outprog。

上面的 C 代码作为模型而不是这个:

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

无论如何总是打印奇数。

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

jz evenn;
jnz oddd;
jmp outprog;

jnz oddd;

思考代码执行路径。

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多