- [游客] 补充一下,还有可能在数据段中定义数组时超过了一个段长 07/22 16:20
- [infosecer] 受教了 07/17 00:16
- [游客] 顶一下。 05/06 19:00
- [maxm] 收藏了先 02/17 15:50
- [jcw2008] 谢谢,这对我很有用! 10/21 11:05
- [ding2843] 好文章。。。。。。。。。。。。。。。。。 07/01 16:39
- [ding2843] 好文章。。。。。。。。 07/01 16:22
- [starrynight] 一笑而过 管自己的水,让别人喝去吧 06/27 13:25
- [游客] "别理他"那可不行,不能让不实之言,任意泛滥。 知情人应该发言,不要让“谣言”有成长的空间。 06/27 12:55
- [yjll] 顶! 06/26 13:31
- [lonely200808] 你好!我的汇编语言的初学者,在论坛里看到你发言,想和你交个朋友,因为我才开始自学,要自考,有没有QQ 03/26 17:19
- [gecko] 接触到汇编语言是一年后的事情了。才知到有一种语言更低级。 这话有双关语的感觉..哈哈 11/21 19:42
- [lbhn] 我已修改了,这东西不注意还真不好找*-* 10/18 16:04
- [lbhn] 多谢了,对了问一下你的照片是怎么上传的?为什么我现在连自己的资料都不能修改了? 10/17 18:28
- [lbhn] 我第二天又做了一遍这次没出错,可能是V86运行程序不是很稳定,多谢你关注啊!! 10/15 16:22
- [lbhn] 你是在纯DOS下还是ms-dos窗口下?是自已的机子吗? 我这是在网吧里做的!! 10/13 13:50
[2007-11-28 15:36] 【请教】C中如何查看长指针的段地址?
如:
main(){
char far * ptr; /*定义一个长指针*/
ptr = (char far *)0x12345678;
printf("%x",ptr);/*打印指针*/
}
=================
看完留言后增加的内容
=================
main(){
char * p; /*短指针*/
char far * ptr; /*长指针*/
char huge * hp; /*巨指针*/
p ="abcd";
ptr = (char far *)0x1000ffff;
hp = (char huge *)ptr;
printf("%lx \n",ptr);
printf("%x:%x \n",p);
/*发现都是32位的*/
ptr++;
printf("%lx \n",ptr);
hp++;
printf("%lx \n",hp);
/*长指针和巨指针自增后的不同结果*/
getch();
}
然后,百度了一下:
FAR HUGE 指针是针对DOS平台的,为了跨越段的限制。在DOS下的指针默认是 near指针长度是 2字节 默认的段是数据段不能改变, 而如果我们要取得一个视频ROM中的数据时就需要 far指针 far指针长度是 4字节 2个字节指示段地址 2个字节指示偏移量或者huge指针 huge指针和far指针的最大不同是far指针在参加++运算时不会改变段地址,
如: p= 0x0080:0xffff; ++p的结果是 0x0080:0x0000
而huge指针的话则是 0x1080:0x0000
还有就是比较运算时huge指针会先做规格化再比较,而far指针不会,这样有可能导致两个相同地址的指针由于地址覆盖的原因导致 比较时不同. 而huge指针由于先规格化所以不会.
在WINDOWS下由于内存模式是平坦的. 指针都是4字节的,在4G的空间中可以任意指向. 所以没有特别意义.
[ 游客 发表于 2007-12-02 17:38 ]
可以用_asm 嵌入汇编把CS的值找出来,不过这就不是C语言的方法了~~~
[ dave 发表于 2007-12-02 18:12 ]
远指针不是让编译程序把程序数据段地址作为指针的段地址部分,
而是把指针的段地址与指针的偏移量直接存放在指针内。因此,远指针是由4 个字节构成。它可以指向内存中的任一目标,可以用于任一编译模式
[ cxn 发表于 2007-12-04 17:54 ]
这个简单 呵呵
printf("%x:%x",ptr);偏移地址:段地址
[ fishboy 发表于 2007-12-05 12:43 ]
to dave:
无论是怎么存放的,存放在哪,都必然应该有段地址的,既然偏移地址能打印出来,段地址必然也能找出来。
这才是我想问的。呵呵呵
to cxn:
原来如此啊!没想还有这样的使用,一个变量能用两个输出类型来用。
[ 游客 发表于 2007-12-05 12:49 ]
re to:fishboy
不系吧,平坦模式没有段地址和偏移啊,要说有的话,段地址就是00000000H,偏移就是它的实际地址~~
[ dave 发表于 2007-12-05 13:18 ]
找到了,FAR指针是32位的高16位是段地址存储在DX寄存器中的~~~低16位是偏移两存储在AX中的。
原理是这样,但怎么显示出来呢,用LX格式符就OK了~嘿嘿
#include<stdio.h>
#include<stdlib.h>
int main()
{
int far * ptr; /*定义一个长指针*/
ptr = (int far *)0x12345678;
printf("%lx",ptr);/*打印指针*/
system("pause");
return 0;
}
[ dave 发表于 2007-12-05 14:16 ]
far指针有个局限例如当ptr=1000:FFFF的时候AX=FFFF
DX=1000
PTR++后就相当于INC AX了结果就成了1000:0000,而不是2000:0000
这时候需要用huge指针,它是一个按照32位运算的,所以是存储在内存中的,这种指针1000:FFFF 自增后是2000:0000,避免了far指针的问题,但是他的运算模式却决定了它的效率很低的
[ dave 发表于 2007-12-06 12:25 ]
PS:只有在far指针返回的时候是段放在DX,偏移放在AX,平时内存存放的时候高位内存放高位值,低位内存放低位值,楼主可以用TC+TD(turbo c &turbo debug)来验证下
[ fishboy 发表于 2007-12-07 12:18 ]
dave提到的ptr++的处理,应该就是有没有进行按位加的问题吧。可能当定义成了巨指针,在进行自增操作的时候就会进行按位加了吧。
多谢dave老兄了。
[ wdm 发表于 2007-12-07 14:10 ]
对,dos下是16位机环境,所以出现了长、短指针的概念。而windows的保护模式下都是32位的,指针都是32位,好像不是按段寻址的原理了,所以,长、短的指针好像在这里就没有定义时的重大意义了。
呵呵
[ wdm 发表于 2007-12-07 14:13 ]
对了,博主转的【汇编剖析指针】这个文章挺不错,楼上楼下的可以看看,体会一下汇编语言知识的伟大内涵。
本人真是为自己曾经学习过一点汇编知识而庆幸啊。
[ 游客 发表于 2007-12-07 18:11 ]
恩。C中的指针是有点让人头晕。。继续研究中....
[ 游客 发表于 2007-12-13 15:08 ]
原来,指针还有长的短的,甚至还有巨指针,这是巨强啊!我的“巨”续学习撒...
[ 游客 发表于 2007-12-13 17:57 ]
路过,还没有学习C语言呢。有点天书!
[ 游客 发表于 2007-12-13 17:58 ]
楼上先把汇编搞一搞吧。磨刀不误砍柴工。
[ wdm 发表于 2007-12-13 18:01 ]
恩,我们还是从汇编做起,才能打好根基,在编程之路上才走的更远..更远..远.......
[ 游客 发表于 2007-12-13 18:09 ]
我顶啊!
[ Wednesday 发表于 2007-12-18 19:45 ]
很学习
[ cxn 发表于 2007-12-31 21:59 ]
更新了学习一下
[ 游客 发表于 2008-01-07 17:11 ]
终于对c语言这个指针问题有了明晰的了解了,谢谢楼主
[ zkkpkk 发表于 2008-01-18 20:59 ]
汇编和C必学