源代码:
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代码)
答案 0 :(得分:1)
WW
test
指令的说明:
测试 - 逻辑比较
计算第一个操作数的逐位逻辑AND(源1操作数) 和第二个操作数(源2操作数)并设置SF,ZF和PF 状态标志根据结果。结果然后被丢弃。
在这种情况下,jne
与jnz
同义。该指令通常用于测试零值,因此您将看到如下内容:
testb %al, %al
jz somewhere
对于您的其他问题,您正在寻找的是GAS(Gnu汇编程序)语法,您可以在互联网上找到一个信息世界,但请查看Wikibooks链接。