Tải bản đầy đủ (.pdf) (15 trang)

Bài giảng tin học đại cương C++ (chương 4)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (311.83 KB, 15 trang )

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nhng
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


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.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

36
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nhsau:

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();
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à


37
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ũ.

§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ó.Nhv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thvi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:

38
 int*ptr;
 ptr=0xB800;
*(ptr)=ch;
Đonchngtrìnhtrêncóvhplínhng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 D 0

B 0 7 D 0

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:Nhv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nhdùng
putch().Chngtrìnhktthúcghigõx

Chngtrình
42

39
#include<conio.h>
#include<stdio.h>
#definelength 2000
voidmain()
{
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nhm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;

40
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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nhsau:

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)
{

41
 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;
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;
}

42

Đ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nhsau:
 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lu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++)
 for(col=0;col<colmax;col++)

43
*(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;

44
}
 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++)
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()
{

45
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;
 }
}
 else
switch(ch)
 {
 casebkspc:if(length>0)
   del();
break;
 default:if(length<colmax)
insert(ch,attr);
 }
cursor();
}
}

voidcursor()
{
reg.h.ah=2;

46
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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

47
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
luđ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nhvytađánhđachđcfffffhhay1048576=1Mb.

2.Hailoichthcabvi
xlí: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 Mã Dliu
small near near
medium far near
compact near far
large 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.


48
§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p tnàytadùngcontrfar.Con trschtiđon0000,đach
offsetlà0410hvàđcbiudintrongClà00000410hay0x410.Tcha
danhmcthitbbaogm:
- bit0:
bng1nucóđĩamm
- bít1:khôngdùng
- bit2,3:RAMmchhthng00=16K;01=32K;11=64K
- bit 4, 5: kiu màn hình 01 màu(40 ct); 10 màu(80 ct); 11đn
s
c(80ct)
- bit6,7:sđĩa00mt;01hai;10ba;11bn
- bit8,9:cólpchípDMAhaykhông
- bit10,11:scngnitip
- bit12:cólpgameadaptorkhông

- bit13:cólpmáyinnitipkhông
- bit14,15:smáyinđangcó
Đ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;

49
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
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();
}


50

×