关于32位汇编的指针问题
时间:2011-07-25
来源:互联网
看Intel程序设计到指针这一节,所给出的直接定义指针的例子能理解,如:
arrayB BYTE 10H,20H,30H,40H
ptrB DWORD arrayB
ptr就是一个指针类型变量,内容是arrayB数组的起始地址,占四个字节。
后又给出了一个用TYPDEF操作符声明指针类型的例子,如:
PBYTE TYPEDEF PTR BYTE
.data
arrayB BYTE 10H,20H,30H,40H
ptrB PBYTE arrayB
ptrB存放arrayB的地址,这点毋容置疑,但是ptrB是不是也占四个字节呢?根据推测(32位程序的地址应用四个字节表示)是这样,但ptrB的声明使人看起来好像只占一个字节,于是验证了下:(list文件结果)
地址-----机器指令-- 汇编指令
00000015 00000000 R ptrB PBYTE arrayB
00000019 00000003 R ptrW PWORD arrayW
0000001D 00000009 R ptrD PDWORD arrayD
从编译的结果可以看到一个指针占四个字节,推测正确,问题出在对TYPEDEF声明指针类型的理解上,我是这样理解的:
在汇编指令中,用 PTR BYTE 代替了ptrB,如:ptrB PTR BYTE arrayB
所以觉得ptrB是字节型变量。
求高人指点,正确的理解方式。
arrayB BYTE 10H,20H,30H,40H
ptrB DWORD arrayB
ptr就是一个指针类型变量,内容是arrayB数组的起始地址,占四个字节。
后又给出了一个用TYPDEF操作符声明指针类型的例子,如:
PBYTE TYPEDEF PTR BYTE
.data
arrayB BYTE 10H,20H,30H,40H
ptrB PBYTE arrayB
ptrB存放arrayB的地址,这点毋容置疑,但是ptrB是不是也占四个字节呢?根据推测(32位程序的地址应用四个字节表示)是这样,但ptrB的声明使人看起来好像只占一个字节,于是验证了下:(list文件结果)
地址-----机器指令-- 汇编指令
00000015 00000000 R ptrB PBYTE arrayB
00000019 00000003 R ptrW PWORD arrayW
0000001D 00000009 R ptrD PDWORD arrayD
从编译的结果可以看到一个指针占四个字节,推测正确,问题出在对TYPEDEF声明指针类型的理解上,我是这样理解的:
在汇编指令中,用 PTR BYTE 代替了ptrB,如:ptrB PTR BYTE arrayB
所以觉得ptrB是字节型变量。
求高人指点,正确的理解方式。
作者: xushipei2009 发布时间: 2011-07-25
ptrB 是指向字节的指针,这个指针占四个字节.
指针指向字节也好、指向字也好,还是指向一个struct,对于32位flat编程,指针所占内存都是四个字节大小,与被指对象的大小没关系。不要弄混了。(指针里面不就是地址吗,呵呵)
多说一句,在C语言里,如果p是一个指向双字的指针,如果起始时p的值(不是说p的地址)是4,那么p=p+1 之后,p的值不是5,而是8,也就是说,指针的加减(没有乘除)有放大因子,这个放大因子就是它指向的那个变量的尺寸。
供参考,不保证是正解。
作者: gsy999 发布时间: 2011-07-25
引用 1 楼 gsy999 的回复:
ptrB 是指向字节的指针,这个指针占四个字节.
指针指向字节也好、指向字也好,还是指向一个struct,对于32位flat编程,指针所占内存都是四个字节大小,与被指对象的大小没关系。不要弄混了。(指针里面不就是地址吗,呵呵)
多说一句,在C语言里,如果p是一个指向双字的指针,如果起始时p的值(不是说p的地址)是4,那么p=p+1 之后,p的值不是5,而是8,也就是说,指针的加减(没有乘除)有……
答非所问。。我想知道的是关于typedef的一些东西.... ptrB 是指向字节的指针,这个指针占四个字节.
指针指向字节也好、指向字也好,还是指向一个struct,对于32位flat编程,指针所占内存都是四个字节大小,与被指对象的大小没关系。不要弄混了。(指针里面不就是地址吗,呵呵)
多说一句,在C语言里,如果p是一个指向双字的指针,如果起始时p的值(不是说p的地址)是4,那么p=p+1 之后,p的值不是5,而是8,也就是说,指针的加减(没有乘除)有……
作者: xushipei2009 发布时间: 2011-07-25
LZ说:
在汇编指令中,用 PTR BYTE 代替了ptrB,如:ptrB PTR BYTE arrayB
所以觉得ptrB是字节型变量。
我说:
ptrB 是指向字节的指针,这个指针占四个字节.
在汇编指令中,用 PTR BYTE 代替了ptrB,如:ptrB PTR BYTE arrayB
所以觉得ptrB是字节型变量。
我说:
ptrB 是指向字节的指针,这个指针占四个字节.
作者: gsy999 发布时间: 2011-07-25
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28