Giáo trình C++ - Chương 4: Bộ nhớ và hiển thị kí tự

Ch¬ng 4 : Bé nhí vµ hiÓn thÞ kÝ tù  
§1. Kh¸i niÖm chung  
Trong phÇn nµy ta sÏ xem xÐt viÖc xö lÝ hiÓn thÞ kÝ tù b»ng c¸ch x©m nhËp trùc tiÕp  
vµo bé nhí (direc memory access-DMA) . Ta sÏ t×m hiÓu c¸ch x©m nhËp trùc tiÕp mµn h×nh  
. C¸ch nµy nhanh h¬n lµ dïng c¸c hµm cña C .  
§2. C¸c to¸n tö bitwise  
1. To¸n tö bitwise and (&) : C dïng 6 to¸n tö bitwise ®îc tãm t¾t trong b¶ng sau  
PhÐp to¸n  
KÝ hiÖu  
and  
or  
&
|
xor  
^
dÞch ph¶i  
dÞch tr¸i  
®¶o  
>>  
<<  
~
C¸c phÐp to¸n nµy cã thÓ ¸p dông cho d÷ liÖu kiÓu int , char nhng kh«ng ¸p dông  
cho sè float .  
To¸n tö & (kh¸c víi and logic &&) cÇn hai to¸n h¹ng cã kiÓu gièng nhau . C¸c to¸n  
h¹ng nµy ®îc and bit víi bit . To¸n tö & thêng dïng kiÓm tra xem mét bit cô thÓ nµo ®ã  
cã trÞ lµ bao nhiªu . VÝ dô ®Ó kiÓm tra bit thø 3 cu¶ biÕn ch cã trÞ 1 hay 0 ta dïng phÐp to¸n :  
ch &0x08;  
2. To¸n tö or : To¸n tö or (kh¸c or logic | |) thêng dïng kÕt hîp c¸c bit tõ c¸c biÕn kh¸c  
nhau vµo mét biÕn duy nhÊt . VÝ dô ta cã hai biÕn lµ ch1 vµ ch2 vµ gi¶ sö c¸c bit tõ 0..3 cña  
ch1 chøa c¸c trÞ mong muèn cßn c¸c bit 4..7 cña ch2 chøa c¸c trÞ mong muèn . Khi viÕt :  
a = ch1|ch2;  
th× c¶ 8 bit cña a ®Òu chøa trÞ mong muèn .  
3. To¸n tö dÞch ph¶i >> : To¸n tö nµy lµm viÖc trªn mét biÕn duy nhÊt . To¸n tö nµy dÞch  
tõng bit trong to¸n h¹ng sang ph¶i . S« bit dÞch chuyÓn ®îc chØ ®Þnh trong sè ®i theo sau  
to¸n tö . ViÖc dÞch ph¶i mét bit ®ång nghÜa víi viÖc chia to¸n h¹ng cho 2 . VÝ dô : 0 1 1 1 0  
0 1 0 dÞch sang ph¶i 1 bit sÏ lµ  
0 0 1 1 1 0 0 1  
4. §æi tõ sè hex sang sè nhÞ ph©n : Ta dïng c¸c to¸n tö bitwise ®Ó ®æi mét sè tõ hÖ hex  
sang hÖ 2 . Ch¬ng tr×nh nhsau :  
Ch¬ng tr×nh 4-1 :  
#include <conio.h>  
#include <stdio.h>  
void main()  
{
int i,num,bit;  
unsigned int mask;  
char string[10],ch;  
clrscr();  
46  
do  
{
mask=0x8000;  
printf("\nBan cho mot so : ");  
scanf("%x",&num);  
printf("Dang nhi phan cua so %x la : ",num);  
for (i=0;i<16;i++)  
{
bit=(mask&num)? 1 : 0;  
printf("%d",bit);  
if (i==7)  
printf(" ");  
mask >>= 1;  
}
printf("\nBan muon tinh tiep khong(c/k)?");  
ch=getch();  
}
while (ch=='c');  
getch();  
}
Trong ch¬ng tr×nh trªn ta dïng vßng lÆp for ®Ó duyÖt qua 16 bit cña biÕn nguyªn tõ  
tr¸i qua ph¶i . Lâi cña vÊn ®Ò lµ c¸c ph¸t biÓu :  
bit = (mask&num)? 1 : 0;  
mask >>=1  
Trong ph¸t biÓu ®Çu tiªn mask lµ biÕn chØ cã mét bit 1 duy nhÊt ë phÝa tr¸i nhÊt . Mask nµy  
®îc & víi num ®Ó xem bit tr¸i nhÊt cña num cã lµ 1 hay lµ 0 . NÕu kÕt qu¶ kh¸c 0 (true) bit  
t¬ng øng cña num lµ 1 cßn ngîc l¹i bit t¬ng øng lµ 0 . Sau mçi lÇn & mask ®îc dÞch tr¸i  
1 bit ®Ó x¸c ®Þnh bit tiÕp theo cña num lµ 0 hay 1 .  
5. C¸c to¸n tö bitwise kh¸c :  
a. To¸n tö xor ^ : To¸n tö xor tr¶ vÒ trÞ 1 khi chØ cã 1 bit chø kh«ng ph¶i 2 bit cã trÞ  
lµ 1  
0 0 0  
0 1 1  
1 0 1  
1 1 0  
To¸n tö xor cÇn khi lËt bit nghÜa lµ ho¸n chuyÓn gi÷a 1 vµ 0 v× 1 xor víi 1 lµ 0 vµ 1 xor víi 0  
lµ 1 . VÝ dô ®Ó lËt bit thø 3 trong biÕn ch ta dïng :  
ch ^ 0x08  
b. To¸n tö dÞch ph¶i << : To¸n tö nµy t¬ng tù to¸n tö dÞch tr¸i . Gi¸ trÞ cña bit chÌn  
vµo bªn ph¶i lu«n lu«n b»ng 0 . DÞchph¶i t¬ng øng víi viÖc nh©n sè ®ã cho 2 .  
c. To¸n tö ®¶o : To¸n tö nµy lµ to¸n tö mét ng«i . Nã t¸c ®éng lªn c¸c bit cña to¸n  
h¹ng vµ ®¶o trÞ cña bit tõ 1 sang 0 vµ tõ 0 sang 1 . §¶o 2 lÇn mét sè ta l¹i nhËn ®îc sè cò .  
47  
§3. Bé nhí mµn h×nh  
1. Kh¸i niÖm chung : Mµn h×nh th«ng thêng cã 25 dßng vµ mçi dßng cã 80 kÝ tù . Nh−  
vËy toµn bé mµn h×nh cã 2000 kÝ tù . Mçi kÝ tù trªn mµn h×nh t¬ng øng víi mét ®Þa chØ cô  
thÓ trong bé nhí mµn h×nh . Mçi kÝ tù dïng 2 byte cña bé nhí nµy : byte thø nhÊt chøa m·  
ASCII cña kÝ tù (tõ 0 ®Õn 255 nay tõ 0 ®Õn ff)vµ byte thø 2 chøa thuéc tÝnh cña nã . NhvËy  
®Ó hiÓn thÞ 2000 kÝ tù , bé nhí mµn h×nh ph¶i cÇn 4000 byte . Bé nhí mµn h×nh ®¬n s¾c b¾t  
®Çu t¹i B000h vµ kÕt thóc t¹i B0F9F . NÕu ta cã mµn h×nh mµu th× vïng nhí cho chÕ ®é v¨n  
b¶n sÏ b¾t ®Çu tõ B8000h vµ kÕt thóc t¹i B8F9F . Khi muèn hiÓn thÞ kÝ tù trªn mµn h×nh ,  
®o¶n tr×nh thvÖn C sÏ gäi ®o¶n tr×nh ROM-BIOS ®Ó ®Æt kÝ tù cÇn hiÓn thÞ vµo ®Þa chØ t¬ng  
øng trong bé nhí nµm h×nh. NÕu muèn cã tèc ®é nhanh , h·y chÌn trùc tiÕp c¸c gi¸ trÞ trªn  
vµo vïng nhí mµn h×nh .  
2. Con trá far : Khi biÕt ®Þa chØ , c¸ch th«ng dông ®Ó ®a gi¸ trÞ vµo bé nhí lµ dïng con trá  
. Do vËy nÕu ta cÇn ®a kÝ tù vµo vÞ trÝ ®Çu tiªn cña vïng nhí mµn h×nh th× ta viÕt :  
int *ptr ;  
ptr = 0xB800;  
*(ptr)=ch;  
§o¹n ch¬ng tr×nh trªn cã vÎ hîp lÝ nhng l¹i kh«ng lµm viÖc v× biÕn con trá th«ng  
thêng cã hai byte trong khi ®Þa chØ B0000h l¹i dµi 5 ch÷ sè (2,5 byte) . LÝ do dÉn ®Õn t×nh  
tr¹ng nµy lµ do con trá thêng dïng ®Ó chøa ®¹i chØ n»m trong mét ®o¹n duy nhÊt mµ th«i .  
Trong hä 8086 , mét ®o¹n dµi 10000h hay 65535 byte . Bªn trong c¸c ®o¹n ®Þa ch¹y tõ 0h  
®Õn FFFFh . Th«ng thêng c¸c d÷ liÖu cña ch¬ng tr×nh C n»m trong mét ®o¹n nªn ®Ó th©m  
nhËp c¸c ®Þa chØ n»m ngoµi ®o¹n ta ph¶i dïng mét c¬ chÕ kh¸c . Bªn trong 8086 , t×nh tr¹ng  
nµy ®îc kh¾c phôc b»ng c¸ch dïng c¸c thanh ghi gäi lµ thanh ghi ®o¹n . C¸c ®Þa chØ n»m  
ngoµi ®o¹n ®cî t¹o lËp b»ng tæ hîp ®Þa chØ ®o¹n vµ ®Þa chØ offset .  
B
0
0
0
0
7
7
0
D
D
0
0
B
Trong h×nh trªn ®Þa chØ ®o¹n B000h ®îc dÞch tr¸i 4 bit råi céng víi ®Þa chØ offset 07D0 t¹o  
ra ®Þa chØ tuyÖt ®èi B07D0h.  
3. Dïng ®Þa chØ ®o¹n : offset trong C : NhvËy khi ®Þa chØ n»m bªn ngoµi ®o¹n d÷ liÖu , C  
dïng tæ hîp ®o¹n : offset vµ yªu cÇu d¹ng biÓu diÔn 32 bit(4 byte , 8 ch÷ sè hex) víi 4 ch÷  
sè cho ®Þa chØ ®o¹n vµ 4 ch÷ sè cho ®Þa chØ offset . Do vËy C coi ®Þa chØ tuyÖt ®èi B07D0 lµ  
0xB00007D0 (B000 vµ theo sau lµ 07D0) . Trong C con trá 32 ®îc tÝnh b»ng c¸ch dÞch ®Þa  
chØ ®o¹n sang tr¸i 16 bit vµ céng víi ®Þa chØ offset . Do con trá th«ng thêng kh«ng thÓ cÊt  
gi÷ ®Þa chØ dµi 32 bit nªn ta ph¶i dïng con trá far Con trá nµy cÊt gi÷ ®Þa chØ dµi 4 byte . V×  
vËy ch¬ng tr×nh sÏ lµ :  
int far *ptr ;  
ptr = 0xB8000000;  
*(ptr)=ch;  
4. Dïng mét kÝ tù ®Ó t« mµn h×nh : Chóng ta dïng con trá far ®Ó ghi lªn mµn h×nh 2000  
b¶n sao cña mét kÝ tù . §iÒu nµy t¬ng tù nhdïng putch() . Ch¬ng tr×nh kÕt thóc ghi gâ x  
Ch¬ng tr×nh 4-2 :  
#include <conio.h>  
48  
#include <stdio.h>  
#define length  
void main()  
{
2000  
int far *fptr;  
int add;  
char ch;  
clrscr();  
printf("Go vao mot ki tu , go lai de thay doi");  
fptr=(int far*)0xB8000000;  
while((ch=getche())!='x')  
for (add=0;add<length;add++)  
*(fptr+add)=ch|0x0700;  
}
Trong ch¬ng tr×nh ph¸t biÓu :  
*(fptr+add)=ch|0x0700;  
dïng ®Ó ®iÒn ®Çy kÝ tù lªn mµn h×nh . BiÕn ch lµ kÝ tù muèn ®Æt vµo bé nhí . H»ng sè  
0x0700 lµ byte thuéc tÝnh , cã nghÜa lµ kh«ng chíp nh¸y , kh«ng ®Ëm , ch÷ tr¾ng trªn nÒn  
®en .  
Ph¸t biÓu kh¸c cÇn gi¶i thÝch :  
fptr=(int far*)0xB8000000;  
Ta dïng dÊu ngoÆc v× h»ng 0xB8000000 vµ biÕn int far fptr cã kiÓu kh¸c nhau : h»ng cã vÎ  
lµ sè nguyªn dµi cßn fptr l¹i lµ con trá chØ ®Õn kiÓu int . Do ®ã ®Ó tr¸nh nh¾c nhë cña tr×nh  
biªn dÞch ta cÇn biÕn ®æi kiÓu lµm h»ng trë tthµnh con trá far chØ ®Õn int. Mµn h×nh cã thÓ  
®îc xem nhmét m¶ng hai chiÒu gåm c¸c hµng vµ cét . §Þa chØ t¬ng øng trong bé nhí  
®îc tÝnh tõ phÐp nh©n sè hiÖu hµng víi sè lîng cét trong mét hµng råi céng kÕt qu¶ vµ sè  
hiÖu cét víi ®Þa chØ b¾t ®Çu cña vïng nhí mµn h×nh . Ta cã ch¬ng tr×nh sau :  
Ch¬ng tr×nh 4-3 :  
#include <conio.h>  
#include <stdio.h>  
#define rowmax 25  
#define colmax 80  
void main()  
{
int far *fptr;  
int row,col;  
char ch;  
clrscr();  
printf("Go vao mot ki tu , go lai de thay doi");  
fptr=(int far*)0xB8000000;  
while((ch=getche())!='x')  
for (row=0;row<rowmax;row++)  
for (col=0;col<colmax;col++)  
*(fptr+row*colmax+col)=ch|0x0700;  
}
5.Tr×nh xö lÝ v¨n b¶n theo dßng: §Ó biÕt thªn vÒ sù tiÖn lîi cña con trá far ta xÐt thªm mét  
tr×nh xö lÝ v¨n b¶n theo dßng . Tr×nh xö lÝ nµy chØ lµm viÖc trªn mét dßng v¨n b¶n . Ta sÏ  
tiÕn hµnh theo 2 bíc : ®Çu tiªn lµ mét ch¬ng tr×nh cho phÐp ngêi dïng gâ vµo mét dßng  
49  
vµ di chuyÓn con nh¸y tíi lui . Cã thÓ xo¸ kÝ tù nhê di chuyÓn con nh¸y tíi ®ã vµ ghi ®Ì lªn  
nã . Ch¬ng tr×nh nhsau :  
Ch¬ng tr×nh 4-4 :  
#include <conio.h>  
#include <dos.h>  
#define colmax 80  
#define rarrow 77  
#define larrow 75  
#define video 0x10  
#define ctrlc '\x03'  
int col=0;  
int far *fptr;  
union REGS reg;  
void main()  
{
char ch;  
void clear(void);  
void cursor(void);  
void insert(char);  
fptr=(int far*)0xB8000000;  
clear();  
cursor();  
while((ch=getch())!=ctrlc)  
{
if (ch==0)  
{
ch=getch();  
switch (ch)  
{
case rarrow : if (col<colmax)  
++col;  
break;  
case larrow : if (col>0)  
--col;  
break;  
}
}
else  
if (col<colmax)  
insert(ch);  
cursor();  
}
}
void cursor()  
{
reg.h.ah=2;  
reg.h.dl=col;  
reg.h.dh=0;  
50  
reg.h.bh=0;  
int86(video,&reg,&reg);  
}
void insert(char ch)  
{
*(fptr+col)=ch|0x0700;  
++col;  
}
void clear()  
{
int j;  
for (j=0;j<2000;j++)  
*(fptr+j)=0x0700;  
}
§Ó xo¸ mµn h×nh ta ®iÒn sè 0 vµo vïng nhí mµn h×nh víi thuéc tÝnh 07 . Sau ®ã con  
nh¸y ®îc di chuyÓn vÒ ®Çu mµn h×nh nhê phôc vô Ên ®Þnh vÞ trÝ con nh¸y nhsau :  
ng¾t 10h  
ah=0;  
dh=sè hiÖu dßng  
dl= sè hiÖu cét  
bh=sè hiÖu trang , thêng lµ 0  
Ph¸t biÓu switch dïng ®Ó ®o¸n nhËn c¸c phÝm ®îc nhËn lµ phÝm thêng hay phÝm  
chøc n¨ng . PhÝm mòi tªn dïng t¨ng gi¶m col vµ gäi hµm cursor() ®Ó di chuyÓn con nh¸y tíi  
®ã . NÕu kÝ tù gâ vµo lµ kÝ tù thêng , nã ®îc chÌn vµo nhê hµm insert() .  
6. Byte thuéc tÝnh : Mét kÝ tù trªn mµn h×nh ®îc lu gi÷ bëi 2 byte : mét byte lµ m· cña kÝ  
tù vµ byte kia lµ thuéc tÝnh cña nã . Byte thuéc tÝnh ®îc chia lµm nhiÒu phÇn , bit nµo b»ng  
1 th× th× thuéc tÝnh t¬ng øng ®îc bËt . Bit thø 3 ®iÒu khiÓn ®é s¸ng cßn bit thø 7 ®iÒu  
khiÓn ®é chíp nh¸y . C¸c bit cßn l¹i lµ : 6 - thµnh phÇn ®á cña mµu nÒn ; 5 - thµnh phÇn  
green cña mµu nÒn ; 4 - thµnh phÇn blue cña mµu nÒn ; 2 - thµnh phÇn ®á cña mµu ch÷ ; 1 -  
thµnh phÇn green cña mµu ch÷ ; 0 - thµnh phÇn blue cña mµu ch÷ . Ta lËp mét ch¬ng tr×nh  
®Ó ®iÒn ®Çy mµn h×nh b»ng c¸c kÝ tù chíp nh¸y .  
Ch¬ng tr×nh 4-5 :  
#include <conio.h>  
#include <stdio.h>  
#define rowmax 25  
#define colmax 80  
void main()  
{
int far *fptr;  
int row,col;  
char ch;  
clrscr();  
printf("Go vao mot ki tu , go lai de thay doi");  
fptr=(int far*)0xB8000000;  
while((ch=getche())!='x')  
for (row=0;row<rowmax;row++)  
51  
for (col=0;col<colmax;col++)  
*(fptr+row*colmax+col)=ch|0x8700;  
}
§Ó bËt chíp nh¸y ta ®Ó bit thø 7 thµnh 1 , 3 bit mµu nÒn 0 , 1 vµ 2 ®îc ®Æt trÞ 1 nªn  
nÒn sÏ lµ ®en . Byte thuéc tÝnh lóc nµy lµ 10000111 = 87h.  
7. Ch¬ng tr×nh ®iÒn thuéc tÝnh : §Ó hiÓu s©u h¬n thuéc tÝnh cña kÝ tù ta xÐt ch¬ng tr×nh  
sau  
Ch¬ng tr×nh 4-6 :  
#include <conio.h>  
#include <stdio.h>  
#define rowmax 25  
#define colmax 80  
void main()  
{
int far *fptr;  
char ch,attr=0x07;  
void fill(char,char);  
clrscr();  
printf("Go n cho chu binh thuong,\n");  
printf("Go b cho chu xanh nuoc bien,\n");  
printf("Go i cho chu sang,\n");  
printf("Go c cho chu chop nhay,\n");  
printf("Go r cho chu dao mau\n");  
while((ch=getche())!='x')  
{
switch (ch)  
{
case 'n':attr=0x07;  
break;  
case 'b':attr=attr&0x88;  
attr=attr|0x01;  
break;  
case 'i':attr=attr^0x08;  
break;  
case 'c':attr=attr^0x80;  
break;  
case 'r':attr=attr&0x88;  
attr=attr|0x70;  
break;  
}
fill(ch,attr);  
}
}
void fill(char ch,char attr)  
{
int far *fptr;  
int row,col;  
fptr=(int far*)0xB8000000;  
for (row=0;row<rowmax;row++)  
52  
for (col=0;col<colmax;col++)  
*(fptr+row*colmax+col)=ch|attr<<8;  
}
Trong hµm fill() ta cã lÖnh  
*(fptr+row*colmax+col)=ch|attr<<8;  
v× attr lµ kÝ tù nªn ph¶i dÞch tr¸i 8 bit tríc khi kÕt hîp víi ch .  
8. Trë l¹i xö lÝ v¨n b¶n : B©y giê chóng ta ®· biÕt thuéc tÝnh cña kÝ tù vµ ta sÏ më réng  
ch¬ng tr×nh xö lÝ v¨n b¶n b»ng c¸ch thªm vµo viÖc chÌn vµ huû bá kÝ tù ,®æi mµu .  
Ch¬ng tr×nh 4-7 :  
#include <conio.h>  
#include <dos.h>  
#define colmax 80  
#define rarrow 77  
#define larrow 75  
#define video 0x10  
#define norm 0x07  
#define blue 0x01  
#define bkspc 8  
#define altu 22  
#define ctrlc '\x03'  
int col=0;  
int length=0;  
int far *fptr;  
union REGS reg;  
void main()  
{
char ch,attr=norm;  
void clear(void);  
void cursor(void);  
void insert(char,char);  
void del(void);  
fptr=(int far*)0xB8000000;  
clear();  
cursor();  
while((ch=getch())!=ctrlc)  
{
if (ch==0)  
{
ch=getch();  
switch (ch)  
{
case rarrow : if (col<length)  
++col;  
break;  
case larrow : if (col>0)  
--col;  
break;  
case altu : attr=(attr==norm)? blue:norm;  
}
53  
}
else  
switch (ch)  
{
case bkspc: if (length>0)  
del();  
break;  
default : if (length<colmax)  
insert(ch,attr);  
}
cursor();  
}
}
void cursor()  
{
reg.h.ah=2;  
reg.h.dl=col;  
reg.h.dh=0;  
reg.h.bh=0;  
int86(video,&reg,&reg);  
}
void insert(char ch,char attr)  
{
int i;  
for (i=length;i>col;i--)  
*(fptr+i)=*(fptr+i-1);  
*(fptr+col)=ch|attr<<8;  
++length;  
++col;  
}
void del()  
{
int i;  
for (i=col;i<=length;i++)  
*(fptr+i-1)=*(fptr+i);  
--length;  
--col;  
}
void clear()  
{
int j;  
for (j=0;j<2000;j++)  
*(fptr+j)=0x0700;  
}
Khi gâ tæ hîp phÝm Alt+U sÏ lËt biÕn attr qua l¹i gi÷a norm(thuéc tÝnh 07) vµ blue  
(cho ch÷ mµu xanh - thuéc tÝnh 01) . Hµm insert(0 cã vßng lÆp for dïng ®Ó th©m nhËp trùc  
54  
tiÕp bé nhí vµ con trá far ®Ó dÞch c¸c kÝ tù sang tr¸i khi cÇn chÌn . TiÕn tr×mh dÞch ph¶i b¾t  
®Çu tõ cuèi c©u ®Ó tr¸nh ghi ®Ì lªn .  
§4. C¸c kiÓu bé nhí trong C  
1. §Þa chØ ®o¹n vµ offset : Trong C kiÓu bé nhí lµ kh¸i niÖm ®Ó chØ vÒ lîng c¸c phÇn bé  
nhí kh¸c nhau mµ ch¬ng tr×nh cã thÓ chiÕm . C cho phÐp 6 kiÓu bé nhí lµ tiny , small ,  
compact , medium , large vµ huge . KiÓu bé nhí mÆc ®Þnh lµ small .  
Bé vi xö lÝ dïng c¸c thanh ghi 16 bit ®Ó ghi ®Þa chØ . Thanh ghi 16 bit lu ®îc ffffh  
byte hay 65536 hay 64 Kb ®Þa chØ . Vïng nhí cã kÝch thíc nµy gäi lµ ®o¹n . §Ó truy cËp  
®Þa chØ n»m ngoµi ®o¹n , bé vi xö lÝ ph¶i dïng hai thanh ghi lµ thanh ghi ®o¹n vµ thanh ghi  
offset . §Þa chØ thùc ®îc tÝnh b»ng c¸ch dÞch ®Þa chØ cña thanh ghi ®o¹n sang tr¸i 4 bit råi  
céng víi thanh ghi offset . Lµm nhvËy ta ®¸nh ®Þa chØ ®îc fffffh hay 1048576 = 1Mb .  
2. Hai lo¹i chØ thÞ cña bé vi xö : Bé vi xö lÝ dïng hai kÜ thuËt kh¸c nhau ®Ó tham chiÕu d÷  
liÖu trong bé nhí . NÕu vÞ trÝ cÇn tham chiÕu n»m trong ®o¹n 64Kb vµ ®o¹n nµy ®· ®îc chØ  
®Þnh trong thanh ghi ®o¹n th× bé vi xö lÝ chØ cÇn dïng mét lÖnh duy nhÊt ®Ó truy cËp d÷ liÖu .  
C¸ch nµy t¬ng øng víi viÖc dïng con trá near trong C vµ thùc hiÖn rÊt nhanh . Tr¸i l¹i nÕu  
bé vi xö lÝ cÇn tham chiÕu « nhí n»m ngoµi ®o¹n th× ®Çu tiªn nã ph¶i thay ®æi ®Þa chØ ®o¹n  
vµ sau ®oa lµ ®Þa chØ offset . §iÒu nµy t¬ng øng víi viÖc dïng con trá far trong C vµ thùc  
hiÖn kh¸ chËm .  
3. C¸c kiÓu Compact , small , medium vµ large : Cã 4 lo¹i chØ thÞ cña bé vi xö lÝ øng víi 4  
kiÓu bé nhí trong C  
KiÓu  
small  
medium far  
compact near  
large far  
M·  
near  
D÷ liÖu  
near  
near  
far  
far  
NÕu m· ch¬ng tr×nh n»m gän trong mét ®o¹n 64 K vµ m· d÷ liÖu n»m gän trong  
mét ®o¹n 64 K kh¸c th× kiÓu bé nhí small lµ thÝch hîp . NÕu m· ch¬ng tr×nh lín h¬n 64 K  
vµ m· d÷ liÖu n»m gän trong mét ®o¹n 64 K kh¸c th× h·y dïng kiÓu bé nhí medium. NÕu  
m· ch¬ng tr×nh nhá h¬n 64 K vµ m· d÷ liÖu lín h¬n 64 K th× h·y dïng kiÓu bé nhí  
compact. NÕu c¶ m· ch¬ng tr×nh vµ m· d÷ liÖu lín h¬n 64 K th× h·y dïng kiÓu bé nhí  
large .  
4. KiÓu tyni vµ kiÓu huge : KiÓu tyni ®îc dïng trong c¸c trêng hîp ®Æc biÖt víi lîng  
bé nhí cho c¶ m· ch¬ng tr×nh lÉn m· d÷ liÖu n»m gän trong mét ®o¹n . KiÓu nµy ®îc  
dïng ®Ó t¹o ra tËp tin d¹ng *.com . KiÓu huge ®îc dïng ch« mét môc d÷ liÖu (thêng lµ  
m¶ng ) mµ b¶n th©n nã lín h¬n 64K .  
§5. Tõ chøa danh môc thiÕt bÞ  
§©y lµ mét vïng bé nhí dµi 2 byte n»m trong vïng nhí thÊp cã ®Þa chØ tuyÖt ®èi lµ  
410h chøa th«ng tin vÒ thiÕt bÞ ®îc nèi víi m¸y tÝnh. §Ó truy cËo tõ nµy ta dïng con trá far  
. Con trá sÏ chØ tíi ®o¹n 0000 , ®Þa xhØ offset lµ 0410h vµ ®îc biÓu diÔn trong C lµ  
00000410 hay 0x410  
55  
15 14 13 12 11 10  
9
8
7
6
5
4
3
2 1 0  
cã  
æ ®Üa  
Sè m¸y in  
®ang cã  
Kh«ng  
Cã l¾p m¸y  
in nèi tiÕp  
Cã l¾p game  
adaptor  
dïng  
RAM m¹ch  
hÖ thèng  
00=16K  
01=32K  
11=64K  
Sè cæng nèi tiÕp  
Cã l¾p chÝp  
DMA  
KiÓu mµn h×nh  
01=mµu 40 cét  
Sè æ ®Üa  
10=mµu 80 cét  
00 = 1 æ  
01 = 2 æ  
10 = 3 æ  
11 = 4 æ  
11=®¬n s¾c 80 cét  
§Ó xem xÐt tõng bit vµ nhãm bit trong tõ nµy chóng ta sÏ dïng c¸c to¸n tö bitweise .  
Nãi chung ta sÏ dÞch tõ chøa danh môc thiÕt bÞ sang ph¶i vµ ®a c¸c bit cÇn quan t©m vµo  
phÝa ph¶i cña tõ vµ che c¸c bit kh«ng quan t©m ë ph¸i tr¸i b»ng to¸n tö and . Ngoµi tõ chøa  
danh môc thiÕt bÞ ta cã thÓ ®äc tõ chøa kÝch thíc bé nhí t¹i ®Þa chØ 413h .  
Ch¬ng tr×nh 4-8 :  
#define eqlist 0x410  
#define memsiz 0x413  
#include <conio.h>  
#include <stdio.h>  
void main()  
{
int far *fptr;  
unsigned int eq,data;  
clrscr();  
fptr=(int far *)eqlist;  
eq=*(fptr);  
data=eq>>14;  
printf("So may in la : %d\n",data);  
if (eq&0x2000)  
printf("Co may in noi tiep\n");  
data=(eq>>9)&7;  
printf("So cong noi tiep la :%d\n",data+1);  
if (eq&1)  
{
data=(eq>>6)&3;  
printf("So dia mem la :%d\n",data);  
}
else  
56  
printf("Khong co dia mem\n");  
data=(eq>>4)&3;  
switch (data)  
{
case 1: printf("Man hinh mau 40 cot\n");  
break;  
case 2: printf("Man hinh mau 80 cot\n");  
break;  
case 3: printf("Man hinh don sac 80 cot\n");  
}
fptr=(int far *)memsiz;  
printf("Dung luong bo nho :%dKbyte\n",*(fptr));  
getch();  
}
57  
pdf 12 trang Thùy Anh 27/04/2022 4120
Bạn đang xem tài liệu "Giáo trình C++ - Chương 4: Bộ nhớ và hiển thị kí tự", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_c_chuong_4_bo_nho_va_hien_thi_ki_tu.pdf