汇编语言_用汇编来理解C语言指针本质(2)

本文探讨了C语言中字符数组、指针操作在汇编中的表现,揭示了字符串和整数数组的内存分布差异。通过实例解析了char与int类型的地址计算规则,并深入剖析了字符指针转int指针的实践。涉及的知识点包括局部变量存储、数据段管理、不同类型在内存中的占用和编译器处理方式。
摘要由CSDN通过智能技术生成
  • 探索取值符号&
    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中。
    在这里插入图片描述
    在这里插入图片描述
    通过上面的例子对指针有了进一步理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值