- 探索取值符号&
C语言代码如下:
main()
{
char aa = 'a';
char * paa =&aa;
}
上边C代码对应的逻辑,用汇编实现如下:
data segment
a db '123',0
ppa dw OFFSET a
data ends
将C语言代码经过编译后,得到如下代码:
分别画出了C和其汇编对应的关系。可以看到,char * paa = &aa;对应两条汇编指令。
- 编译器对C中字符串的处理
可以看出,局部变量的字符串存放在数据段中; - 汇编和C中int和char的本质区别
汇编语言:
data segment
a db '12345',0
arr dw 1,2,3,4,5
end segment
;访问字符串a中的字符
mov ax,ds:a[0]
mov ax,ds:a[1]
mov ax,ds:a[2]
;访问数组a中的元素
mov ax,ds:arr[0]
mov ax,ds:arr[2]
mov ax,ds:arr[4]
汇编语言有明显的db和dw区别,分别占1个字节和两个字节。
对应的C语言的char和Int数组如下:
可以看到Int数组在内存中的存放方式与汇编一样。char和int类型的地址同时+1,其实是编译器对他们做了区分,int型变量+1,对应内存中后移2个字节的内存;char 型加1,对应内存后移一个字节。编译器就是根据变量前边的类型做到如何区分的。
可以看到,parr指向了数组的首地址。
- 一道char指针转为int指针的练习(加深了对变量转换的理解)
上边这个练习题就很好地说明了,Int+1和char+1的区别。 - 练习
首先,可以看到编译器并没有给pa分配内存,直接用偏移地址寄存器si保存了[BP-2]的地址,也就是’a’的地址;然后,再将si的值放入al单字节寄存器中;最后,再将al中的值‘a’赋值给b,对应char b = *pa。 - 练习(汇编书上的代码)
解释:*(char )0x2000 = ‘a’;
第1个表示要访问的是一个内存空间;
(char ), 表示后边的数值0x2000是一个内存空间地址,char表示这个地址是存储char型数据的内存空间的地址。
这个机制确实也不奇怪,因为局部变量在没有指明的情况下存放在栈中,而上边这行代码指明了存放的位置,就存放在了ds中。
通过上面的例子对指针有了进一步理解。