我目前正在学习汇编语言,但是遇到了困难。
假设我有以下C代码:
for ( int i = 100; i > 0; i-- ) {
// Some code
}
现在我想用汇编语言做同样的事情。我尝试了这样做:
__asm__ ("movq $100, %rax;"
".loop:"
//Some code
"decq %rax;"
"cmpq $0, (%rax);"
"jnz .loop;"
);
编译并运行结果导致段错误。如果我删除cmpq
行,则不会发生段错误。但是,程序当然也无法终止。
因此,我的问题基本上是我在这里做错了什么?
asm
可能不是你想要的。也许你需要学习extended asm
。https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html。 - lllllllllli = 100; do { .. } while (--i);
,而不是for
。3)根本不需要cmp
,dec
指令也会设置零标志,因此decq %rax``jnz .loop
就足够了。“将不会终止”=其他问题4)内联汇编比普通汇编更难,可能需要先学习x86-64汇编基础知识,然后再转向C中的内联汇编5)使用一些教程+书籍,至少要理解您的语法(“gas”或“AT&T”),最重要的是指令参考指南。...这对我来说是一个“低投入”的问题。 - Ped7gfor
就是这个意思。:) 而且优化器会将其更改为do {} while
,因为它很聪明,而不是因为C源代码是这样编写的。我的意思是,我们可能在所有方面都达成了一致,只是我从不同的角度写了出来? - Ped7g