|
发表于 2003-9-29 19:43:59
|
显示全部楼层
这个确实有点怪,别的编译器我还没试过,用gcc -S xxx.c看一下汇编程序就比较清楚了
"i++"一般是:
- leal -4(%ebp), %eax //变量地址进eax
- incl (%eax) //增加内存中的值
复制代码
"=="一般是:
cmpl %edx, -4(%ebp)
用一个寄存器和一个内存中的值比较
在+的时候没问题,
象x = i++ + i++;
- movl -4(%ebp), %edx
- movl -4(%ebp), %eax //两个i进寄存器edx,eax
- leal (%eax,%edx), %eax //相加
- movl %eax, -8(%ebp) //相加的结果赋值给x
- leal -4(%ebp), %eax
- incl (%eax) //i++
- leal -4(%ebp), %eax
- incl (%eax) //i++
复制代码
gcc是先赋值后++,得到的值是i + i
但是比较的时候就有点问题,x = i == i++;
- movl -4(%ebp), %edx //i进edx
- leal -4(%ebp), %eax
- incl (%eax) //i++
- cmpl %edx, -4(%ebp) //比较(==)
- sete %al
- movzbl %al, %eax
- movl %eax, -8(%ebp) //赋值给x
复制代码
gcc是先++后比较,如果两边的变量不同就没问题,比如x = i++ == j++; gcc会把i和j先放到ecx和edx里,再用eax对内存中的值进行++,但是两边的变量相同就有问题。
总之,当i++出现在表达式中的时候,gcc一般是用一个寄存器保存i的当前值,用eax增加内存中的值,这都没什么问题,问题主要出现在比较的时候用寄存器中保存的值和内存中的值比较,而且incl (%eax)又在cmpl前面。
我昨天试了好多种情况,一般都没什么问题,赋值、函数调用都好着呢,就是当++和比较运算符一起的时候比较晕。我现在还不知道为什么这样。 |
|