我正在尝试使用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;
答案 0 :(得分:0)
void fun ( int x )
{
int y;
y=x&1;
if(y==0)
{
show_even();
}
else
{
show_odd();
}
}
本质上就是您要尝试做的事情,并且朝着正确的方向开始,但是在show_odd或show_even之后,您需要采用单独的路径到达函数的结尾,您不想通过第二条路径< / p>
您的偶数路径正在通过此代码:
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。
上面的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;
仔细研究代码执行路径。