相关疑难解决方法(0)

确定寄存器的值是否等于零的最简单方法是什么?

我正在使用与Irvine库的x86程序集.

检查寄存器值是否等于零的最简单方法是什么?

我使用cmp指令,但我正在寻找替代方法.这是我使用cmp指令的代码,寄存器是ebx

    cmp ebx,0
    je equ1
    mov ebx,0
    jmp cont
equ1:
    mov ebx,1
    jmp cont
cont:
    exit
Run Code Online (Sandbox Code Playgroud)

这个"booleanizes"一个值,int ebx = !!ebx在C中产生0或1 .

x86 assembly micro-optimization

6
推荐指数
1
解决办法
4378
查看次数

这个汇编代码有什么作用?(TEST,XOR,JNZ)

1.

TEST EAX,EAX
JNZ SHORT program.00407190
Run Code Online (Sandbox Code Playgroud)

2.

XOR EAX,EAX
JNZ SHORT program.00407190
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我.谢谢!:)

根据我的理解到目前为止:

JNZ如果不等于零则跳跃,它将跳转或不跳,取决于是否ZF设置为1.如果是1,它就不会跳跃.否则,它会跳跃.

根据我对代码#1的理解,TEST EAX,EAX将检查它是否为零.如果它不等于零(ZF为0),它将跳转到地址00407190.

对于代码#2,
XOR EAX,EAX将EAX寄存器设置为0.是否设置了任何标志?如果没有,JNZ指令如何确定跳转?

最后,人们为什么要检查是否EAX为0?请帮助我更简单详细的解释,我还是初学者.

x86 assembly reverse-engineering

5
推荐指数
1
解决办法
8062
查看次数

如何在x86_64汇编中检查寄存器是否为零

我正在尝试检查x86_64汇编代码中的值是否为零.我知道这通常包含一个cmp变体后跟一个jmp变体,但我不确定使用的确切说明.

assembly x86-64

3
推荐指数
2
解决办法
2万
查看次数

多个fork()的语句

子进程在fork语句之后的最后一个停止的确切位置开始执行.如果语句包含多个fork(),如下所示的条件表达式,该怎么办?准确执行子进程的程序执行的位置.在担心创建了多少进程之前,我想知道创建的每个子进程是否都尝试评估fork() && fork() || fork();语句.如果是这样的话.由于第二个fork()语句而创建的子进程如何从第一个fork()中获取要评估的信息fork() && fork().

main(){
fork() && fork() || fork();
}
Run Code Online (Sandbox Code Playgroud)

c fork

2
推荐指数
1
解决办法
1370
查看次数

JS 和 JL x86 指令的区别

似乎JS和JL都可以实现下面代码片段(var >= 0)中的比较,那么使用这两个来实现if/else有什么区别?

顺便说一句:他们检查的 EFLAGS 有点不同,所以我也想知道为什么不同的 EFLAGS 会针对类似的语句进行测试。

int var;
if (var >= 0)
{
...
}
else
{
...
}
Run Code Online (Sandbox Code Playgroud)

x86 assembly

2
推荐指数
1
解决办法
693
查看次数

装配测试说明

我想知道这个操作意味着什么?

Test EDX, 200
Run Code Online (Sandbox Code Playgroud)

DWORD有价值EDX:

1A1B1C00
Run Code Online (Sandbox Code Playgroud)

当我做test EDX, 200 ,然后a JE,跳跃.为什么?EDX不等于200.

我想更多地了解Test EDX, 200意义.

x86 assembly

1
推荐指数
1
解决办法
1万
查看次数

汇编testq和cmovg指令

以下是做什么的?

testq   %rdx, %rdx
cmovg   %rcx, %rax
Run Code Online (Sandbox Code Playgroud)

我知道testq是两个寄存器之间的按位,但它如何与标志一起工作?这将在c中转化为什么?例如,如果%rdx将持有价值0x01,那么我们就会有0x01&0x01= 0x01,这将设置

ZF = 0, SF = 0, OF = 0.
Run Code Online (Sandbox Code Playgroud)

而且,如果我能找到cmovg

˜(SF ˆ OF) & ˜ZF
Run Code Online (Sandbox Code Playgroud)

哪个会解决

˜(0 ˆ 0) & ˜0 = ˜(0) & ˜0 = 1 & 1 = 1.
Run Code Online (Sandbox Code Playgroud)

这是否意味着将执行cmovg并且相应的c代码将表现为d = %rdx,a = rax并且c = rcx:

 if(d > 0){
   a = c;
 }
Run Code Online (Sandbox Code Playgroud)

或者有人可以换句话说这个吗?

另外,我一直在尝试使用这个程序集将其转换为相应的c代码.目前我得到的结果最终像testq%rdx上的无限while循环,%rdx与jne .L4.随着上面的内容被封闭.谁知道正确的解决方案是什么?我目前的解决方案是:

p:
        movq    (%rdi), %rdx
        testq   %rdx, %rdx
        je …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly x86-64 intel

1
推荐指数
1
解决办法
3455
查看次数

intel 汇编 TEST PF 标志操作

我正在使用 进行手动操作TEST (Parity flag operation),问题是我无法获得正确的结果,请考虑以下因素:

ax = 256 = 0000 0001 0000 0000

所以如果我这样做:

test ah, 0x44

标志PF操作应该是:

0000 0000 = 0000 0001 & 0100 0100

PF = 0000 0000 XNOR 0000 0000

PF = 1111 1111

我遵循了英特尔参考资料,根据以下内容:

在此输入图像描述

问题是我做错了什么?

assembly flags operation parity

1
推荐指数
1
解决办法
868
查看次数