clang编译的代码中的jne规则

时间:2016-05-24 07:58:58

标签: objective-c xcode clang llvm

源代码:

int main(int argc, const char * argv[]) {

do {
    printf("heihei");
}while (1 < 2);

return 0;}

编译:

LBB0_1:                                 ## =>This Inner Loop Header: Depth=1
leaq    L_.str(%rip), %rdi
movb    $0, %al
callq   _printf
movl    %eax, -20(%rbp)         ## 4-byte Spill

movb    $1, %al
testb   $1, %al
jne LBB0_1
jmp LBB0_3
LBB0_3:

显然,这个do-while循环是无限的。 根据我的知识,testb $ 1,%al会将ZF设置为1.由于jne仅在ZF为0时跳转(jne:跳转选项:~ZF),为什么流程会跳回到LBB0_1?

顺便说一下,您对学习Clang生成的汇编代码和所有其他相关内容的书籍有什么建议吗? (特别是来自objective-c代码)

1 个答案:

答案 0 :(得分:1)

WW

test指令的说明:

  

测试 - 逻辑比较

     

计算第一个操作数的逐位逻辑AND(源1操作数)   和第二个操作数(源2操作数)并设置SF,ZF和PF   状态标志根据结果。结果然后被丢弃。

在这种情况下,jnejnz同义。该指令通常用于测试零值,因此您将看到如下内容:

testb   %al, %al
jz      somewhere

对于您的其他问题,您正在寻找的是GAS(Gnu汇编程序)语法,您可以在互联网上找到一个信息世界,但请查看Wikibooks链接。