我正在使用与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 .
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_64汇编代码中的值是否为零.我知道这通常包含一个cmp变体后跟一个jmp变体,但我不确定使用的确切说明.
子进程在fork语句之后的最后一个停止的确切位置开始执行.如果语句包含多个fork(),如下所示的条件表达式,该怎么办?准确执行子进程的程序执行的位置.在担心创建了多少进程之前,我想知道创建的每个子进程是否都尝试评估fork() && fork() || fork();语句.如果是这样的话.由于第二个fork()语句而创建的子进程如何从第一个fork()中获取要评估的信息fork() && fork().
main(){
fork() && fork() || fork();
}
Run Code Online (Sandbox Code Playgroud) 似乎JS和JL都可以实现下面代码片段(var >= 0)中的比较,那么使用这两个来实现if/else有什么区别?
顺便说一句:他们检查的 EFLAGS 有点不同,所以我也想知道为什么不同的 EFLAGS 会针对类似的语句进行测试。
int var;
if (var >= 0)
{
...
}
else
{
...
}
Run Code Online (Sandbox Code Playgroud) 我想知道这个操作意味着什么?
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意义.
以下是做什么的?
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) 我正在使用 进行手动操作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?
我遵循了英特尔参考资料,根据以下内容:
问题是我做错了什么?