+ -
当前位置:首页 → 问答吧 → 关于32位汇编的指针问题

关于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是字节型变量。

求高人指点,正确的理解方式。

作者: 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的一些东西....

作者: xushipei2009   发布时间: 2011-07-25

LZ说:
在汇编指令中,用 PTR BYTE 代替了ptrB,如:ptrB PTR BYTE arrayB
所以觉得ptrB是字节型变量。
我说:
ptrB 是指向字节的指针,这个指针占四个字节.

作者: gsy999   发布时间: 2011-07-25

热门下载

更多