首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

有有关问题

2012-02-21 
有问题下面是打印所有256个中断向量的值,可有很多错误#includegeneral.h/*找不到头文件*/inti,j,kvoidf

有问题
下面是打印所有256个中断向量的值,可有很多错误
#include   <general.h>         /*找不到头文件*/
int   i,j,k;
        void   far   *l;           /*远指针?怎么理解?*/
        printf( "Interrupt   vectors\n\n ");
        for(i=0;i <64;++i)
        {
                for(j=0;j <4;++j)
                {
                        k=64*j+i;
                        l=MK_FP(0,4*k);                     /*这是什么函数?*/
                        printf( "%02x   %Fp ",k,*l);       /*格式符有问题吧!*/
                }
        }

[解决办法]
#include <dos.h>
unsigned FP_OFF(int far *long_pointer);
unsigned FP_SEG(void far *long_pointer);
函数名: MK_FP
功 能: 设置一个远指针
用 法: void far *MK_FP(unsigned seg, unsigned off);
程序例:


#include <dos.h>
#include <graphics.h>


int main(void)
{
int gd, gm, i;
unsigned int far *screen;


detectgraph(&gd, &gm);
if (gd == HERCMONO)
screen = MK_FP(0xB000, 0);
else
screen = MK_FP(0xB800, 0);
for (i=0; i <26; i++)
screen[i] = 0x0700 + ( 'a ' + i);
return 0;
}

[解决办法]
远指针不是让编译程序把程序数据段地址作为指针的段地址部分,而是把指针的段地址与指针的偏移量直接存放在指针内。因此,远指针是由4 个字节构成。它可以指向内存中的任一目标,可以用于任一编译模式,尽管仅在紧凑、大和巨模式下远指针才是缺省的数据指针。因为远指针的段地址在指针内,熟悉80X86 汇编语言的人都知道,这意味着每次使用远指针时都需要重新装载段寄存器,这显然会降低速度。应该注意:尽管远指针可以寻址内存中的任一单元,但它所寻址
的目标也不能超过64K 字节。这是因为,远指针在增量或减量之类的算术运算时,也只是偏移量部分参与运算,而段地址保持不变。因此当远指针增量或减量到超过64K字节段边界时就出错。此外,在进行指针比较时,far指针还会引起另外一些问题。far指针是由偏移量和段地址这样一对16位数来表示的,对于某一实际内存地址,far指针不是唯一的,
[解决办法]
/* general.h */
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define boolean int
#define TRUE 1
#define FALSE 0
#define BLANK ' '
#define CR 13
#define beep putchar( '\a ')
#define newline putchar( '\n ')
#define EMPTYSTR " "
#define FARNULL (void far *)NULL
#define INTA00 0x20
#define EOI 0x20
#define strempty(s) (*(s)==0)
boolean strequalsf(char *s,char *t,char **ps,char **pt);
boolean strequalsb(char *s,char *t,char **pm,char **pn);
#define strchrf strchr
char *strchrb(char *s,char *p,char c);
#define strpbrkf strpbrk
char *strstrf(char *s,char *t);
char *strstrb(char *s,char *t);
char *stralloc(char ch,unsigned N);
char *strsubst(char *s,char *a,char *b);
char *strltoa(long N,char *s,int radix);
char *strshrte(double x,char *s);
char *strultoe(unsigned long N);
char *strtomoney(double x,int code);
char *strtime(char *timestr,const struct tm *t,
boolean twentyfourhours,char separator);
char *strday(char *datestr,const struct tm *t,int format,
char separator);
#define leap(year) ((year)%4==0 && ((year)%100!=0 || (year)%400==0))


int dayofyear(int day,int month,int leapyear);
long gregorian(int day,int month,int year);
#define weekday(day,month,year) (gregorian(day,month,year)+5)%7
unsigned envseg(unsigned PSP);
char *progname(unsigned PSP);
void memrymap(void);
unsigned extmem(vid);
void ctryinfo(unsigned code,struct country *c);
void peep(void);
int retorisr(int N,char *id);
int rstorint(char *id);

[解决办法]
近指针是16位的指针,它只表示段内的偏移地址,因而只能对64k字节数据段内地址进行存取。
如 char near *p;
p=(char near *)0xffff;
远指针是32位指针,它表示段地址:偏移地址,如定义远程指针p指向B500段的2号地址,即B500:0002,则可写作:
char far *p;
p=(char far *)0xB5000002;
因此,远指针可以进行跨段寻址,可以访问整个内存的地址。
巨指针是32位的指针,它其实是规格化的指针,其实它与远指针就差在规格化上面,远指针没有规格化,这样如果两个指针实际上指向同一个物理地址,但是它们的段地址和偏移地址不一样的化,在远程指针看来,它们仍然是不一样的。如23B0:0004和23A1:00F4都指向同一个物理地址23604,但是如果进行指针比较的话,它们两个在远程指针看来是不一样的,但是在巨指针看来却是一样的。
如果想透彻地了解的话,建议看一下微机原理或是高级C里面的相关内容,这样帮助更大些。
[解决办法]
段地址和偏移量,需要把它们合并成一个远指针。宏MK_FP可以用来做这件事。
(void far *)MK_FP(unsgined segment,unsigned offset)
另外两个宏正好做相反的事情,它们从一个远指针中分解出段地址和偏移量。
(unsigned)FP_SEG(void far *p)
(unsigned)FP_OFF(void far *p)
[解决办法]
far * 就是远指针。

早期 16 位时代,
指针的 自然长度就是16位,但是地址是20位的,
指针不足以表示地址的所有信息(这个就是near指针,通常情况下是能够完成需要)。

所以,基于特殊情况,有了这个远指针,它是在16位时代的 32 位指针。
现在指针的自然长度就是 32 位,
所以,far 已经没有意义了。

热点排行