最近在看《Computer Systems--A Programmer‘s Perspective》觉得有关C语言指针转换部分很有意思,虽然以前常使用类型转化可是却不知道底层(编译器?)到底怎么做的,于是从汇编角度学习了一下。使用工具GNU gcc-4.4.5,vim-7.2 ,Ubuntu10.10
假如如下定义类型v和指针p,且使用类型转化:
src_t v;
dest_t *p;
*p = (dest_t)v;
假如sizeof(src_t) > sizeof(dest_t),那么直接截取src_t中的低字节给dest_t。例如从int a转化为char b,由于这些局部变量都会存在stack上,那么就会有如下代码:可以看到就是简单的截取大变量的低字节部分给小的变量。注意其中设计到寄存器间接寻址。
int main()
{
int a = 4;
char *b;
*b = (char)a;
}//gcc -S file.c
/*Assembly*/
movl $4,-4(