CHNG4:BNHVÀHINTHKÍT §1.KHÁINIMCHUNG Trongphnnàytasxemxétvicxlíhinthkítbngcáchxâm nhptrctipvàobnh(direcmemoryaccessDMA).Tastìmhiucách xâmnhptrc tipmànhình.CáchnàynhanhhnlàdùngcáchàmcaC. §2.CÁCTOÁNTBITWISE 1.Toántbitwiseand(&):Cdùng6toántbitwiseđctómtttrong bngsau Phéptoán Kíhiu and & or | xor ^ dchphi >> dchtrái << đo ~ Cácphéptoánnàycóthápdngchodliukiuint,charnhng khôngápdngchosfloat. Toánt&(khácviandlogic&&)cnhaitoánhngcókiuging nhau.Cáctoánh ngnàyđcandbitvibit.Toánt&thngdùngkim traxemmtbitcthnàođócótrlàbaonhiêu.Vídđkimtrabitth3 cubinchcótr1hay0tadùngphéptoán: ch&0x08; 2.Toántor:Toántor(khácorlogic||)thngdùngkthpcácbitt cácbinkhácnhauvàomtbinduynht.Vídtacóhaibinlàch1vàch2 và giscácbitt0 3cach1chacáctrmongmuncòncácbit4 7ca ch2chacáctrmongmun.Khivit: a=ch1|ch2; thìc8bitcaađuchatrmongmu n. 3.Toántdchphi>>:Toántnàylàmvictrênmtbinduynht.Toán tnàydchtngbittrongtoánhngsangphi.Sbitdchchuynđcch đnhtrongsđ itheosautoánt.Vicdchphimtbitđngnghĩavivic chiatoánhngcho.Víd:01110010 dchsangphi1bitslà 001 11001 36 4. Đitshexsangsnhphân:Tadùngcáctoántbitwiseđđimt sthhexsangh2.Chngtrìnhnhsau: Chngtrình41 #include<conio.h> #include<stdio.h> voidmain() { inti,num,bit; unsignedintmask; charstring[10],ch; clrscr(); do { mask=0x8000; printf(\nBanchomotso:); scanf(%x,&num); printf(Dangnhiphancuaso%xla:,num); for(i=0;i<16;i++) { bit=(mask&num)?1:0; printf(%d,bit); if(i==7) printf(); mask>>=1; } printf(\nBanmuontinhtiepkhong(c/k)?); ch=getch(); } while(ch==c); getch(); } Trongchngtrìnhtrêntadùngvònglpforđduytqua16bitca binnguyênttráiquaphi.Lõicavnđlàcác phátbiu: bit=(mask&num)?1:0; mask>>=1 Trongphátbiuđutiênmasklàbinchcómtbit1duynhtphíatrái nht.Masknàyđc&vinumđxembittráinhtcanum cólà1haylà 37 0.Nuktqukhác0(true)bittngngcanumlà1cònngclibit tngnglà0.Saumiln&maskđcdchtrái1bitđxácđnhbittip theocanum là0hay1. 5.Cáctoántbitwisekhác: a. Toántxor^:Toántxortrvtr1khichcó1bitchkhông phi2bitcótrlà1 0 0 0 0 1 1 1 0 1 1 1 0 Toántxorcnkhiltbitnghĩalàhoánchuyngia1và0vì1xorvi1là 0và1xorvi0là1.Vídđltbitth3trongbinchtadùng: ch^0x08 b.Toántdchphi<<:Toántnàytngttoántdchtrái.Giátr cabitchènvàobênphiluônluônbng0.Dchphitngngvivic nhânsđ ócho2. c.Toántđo:Toántnàylàtoántmtngôi.Nótácđnglêncác bitcatoánhngvàđotrcabitt1sang0vàt0sang1.Đo2lnmt sta linhnđcscũ. §3.BNHMÀNHÌNH 1.Kháinimchung:Mànhìnhthôngthngcó25dòngvàmidòngcó80 kít. Nhvytoàn bmàn hìnhcó2000kít. Mi kíttrênmànhình tngngvimtđachcthtrongbnhmànhình.Mikítdùng2 bytecabnhnày:bytethnhtchamãASCIIcakít(t0đn255 nay t0đnff)vàbyteth2chathuctínhcanó.Nhvyđhinth 2000kít,bnhmànhìnhphicn4000byte.Bnhmànhìnhđnsc btđutiB000hvàkt thúctiB0F9F.Nutacómànhìnhmàuthìvùng nh chochđvănbn s btđutB8000h và ktthúcti B8F9F.Khi munhinthkíttrênmànhình,đontrìnhthvin Csgiđontrình ROMBIOSđđt kít cnhin thvàođachtngngtrongbnh nàmhình.Numuncótcđnhanh,hãychèntrctipcácgiátrtrênvào vùngnhmànhình. 2.Contrfar:Khibitđach,cáchthôngdngđđagiátrvàobnhlà dùngcontr.Dovynutacnđakítvàovtríđutiêncavùngnh mànhìnhthìtavi t: 38 int*ptr; ptr=0xB800; *(ptr)=ch; Đonchngtrìnhtrêncóvhplínhnglikhônglàmvicvìbin contrthôngthngcóhaibytetrongkhiđachB0000hlidài5chs (2,5 byte).Lídodnđntìnhtrngnàylàdocontrthngdùngđcha đichnmtrongmtđonduynhtmàthôi.Trongh8086,mtđondài 10000hhay65535byte.Bêntrongcácđo nđachyt0hđnFFFFh.Thông thngcácdliucachngtrìnhCnmtrongmtđonnênđthâm nhpcácđachnmngoàiđontaphidùngmtcchkhác.Bêntrong 8086,tìnhtrngnàyđckhcphcbngcáchdùngcácthanhghigilà thanhghiđon.Cácđachnmngoàiđonđctolpbngthpđa chđonvàđachoffset. B 0 0 0 0 7 D 0 B 0 7 D 0 TronghìnhtrênđachđonB000hđcdchtrái4bitricngviđach offset07D0torađachtuytđiB07D0h. 3.Dùngđachđon:offsettrongC:Nhvykhiđachn mbênngoài đondliu,Cdùngthpđon:offsetvàyêucudngbiudin32bit(4 byte,8chshex)vi4chschođachđonvà4chschođach offset.DovyCcoiđachtuytđiB07D0là0xB00007D0(B000vàtheo saulà07D0).TrongCcontr32đctínhbngcáchdchđachđonsang trái16bitvàcngviđachoffset.Docon trthôngthngkhôngthct giđachdài32bitnêntaphidùngcontrfar.Contrnàyctgiđa chdài4byte.Vìvychngtrìnhslà: intfar*ptr; ptr=0xB8000000; *(ptr)=ch; 4. Dùngmtkítđtômànhình:Chúngtadùngcontrfarđghi lênmànhình2000bnsaocamtkít.Điunàytngtnhdùng putch().Chngtrìnhktthúcghigõx Chngtrình 42 39 #include<conio.h> #include<stdio.h> #definelength 2000 voidmain() { intfar*fptr; intadd; charch; clrscr(); printf(Govaomotkitu,golaidethaydoi); fptr=(intfar*)0xB8000000; while((ch=getche())!=x) for(add=0;add<length;add++) *(fptr+add)=ch|0x0700; } Trongchngtrìnhphát biu: *(fptr+add)=ch|0x0700; dùngđđinđykítlênmànhình.Binchlàkítmunđtvàobnh. Hng s 0x0700 là byte thuc tính, có nghĩa là không chp nháy, không đm,chtrngtrên nnđen. Phátbiukháccngiithích: fptr=(intfar*)0xB8000000; Ta dùng du ngoc vì hng 0xB8000000 và bin int far fptr có kiu khác nhau:hngcóvlàsnguyêndàicònfptrlilàcontr chđnkiuint.Do đóđtránhnhcnhcatrìnhbiêndchtacnbinđikiulàmhngtr tthànhcontrfarchđnint.Mànhìnhcóthđcxemnhmtmnghai chiu gmcáchàngvàct.Đachtngngtrongbnhđctínht phépnhânshiuhàngvislngcttrongmthàngricngktqu vàshiuctviđa chbtđucavùngnhmànhình.Tacóchng trìnhsau: Chngtrình43 #include<conio.h> #include<stdio.h> #definerowmax25 #definecolmax80 voidmain() { intfar*fptr; introw,col; 40 charch; clrscr(); printf(Govaomotkitu,golaidethaydoi); fptr=(intfar*)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ìnhxlívănbntheodòng:Đbitthênvstinlic acontrfar taxétthêmmttrìnhxlívănbntheodòng.Trìnhxlínàychlàmvic trênmtdòngvănbn.Tastinhànhtheo2bc:đutiênlàmtchng trìnhchophépngidùnggõvàomtdòngvàdichuynconnháytilui. Cóthxoákítnhdichuynconnháytiđóvàghiđèlênnó.Chng trìnhnhsau: Chngtrình44 #include <conio.h> #include<dos.h> #definecolmax80 #definerarrow77 #definelarrow75 #definevideo0x10 #definectrlc\x03 intcol=0; intfar*fptr; unionREGSreg; voidmain() { charch; voidclear(void); voidcursor(void); voidinsert(char); fptr=(intfar*)0xB8000000; clear(); cursor(); while((ch=getch())!=ctrlc) { 41 if(ch==0) { ch=getch(); switch(ch) { caserarrow:if(col<colmax) ++col; break; caselarrow:if(col>0) col; break; } } else if(col<colmax) insert(ch); cursor(); } } voidcursor() { reg.h.ah=2; reg.h.dl=col; reg.h.dh=0; reg.h.bh=0; int86(video,®,®); } voidinsert(charch) { *(fptr+col)=ch|0x0700; ++col; } voidclear() { intj; for(j=0;j<2000;j++) *(fptr+j)=0x0700; } 42 Đxoámànhìnhtađins0vàovùngnhmànhìnhvithuctính 07.Sauđóconnháyđcdichuynvđumànhìnhnhphcvnđnh vtríconnháynhsau: ngt10h ah=0; dh=shiudòng dl=shiuct bh=shiutrang,thnglà0 Phát biu switch dùngđđoán nhn các phímđc nhn là phím thnghayphímchcnăng.Phímmũi têndùngtănggimcolvàgihàm cursor()đdichuynconnháytiđó.Nukítgõvàolàkítthng,nó đcchènvàonhhàminsert(). 6.Bytethuctính:Mtkíttrênmàn hìnhđclugibi2byte:mt bytelàmãcakítvàbytekialàthuctínhcanó.Bytethuctínhđc chialàmnhiuphn,bitnàobng1thìthìthuctínht ngngđcbt. Bitth3điukhinđsángcònbitth7điukhinđchpnháy.Cácbit cònlilà:6thànhphnđcamàunn;5thànhphngreencamàu nn;4thành phnbluecamàunn;2thànhphnđcamàuch;1 thànhphngreencamàuch;0thànhphnbluecamàuch.Talp mtchngtrìnhđđinđymànhình bngcáckítchpnháy. Chngtrình45 #include<conio.h> #include<stdio.h> #definerowmax25 #definecolmax80 voidmain() { intfar*fptr; introw,col; charch; clrscr(); printf(Govaomotkitu,golaidethaydoi); fptr=(intfar*)0xB8000000; while((ch=getche())!=x) for(row=0;row<rowmax;row++) for(col=0;col<colmax;col++) 43 *(fptr+row*colmax+col)=ch|0x8700; } Đbtchpnháytađbitth7thành1,3bitmàunn0,1và2đc đttr1nênnnslàđen.Bytethuctínhlúcnàylà10000111=87h. 7. Chngtrìnhđinthuctính:Đhiusâuhnthuctínhcakíttaxét chngtrìnhsau Chngtrình46 #include<conio.h> #include<stdio.h> #definerowmax25 #definecolmax80 voidmain() { intfar*fptr; charch,attr=0x07; voidfill(char,char); clrscr(); printf(Gonchochubinhthuong,\n); printf(Gobchochuxanhnuocbien,\n); printf(Goichochusang,\n); printf(Gocchochuchopnhay,\n); printf(Gorchochudaomau\n); while((ch=getche())!=x) { switch(ch) { casen:attr=0x07; break; caseb:attr=attr&0x88; attr=attr|0x01; break; casei:attr=attr^0x08; break; casec:attr=attr^0x80; break; caser:attr=attr&0x88; attr=attr|0x70; break; 44 } fill(ch,attr); } } voidfill(charch,charattr) { intfar*fptr; introw,col; fptr=(intfar*)0xB8000000; for(row=0;row<rowmax;row++) for(col=0;col<colmax;col++) *(fptr+row*colmax+col)=ch|attr<<8; } Tronghàmfill()tacólnh *(fptr+row*colmax+col)=ch|attr<<8; vìattrlàkítnênphidchtrái8bittr ckhikthpvich. 8.Trlixlívănbn:Bâygichúngtađãbitthuctínhcakítvàta smrngchngtrìnhxlívănbnbng cáchthêmvàovicchènvàhu bkít,đimàu. Chngtrình47 #include<conio.h> #include<dos.h> #definecolmax80 #definerarrow77 #definelarrow75 #definevideo0x10 #definenorm0x07 #defineblue0x01 #definebkspc8 #definealtu22 #definectrlc\x03 int col=0; intlength=0; intfar*fptr; unionREGSreg; voidmain() { 45 [...]... 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,... trái 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... 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 . printf(%d,bit); if(i==7) printf(); mask>>=1; } printf( Banmuontinhtiepkhong(c/k)?); ch=getch(); } while(ch==c); getch(); } Trongchngtrìnhtrêntadùngvònglpforđduytqua16bitca binnguyênttráiquaphi.Lõicavnđlàcác phátbiu: . KhigõthpphímAlt+Usltbinattrqualigianorm(thuctính 07)vàblue(chochmàuxanhthuctính01).Hàminsert(0cóvònglpfor dùngđthâmnhptrcti pbnhvàcontrfarđdchcáckítsangtrái khicnchèn.Tintrìmhdchphibtđutcuicâuđtránhghiđèlên. §4.CÁCKIUBNHTRONGC 1.Đachđonvà offset:TrongCkiubnhlàkháinimđchvlng cácphnbnhkhácnhaumàchngtrìnhcóthchim.Cchophép6 47 kiubnhlàtiny,small,compact,medium,largevàhuge.Kiubnh mcđnhlàsmall. Bvixlídùngcácthanhghi16bitđghiđach.Thanhghi16bit luđcffffhbytehay65536hay64Kbđa ch.Vùngnhcókíchthc nàygilàđon.Đtruycpđachnmngoàiđon,bvixlíphidùng haithanhghilàthanhghiđonvàthanhghioffset.Đachthcđctính b ngcáchdchđachcathanhghiđonsangtrái4bitricngvithanh ghioffset.Làmnhvytađánhđachđcfffffhhay1048576=1Mb. 2.Hailoichthcabvi xlí:Bvixlídùnghaikĩthutkhácnhauđ thamchiudliutrongbnh.Nuvtrícnthamchiunmtrongđon 64Kbvàđonnàyđãđcchđnhtrongthanhghiđo nthìbvixlích cndùngmtlnhduynhtđtruycpdliu.Cáchnàytngngvi vicdùngcontrneartrongCvàthchinrtnhanh.Tráilinu bvix lícnthamchiuônhnmngoàiđonthìđutiênnóphithayđiđa chđonvàsauđoalàđachoffset.Điunàytngngvivicdùngcon trfartrong Cvàthchinkháchm. 3.Cáckiucompact,small,mediumvàlarge:Có4loichthcabvix língvi4kiubnhtrongC Kiu. Numãchngtrìnhnmgntrongmtđon64Kvàmãdliu nmgntrongmtđon64Kkhácthìkiubnhsmalllàthíchhp.Nu mãchngtrình lnhn64Kvàmãdliunmgntrongmtđon64K khácthìhãydùngkiubnhmedium.Numãchngtrìnhnhhn64K vàmãdliulnhn 64Kthìhãydùngkiubnhcompact.Nucmã chngtrìnhvàmãdliulnhn64Kthìhãydùngkiubnhlarge. 4.Kiutynivàkiuhuge:Kiutyniđcdùngtrong cáctrnghpđc bitvilngbnhchocmãchngtrìnhlnmãdliunmgntrong mtđon. Kiu nàyđc dùngđto ra tp tin dng *.com. Ki u huge đcdùngchômtmcdliu(thnglàmng)màbnthânnólnhn 64K.