|
发表于 2012-3-9 09:37:03
|
显示全部楼层
同十楼。。写这种代码必定挨骂。
--接6楼。。举两款编译器的例子对照。
KeilC51:
测试C程序:
#include <reg52.h>
void main(void)
{
char a,b;
a=10;
b = (++a) + (++a) + (++a);
P1 = b;
}
disassembly:
Q0000: LJMP _Start ;0000 02 00 10
_Main: MOV R7,#0AH ;0003 7F 0A a=10
INC R7 ;0005 0F a++ a=0x0b
INC R7 ;0006 0F a++ a=0x0c
MOV A,#0CH ;0007 74 0C (A)=0x0c
ADD A,#0BH ;0009 24 0B (A)=0x0b +0x0c
INC R7 ;000B 0F a++ a=0x0d
ADD A,R7 ;000C 2F (A)=(A)+0x0d
MOV P1,A ;000D F5 90
RET ;000F 22
_Start: MOV R0,#7FH ;0010 78 7F
CLR A ;0012 E4
_Init: MOV @R0,A ;0013 F6
DJNZ R0,Q0013 ;0014 D8 FD
MOV SP,#07H ;0016 75 81 07
LJMP _Main ;0019 02 00 03
结果是 b=0x0b+0x0c+0x0d=0x24 (36D)
TC2.0下测试。
测试C程序:
void main(void)
{
int a,b;
a=10;
b = (++a) + (++a) + (++a);
printf("%d\n",b);
}
disassbmly:
push si
push di ;保护寄存器
mov si, 0Ah ;a=10
inc si ;a++
inc si ;a++
inc si ;a++ a=0x0d
mov di, si ;(di)=0x0d
add di, si
add di, si ;b=0x0d +0x0d +0x0d =39d
push di
mov ax, 194h ;pointer -> "%d\n"
push ax ; format
call _printf
pop cx
pop cx
pop di
pop si
retn
这里的结果是39..
以后不要写这种不利于移植的代码。Over! |
|