Giáo trình môn Cấu trúc máy tính
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình môn Cấu trúc máy tính", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- giao_trinh_mon_cau_truc_may_tinh.pdf
Nội dung text: Giáo trình môn Cấu trúc máy tính
- CHÖÔNG 1 CAÁU TRUÙC CUÛA MAÙY VI TÍNH IBM PC I. CAÙC THAØNH PHAÀN CUÛA MAÙY VI TÍNH : Maùy vi tính bao goàm : Khoái heä thoáng, maøn hình, baøn phím vaø caùc oå dóa. Khoái heä thoáng laø thaønh phaàn chính cuûa maùy tính noù ñieàu khieån toaøn boä hoaït ñoäng cuûa heä thoáng maùy tính. Maøn hình, baøn phím vaø caùc oå dóa goïi laø caùc thieát bò ngoaïi vi. Caùc thieát bò ngoaïi vi naøy ñöôïc noái vôùi khoái heä thoáng thoâng qua caùc maïch vaøo ra. * KHOÁI HEÄ THOÁNG : Khoái heä thoáng laø moät thuøng (case) trong ñoù chöùa baûng maïch chính goïi laø mainboard. Noù goàm caùc thaønh phaàn : - Boä vi xöû lyù (CPU) - Boä nhôù - Caùc maïch vaøo ra vaø caùc maïch hoå trôï cho CPU. Ngoaøi ra treân baûng maïch chính coøn chöùa caùc khe caém (slot) duøng ñeå gheùp theâm caùc vi maïch ñieàu khieån khaùc ví duï nhö sound card, card SCSI, card maïng, modem II. BOÄ VI XÖÛ LYÙ. 1. Giôùi thieäu toång quaùt: Ñaây laø boä naõo cuûa maùy tính, noù naèm treân baûn maïch heä thoáng. Boä xöû lyù coù khaû naêng thöïc hieän caùc leänh vieát baèng ngoân ngöõ maùy. Intel laø haõng saûn xuaát boä vi xöû lyù ñaàu tieân vaø laø haõng coù boä vi xöû lyù khaù phong phuù. Traûi qua nhieàu theá heä maùy tính, caùc boä vi xöû lyù cuûa haõng naøy döôïc phaùt trieån theo caùc giai ñoaïn chính sau : 1. Boä vi xöû lyù 8 bit (CPU 8080, 8085, ) : Ñaëc ñieåm chính : X Coù khaû naêng xöû lyù 8 bit döõ lieäu cuøng moät luùc. X Coù khaû naêng ñòa chæ hoùa ñöôïc 64KB boä nhôù. X Toác ñoä xöû lyù chaäm. 2. Boä vi xöû lyù 16 bit giaû (8086, 8088, 80186 ) : Ñaëc ñieåm chính : 1
- X Coù khaû naêng xöû lyù 8 bit hay16 bit döõ lieäu cuøng moät luùc. X Coù khaû naêng ñòa chæ hoùa ñöôïc 1MB boä nhôù vaø 64KB ñòa chæ coång. X Toác ñoä xöû lyù nhanh hôn, toác ñoä chuaån 5MHz-10Mhz CPU 80286 (16 bit thaät duøng trong maùy AT) Ñaëc ñieåm chính : X Toác ñoä 8 - 20 MHz X Khaû naêng xöû lyù döõ lieäu 8 hay 16 bit cuøng moät luùc. X Coù khaû naêng ñòa chæ hoùa 16MB boä nhôù vaät lyù (boä nhôù thaät) X Coù khaû naêng laøm vieäc ôû 2 cheá ñoä : cheá ñoä thöïc (real mode) vaø cheá ñoä baûo veä (protected mode). v ÔÛ cheá ñoä thöïc : 80286 laøm vieäc gioáng nhö 8086 chæ ñòa chæ hoùa ñöôïc 1MB boä nhôù. Taäp leänh cuûa noù gioáng nhö 8086 nhöng nhieàu hôn moät soá leänh, chöông trình chaïy nhanh hôn khoaûng 2-5 laàn. v ÔÛ cheá ñoä baûo veä : Khi chuyeån sang cheá ñoä baûo veä, 80286 coù theå laøm moïi coâng vieäc nhö ôû cheá ñoä thöïc. Ngoaøi ra 286 coøn cung caáp - khaû naêng laøm vieäc ña nhieäm, cho pheùp nhieàu chöông trình thöïc hieän cuøng luùc. - khaû naêng baûo veä döõ lieäu vaø toå chöùc boä nhôù theo maûng. Cô cheá toå chöùc boä nhôù theo maûng cho pheùp quaûn lyù ñöôïc toaøn boä 16MB boä nhôù vaät lyù - khaû naêng boä nhôù aûo cho pheùp maùy tính quaûn lyù ñöôïc 1Gb boä nhôù aûo. c. Boä vi xöû lyù 32 bit (80386) Ñaëc ñieåm chính : X Toác ñoä 25-40 MHz X Coù theå laøm vieäc vôùi caùc döõ lieäu 8, 16, 32 bit. X Coù theå ñòa chæ hoùa 4 giga byte boä nhôù vaät lyù vaø 64 tera byte boä nhôù aûo. 1 tera byte = 1024 giga byte = 240 byte. X Coù khaû naêng laøm vieäc caû 3 cheá ñoä : cheá ñoä thöïc, cheá ñoä aûo vaø cheá ñoä baûo veä. Cheá ñoä VM86 cung caáp khaû naêng thöïc hieän nhieàu chöông trình 8086 cuøng luùc trong moâi tröôøng 80386 cheá ñoä baûo veä. CPU 80486 (386 caûi tieán) : 2
- Ñaëc ñieåm chính : X Cô cheá hoaït ñoäng gioáng nhö 80386 nhöng toác ñoä xöû lyù nhanh hôn Goàm caùc loaïi 486 SX, 486 DX, 486 DX2, 486 DX4. Toác ñoä 25-100Mhz X Hoå trôï cô cheá boä nhôù cache beân trong CPU (goàm 8 Kb internal cache) X Coù saún boä vi xöû lyù toaùn hoïc beân trong CPU d. Boä vi xöû lyù 64 bit PENTIUM : Ñaëc ñieåm chính : X Coù theå laøm vieäc vôùi caùc döõ lieäu 8, 16, 32, 64 bit. Goàm caùc loaïi - Pentium, Pentium MMX toác ñoä 66-233Mhz - Pentium II toác ñoä 233-450 Mhz - Pentium III toác ñoä 450-1Ghz 2. Caáu truùc Bus : Boä vi xöû lyù lieân laïc vôùi boä nhôø vaø caùc vi maïch vaøo ra thoâng qua caùc con ñöôøng chung naèm treân baûn maïch heä thoáng goïi laø Bus heä thoáng. Coù 3 loaïi Bus : Bus ñieàu khieån, Bus döõ lieäu vaø Bus ñòa chæ. 3. Caáu truùc cuûa Boä vi xöû lyù : CPU ñieàu khieån maùy tính baèng caùch thöïc hieän caùc chöông trình trong boä nhôù. Moät chöông trình goàm moät taäp hôïp caùc leänh maõ maùy. Moãi leänh maõ maùy goàm 1 daõy caùc bit 0 vaø 1. a. CPU 8086, 8088 : Toå chöùc thaønh 2 ñôn vò laøm vieäc song song : X Ñôn vò gheùp noái Bus BIU (Bus Interface Unit) X Ñôn vò thöïc hieän EU (Execution Unit). v Ñôn vò BIU : Duøng ñeå lieân laïc giöõa EU vaø boä nhôù hay caùc vi maïch vaøo/ra. BIU coù nhieäm vuï gôûi caùc tín hieäu ñòa chæ, soá lieäu vaø tín hieäu ñieàu khieån ra caùc Bus. Thoâng qua Bus, CPU seõ giao tieáp vôùi boä nhôù ñeå ñoïc caùc maõ leänh töø boä nhôù vaøo CPU. Khi ñöôïc ñoïc vaøo, thì caùc maõ leänh seõ ñöôïc löu tröõ trong haøng ñôïi leänh. 3
- v Ñôn vò EU : Coù nhieäm vuï thöïc hieän caùc maõ leänh cuûa CPU nhaän ñöôïc töø haøng ñôïi leänh cuûa BIU. Trong quaù trình xöû lyù caùc leänh, neáu caàn ñoïc theâm caùc döõ lieäu töø boä nhôù vaøo hay caàn ghi döõ lieäu leân boä nhôù thì EU seõ thoâng qua trung gian laø BIU ñeå giao tieáp vôùi boä nhôù. EU coù moät vi maïch goïi laø khoái soá hoïc vaø logic (ALU). ALU coù theå thöïc hieän caùc pheùp toaùn soá hoïc (+, -, *, /) vaø caùc pheùp Logic (And/Or/Xor/Not). * Thöïc hieän leänh : Quaù trính thöïc hieän leänh goàm caùc böôùc sau : a. Nhaän moät leänh töø boä nhôù vaø ñöa vaøo haøng ñôïi leänh. b. Giaûi maõ leänh. c. Neáu leänh coù yeâu caàu ñoïc döõ lieäu töø boä nhôù thì EU seõ baùo cho BIU ñeå gôûi ñòa chæ leân Bus ñòa chæ vaø gôûi tín hieäu yeâu caàu ñoïc boä nhôù leân Bus ñieàu khieån. Döõ lieäu caàn ñoïc seõ ñöôïc gôûi traû laïi EU qua Bus döõ lieäu d. Thöïc hieän leänh e. Ghi keát quaû neáu leänh yeâu caàu. Quaù trình treân ñöôïc laëp laïi cho leänh keá trong boä nhôù. Sô ñoà hoaït ñoäng cuûa CPU 8 bit (8080) CPU Thöïc hieän Ñoïc hay ghi döõ lieäu Laáy Thöïc hieän Ñoïc hay ghi döõ lieäu leänh 1 neáu leänh 1 yeâu caàu leänh 2 leänh 2 neáu leänh 2 yeâu caàu BUS Baän Baän Baän Sô ñoà hoaït ñoäng cuûa CPU 16 bit (8088, 8086) EU Thöïc hieän Ñoïc hay ghi döõ lieäu Thöïc hieän Ñoïc hay ghi döõ lieäu leänh 1 neáu leänh 1 yeâu caàu leänh 2 neáu leänh 2 yeâu caàu BIU Laáy leänh 2 vaøo Ñoïc hay ghi döõ lieäu Laáy leänh 3 vaøo Ñoïc hay ghi döõ lieäu haøng ñôïi haøng ñôïi BUS Baän Baän Baän Baän Nhìn vaøo 2 sô ñoà treân roõ raøng CPU 16 bit hoaït ñoäng nhanh hôn CPU 8 bit do tính hoaït ñoäng song song. b. CPU 80286 toå chöù thaønh 4 ñôn vò laøm vieäc song song : X Ñôn vò BUS BU (Bus Unit). X Ñôn vò leän IU ( Interface Unit ) X Ñôn vò thöïc hieän leänh EU ( Execution Unit). 4
- X Ñôn vò ñòa chæ AU ( Address Unit). v Ñôn vò BU : BU laøm vieäc tröïc tieáp vôùi Bus, sinh ra caùc tín hieäu ñòa chæ, tín hieäu döõ lieäu vaø tín hieäu ñieàu khieån ñeå giao tieáp vôùi boä nhôù trong hay caùc coång vaøo/ra. Ñôn vò naøy cho pheùp quaù trìnhnhaän leänh song song vôùi caùc quaù trình khaùc nhôø coù vuøng ñeäm 6 byte. v Ñôn vò IU : IU nhaän leänh töø vuøng ñeäm, giaûi maõ roài ñöa vaøo haøng ñôïi leänh. Haøng ñôïi leänh chöùa ñöôïc 3 leänh. v Ñôn vò EU : Thöïc hieän leänh ñöôïc giaûi maõ trong haøng ñôïi. Trong quaù trình xöû lyù leänh, noù lieân heä vôùi boä nhôù trong vaø caùc coång vaøo/ra thoâng qua BU. v Ñôn vò AU : AU ñieàu khieån coâng vieäc quaûn lyù boä nhôù, baûo veä boä nhôù vaø chuyeån ñòa chæ logic thaønh ñòa chæ vaät lyù cho Ñôn vò BU. EU Thöïc hieän leänh 1 Thöïc hieän leänh 2 Thöïc hieän leänh 3 Thöïc hieän leänh 4 IU Giaûi maõ leänh 2 trong Giaûi maõ leänh 3 trong Giaûi maõ leänh 4 Giaûi maõ leänh 5 vuøng ñeäm vaø ñöa vaøo vuøng ñeäm vaø ñöa trong vuøng ñeäm vaø trong vuøng ñeäm haøng ñôïi vaøo haøng ñôïi ñöa vaøo haøng ñôïi vaø ñöa vaøo haøng ñôïi BU Ñoïc leänh 3 vaøo vuøng Ñoïc leänh 4 vaøo vuøng Ñoïc leänh 5 vaøo Ñoïc leänh 6 vaøo ñeäm ñeäm vuøng ñeäm vuøng ñeäm Cô cheá laøm vieäc song song trong CPU 286 giöõa caùc ñôn vò BU, IU, EU. c. Caùc CPU 386, 486 vaø PENTIUM toå chöùc thaønh nhieàu ñôn vò hoaït ñoäng song song hôn. Caùc ñôn vò naøy hoaït ñoäng theo cô cheá ñöôøng oáng (pipe line). Do ñoù toác ñoä thöïc hieän cuûa heä thoáng caøng nhanh hôn. 4. Ñònh thôøi gian : Ñeå ñaûm baûo caùc böôùc thöïc hieän leänh ñöôïc thöïc hieän theo ñuùng trình töï. Moät maïch ñoàng hoàø ñieàu khieån boä vi xöû lyù baèng caùch taoï ra moät chuoãi xung ñoàng hoà hay xung nhòp. Soá chu kyø trong khoaûng thôøi gian 1 giaây goïi laø taàn soá ñoàng hoà. Taàn soá ñoàng hoà ñöôïc tính baèng Mhz. 1 Mhz = 1 trieäu chu kyø trong khoaûng thôøi gian 1 giaây Caùc vi maïch cuûa maùy tính ñöôïc kích hoaït bôûi caùc xung ñoàng hoà, nghóa laø chuùng chæ thöïc hieän caùc thaùo taùc khi coù xung ñoàng hoà xuaát hieän. Moãi böôùc trong chu kyø nhaän vaø thöïc hieän thöïc hieän coù theå caàn 1 chu kyø ñoàng hoà hay nhieàu hôn. Ví du CPU 8086 caàn 4 chu kyø xung ñoàng hoà ñeå ñoïc boä nhôù trong khi pentium chæ caàn 1 chu kyø ñoàng hoà ñoïc boä nhôù. II. BOÄ NHÔÙ (Memory) : 1. Boä nhôù trong : 5
- Boä nhôù trong naèm treân baûng maïch heä thoáng, noù duøng ñeå chöùa chöông trình vaø döõ lieäu, ñôn vò chuaån cuûa boä nhôù laø byte ( 1 byte = 8 bit ) Boä nhôù trong goàm 2 loaïi: ROM (Read only memory) vaø RAM (Random access memory) X ROM laø boä nhôù chæ coù theå ñoïc maø khoâng ghi ñöôïc, noù chöùa caùc chöông trình heä thoáng cuûa caùc nhaø saûn xuaát maùy tính. Caùc chöông trình naøy goàm chöông trình khôûi ñoäng maùy tính vaø caùc chöông trình ñieàu khieån maùy tính cô baûn. X RAM laø boä nhôù coù theå ñoïc ghi. Noù löu tröõ thoâng tin moät caùch taïm thôøi, khi taét maùy tính thì moïi thoâng tin trong RAM ñeàu bò xoùa heát. Boä nhôù trong cuûa maùy tính hình thaønh töø taäp hôïp caùc oâ nhôù (cell) lieân tuïc, moãi oâ nhôù coù 1 ñòa chæ vaø chöùa ñöôïc 1 byte thoâng tin. Moãi oâ nhôù ñöôïc truy xuaát thoâng qua ñòa chæ rieâng cuûa chuùng. Ñòa chæ cuûa oâ nhôù ñöôïc ñaùnh thöù töï taêng daàn baét ñaàu töø 0 cho oâ nhôù ñaàu tieân. Maùy XT duøng 20 ñöôøng ñòa chæ, do ñoù coù khaû naêng ñòa chæ hoùa 1MB = 1024 KB oâ nhôù ñaùnh soá töø 00000 ñeán FFFFF theo heä 16, boä nhôù 1024K ñöôïc chia thaønh 16 khoái 64K. Sô ñoà phaân chia 16 khoái boä nhôù trong : 00000 - 0FFFF : RAM 64K thöôøng duøng cho heä ñieàu haønh 10000 - 1FFFF : RAM 64K 20000 - 2FFFF : RAM 64K 30000 - 3FFFF : RAM 64K 40000 - 4FFFF : RAM 64K 50000 - 5FFFF : RAM 64K 60000 - 6FFFF : RAM 64K 70000 - 7FFFF : RAM 64K 80000 - 8FFFF : RAM 64K 90000 - 9FFFF : RAM 64K A0000 - AFFFF : Boä nhôù maøn hình ôû cheá ñoä ñoà hoïa VGA, SVGA B0000 - BFFFF : Boä nhôù maøn hình C0000 - CFFFF : Vuøng ROM môû roäng thöôøng duøng cho Rom maøn hình VGA. D0000 - DFFFF : Vuøng ROM môû roäng E0000 - EFFFF : Vuøng ROM môû roäng F0000 - FFFFF : Vuøng ROM thöôøng tröïc, ROM BIOS, ROM BASIC. 2. Boä nhôù ngoaøi : Boä nhôù trong coù theå truy xuaát trong thôøi gian raát nhanh, nhöng giaù thaønh ñaét vaø chæ löu tröõ thoâng tin taïm thôøi. Ñeå löu giöõ thoâng tin laâu daøi, ta phaûi duøng boä nhôù ngoaøi. a. Ñóa meàm : b. Ñóa cöùng (Hard disk) : c. Ñóa CD (Compact disk) : 6
- d. Ñóa quang (optical disk) : e. Baêng töø (Tape) : 2. Caùc coång vaøo /ra : Caùc thieát bò ngoaïi vi ñöôïc noái vôùi maùy tính thoâng qua caùc maïch vaøo/ra. Moãi maïch vaøo ra chöùa caùc thanh ghi goïi laø coäng vaøo/ra (I/O Port). Moät soá coång ñöôïc duøng cho döõ lieäu trong khi soá khaùc ñöôïc duøng cho caùc leänh ñieàu khieån. Gioáng nhö boä nhôù caùc coång vaøo/ra ñeàu coù ñòa chæ coång vaø ñöôïc noái vôùi Bus heä thoáng. Caùc coång vaøo ra thöïc hieän chöùc naêng laø trung gian ñeå trao ñoåi giöõa CPU vaø caùc thieát bò ngoaïi vi. 3. Cache : CPU luoân nhanh hôn boä nhôù. Muoán boä nhôù nhanh hôn coù 2 caùch : + Duøng boä nhôù nhanh hôn (SRAM) tuy nhieân giaù thaønh quaù cao. + Duøng boä nhôù cache Memory CPU cache Cache laø boä nhôù dung löôïng nhoû, toác ñoä raát cao ñaët giöõa CPU vaø boä nhôù, noù giuùp CPU truy xuaát boä nhôù nhanh hôn. * Phaân loaïi cache : - Cache caøi ñaët beân trong CPU goïi laø Internal cache hay cache level 1 - Coù 1 daïng Cache beân ngoaøi CPU goïi laø external cache hay cache level 2. III. Caùc maïch hoå trôû cho CPU Boä vi xöû lyù khoâng theå naøo kieåm soaùt ñöôïc toaøn boä maùy tính do ñoù noù caàn chuyeån moät soá coâng vieäc caàn thöïc hieän cho nhöõng maïch khaùc, luùc ñoù CPU coù theå taäp trung vaøo coâng vieäc chính cuûa mình. Caùc maïch hoã trôï ñöôïc giao traùch nhieäm ñieàu khieån caùc thieát bò vaøo ra ñöôïc gheùp vaøo maùy tính nhö maøn hình vaø oå ñóa, ñieàu khieån caùc luoàng thoâng tin ôû maïch beân trong, ñieàu khieån ngaét vaø taïo nhòp Döôùi ñaây la ømoät soá maïch hoã trôï quan troïng : Caùc maïch naøy coù theå naèm treân mainborad hay naèm treân caùc card ñöôïc gaén vaøo 1 trong caùc slot treân mainboard. a. I/O controller : I/O controller laø boä ñieàu khieån caùc thieát bò vaøo ra chuaån nhö : Serial I/O, Parallel I/O vaø Disk controller. - Serial I/O : Quaûn lyù caùc coång Com1, Com2. Thöôøng duøng cho con chuoät, scanner. - Parallel I/O : quaûn lyù caùc coång LPT1, LPT2. thöôøng duøng cho caùc maùy in. - Floppy disk controller : Quaûn lyù oå dóa meàm. 7
- - Hardisk controler : Quaûn lyù oå dóa cöùng vaø CD rom. Controller kieåm soaùt vaø ñieàu khieån hoaït ñoäng cuûa oå ñóa, di chuyeån ñaàu ñoïc oå ñóa, ñoïc döõ lieäu töø ñóa hay ghi döõ lieäu leân ñóa. b. Boä truy xuaát tröïc tieáp DMA 8237A (Direct Memory Acess) : Caùc thieát bò ngoaïi vi nhö dóa cöùng, dóa CD thöôøng hoå trôï boä DMA. DMA cho pheùp chuyeån döõ lieäu vôùi toâc ñoä cao giöõa caùc thieát bò ngoaøi vi vaø boä nhôù maø khoâng caàn thoâng qua CPU, luùc ñoù CPU raõnh vaø coù theå thöïc hieän caùc coâng vieäc khaùc. c. Boä gheùp noái thieát bò ngoaïi vi PPI 8255 : ( Programmable Peripheral Interface) 8255 duøng ñeå noái keát giöõa CPU vaø moät soá thieát bò ngoaïi vi cuûa maùy tính nhö baøn phím hoaëc loa. d. Boä ñieàu khieån CRT 6845 : Laø linh kieän chính treân moät soá baûn maïch ñieàu khieån maøn hình. Noù coù 19 thanh ghi dung ñeå xaùc ñònh vaø ñieàu khieån söï queùt, cheá ñoä vaø söï hoaït ñoäng cuûa maøn hình. e. Boä ñieàu khieån ngaét PIC 8259 (Programmable Interrupt Controller) : 8259 quaûn lyù hoaït ñoäng ngaét cöùng (hardware interrupt). Ngaét cöùng laø tín hieäu ñöôïc gôûi ñeán boä vi xöû lyù töø moät thieát bò vaøo ra ñeå yeâu caàu thöïc hieän moät coâng vieäc naøo ño. (ví duï khi aán phím thì baøn phím seõ taïo ra moät ngaét ñeå CPU xöû lyù phím). Neáu cuøng moät luùc coù nhieàu ngaét cöùng ñöôïc gôûi ñeán, 8259 seõ giöõ vaø xem xeùt caùc tín hieäu ñoù, xaùc ñònh tín hieäu naøo coù ñoä öu tieân cao nhaát, töø ñoù noù phaùt leänh ngaét öùng vôùi tín hieäu ñoù ñeán CPU. CPU seõ thöïc hieän moät ñoaïn chöông trình töông öùng ñeå ñaùp öùng yeâu caàu cuûa tín hieäu ñoù. f. Ñoàng hoà heä thoáng (system Clock) coøn goïi laø boä taïo nhòp : Neáu CPU laø boä naõo cuûa maùy tính thì boä taïo nhòp ñöôïc xem nhö laø traùi tim cuûa maùy tính, noù cung caáp caùc tín hieäu nhòp, tín hieäu ñoàng boä caàn cho vieäc ñieàu khieån boä vi xöû lyù vaø caùc thieàt bò ngoaïi vi. Caùc tín hieäu naøy ñieàu khieån khoaûng thôøi gian cuûa caùc hoaït ñoäng trong toaøn boä heä thoáng maùy tính. Taàn soá cô sôû cuûa noù laø 14,8128 MHz. g. Maïch ñònh thôøi (Timer 8253) : Timer 8253 laø moät maïch ñeám vaø maïch theo doõi thôøi gian. Timer phaùt ra caùc xung ñieän lieân tuïc töø caùc chaân ra cuûa noù. Taàn soá cuûa caùc xung naøy coù theå laäp trình. Moãi chaân ra coù theå coù taàn soá rieâng. Ba boä ñeám ñònh thôøi ñöôïc söû duïng nhö sau : Keânh 0 cung caáp thôøi gian cô sôû cho ñoàng hoà thôøi gian thöïc. Keânh 1 ñöôïc söû duïng ñeå laøm töôi boä nhôù (refresh Ram). Keânh 2 taïo ra taàn soá aâm thanh cho loa. h. Boä ñoàng xöû lyù toaùn hoïc : ( Math coprocessors 8087/80287/80387 ) Caùc CPU 8088, 80286, 80386 khoâng coù khaû naêng thöïc hieän tröïc tieáp caùc pheùp 8
- toaùn ñoái vôùi soá thöïc . Coù moät choã troáng treân baûn maïch heä thoáng cuûa PC ñeå gaén theâm boä vi xöû lyù toaùn hoïc. PC/XT duøng 8087, AT 80286 duøng 80287, AT 80386 duøng 80387. Ñoái vôùi CPU 80486 vaø PENTIUM boä xöû lyù toaùn hoïc ñöôïc tích hôïp ngay beân trong CPU. Tuy CPU coù theå thöïc hieän caùc pheùp toaùn ñoái vôùi soá thöïc moät caùch giaùn tieáp baèng caùc chöông trình phaàn meàm, nhöng vôùi boä vi xöû lyù toaùn hoïc, noù thöïc hieän nhanh hôn 100 laàn. Boä vi xöû lyù toaùn hoïc coù theå thöïc hieän tröïc tieáp caùc pheùp toaùn soá thöïc cô baûn nhö pheùp coäng, tröø, nhaân, chia, laáy caên soá cuõng nhö tính caùc haøm löôïng giaùc sin, cos VI. Caùc thieát bò vaøo ra chuaån : a. Maøn hình : b. Baøn phím : c. OÅ dóa : d. Maùy In : e. Con chuoät : f. Scanner g. Modem CAÂU HOÛI OÂN TAÄP 1. Trình baøy caùc thaønh phaàn cô baûn cuûa moät maùy vi tính. 2. Taïi sao CPU 80286 ñöôïc goïi laø 1 boä vi xöû lyù 16 bit thaät ? coøn caùc CPU 8086 vaø 8088 laø boä vi xöû lyù 16 bit giaû. 3. Cho bieát CPU 80286 coù theå ñòa chæ hoùa ñöôïc bao nhieâu oâ nhôù ? - Khi hoaït ñoäng ôû cheá ñoä thöïc - Khi hoaït ñoäng ôû cheá ñoä baûo veä 4. Boä nhôù aûo laø gì ? CPU 286, 386, 486 vaø Pentium quaûn lyù ñöôïc toái ña bao nhieâu boä nhôù aûo ? 5. Caùc coång vaøo/ra duøng ñeå laøm gì ? söï khaùc nhau giöõa chuùng vaø caùc oâ nhôù. 7. Trìng baøy caùc khaû naêng cuûa CPU 80286 ôû cheá ñoä baûo veä. 8. Bus laø gì ? Coù bao nhieäu loaïi Bus ? Giaûi thích töøng loaïi Bus. 9. Trình baøy toå chöùc hoaït ñoäng cuûa CPU 8088/8086. 10. Trình baøy toå chöùc hoaït ñoäng cuûa CPU 80286. 11. Phaân bieät giöõa boä nhôù ROM vaø RAM. 12. Thöôøng treân baûn maïch heä thoáng cuûa PC coù 1 choã troâng ñeå gaén theâm boä ñoàng xöû lyù toaùn hoïc. Vaäy boä ñoàng xöû lyù toaùn hoïc duøng ñeå laøm gì ? 9
- 18. Cache laø gì ? Taïi sao coù cache thì maùy tính seõ chaïy nhanh hôn ? 10
- Chöông 2 TOÅ CHÖÙC HOAÏT ÑOÄNG CUÛA CPU 16 BIT I . CAÙC DAÏNG DÖÕ LIEÄU CUÛA CPU : CPU chæ coù theå laøm vieäc tröïc tieáp vôùi daïng döõ lieäu : byte vaø word. 1 . Daïng byte : Coù chieàu daøi 8 bit, coù theå duøng ñeå bieåu dieãn : X Moät soá nguyeân khoâng daáu : coù giaù trò töø 0 - 225 X Moät soá nguyeân coù daáu : coù giaù trò töø - 128 ñeán 127. X Moät kyù töï ASCII chuaån. Soá nguyeân coù daáu coù theå laø moät soá döông hay soá aâm, noù chæ duøng 7 bit thaáp cho giaù trò, bit cao nhaát duøng ñeå bieåu dieãn daáu. Neáu bit daáu (bit 7) coù tri 1 thì soá ñoù laø soá aâm, ngöôïc laïi soá ñoù laø döông. Soá aâm ñöôïc löu tröõ döôùi daïng buø 2. 2 . Daïng word : Coù chieàu daøi 16 bit, coù theå duøng ñeå bieåu dieãn : X Moät soá nguyeân khoâng daáu : coù giaù trò töø 0 - 65535 X Moät soá nguyeân coù daáu : coù giaù trò töø - 32768 ñeán 32767. X Moät ñòa chæ 16 bit Soá nguyeân coù daáu coù theå laø 1 soá döông hay soá aâm, noù chæ duøng 15 bit thaáp cho giaù trò, bit cao nhaát duøng ñeå bieåu dieãn daáu. Neáu bit daáu (bit 15) coù tri 1 thì soá ñoù laø soá aâm, ngöôïc laïi soá ñoù laø döông. Soá aâm ñöôïc löu tröõ döôùi daïng buø 2. II . GIAO TIEÁP GIÖÕA CPU VAØ BOÄ NHÔÙ : Boä nhôù goàm 1 taäp hôïp caùc oâ nhôù lieân tuïc. Muoán truy xuaát 1 oâ nhôù trong boä nhôù, CPU phaûi bieát ñòa chæ cuûa oâ nhôù, nghóa laø CPU phaûi laøm vieäc tröïc tieáp vôùi döõ lieäu bieåu dieãn ñòa chæ oâ nhôù. Boä nhôù 1MB ñöôïc chia thaønh nhieàu ñoaïn. Moãi ñoaïn daøi toái ña 64KB baét ñaàu ôù 1 vò trí maø ñòa chæ cuûa noù phaûi chia heát cho 16. Ñòa chæ naøy goïi laø ñòa chæ ñoaïn. Ta coù 4 bit thaáp cuûa ñòa chæ ñoaïn luoân baèng 0, neân coù theå xem ñòa chæ ñoaïn nhö laø 1 ñaïi löôïng 16 bit. 11
- Ñoái vôùi nhöõng oâ nhôù trong ñoaïn. muoán truy xuaát ta phaûi duøng theâm 1 ñòa chæ goïi laø ñòa chæ offset ñeå xaùc ñònh vò trí cuûa oâ nhôù naøy trong ñoaïn 64 K ñöôïc xaùc ñònh bôûi ñòa chæ ñoaïn. Ñòa chæ offset cuûa oâ nhôù ñöôïc tính nhö laø khoaûng caùch töø ñieåm baét ñaàu cuûa ñoaïn ñeán oâ nhôù trong ñoaïn, ñaây cuõng laø 1 ñaïi löôïng 16 bit. Vaäy ñòa chæ cuûa 1 oâ nhôù baát kyø trong boä nhôù 1M ñöôïc xaùc ñònh baèng caùch toå hôïp 2 ñòa chæ 16 bit laø ñòa chæ ñoaïn vaø ñòa chæ offset. a. ñònh nghóa : X Ñòa chæ vaät lyù (physic address) : laø ñaïi löôïng chieàu daøi 20 bit xaùc ñònh vò trí cuûa oâ nhôù trong 1 MB boä nhôù trong . X Ñòa chæ logic : laø ñaïi löôïng goàm 2 thaønh phaàn chieàu daøi 16 bit , laàn löôït bieåu dieãn ñòa chæ ñoaïn vaø ñòa chæ offset cuûa 1 oâ nhôù . Thöôøng ñòa chæ ñöôïc bieãu dieãn döôùi daïng soá hex. Ñòa chæ logic ñöôïc kyù hieäu xxxx:yyyy trong xxxx laø ñòa chæ ñoaïn vaø yyyy laø ñòa chæ offset b. Caùch chuyeån ñoåi töø ñòa chæ logic sang ñòa chæ vaät lyù : Khi BIU truy xuaát boä nhôù noù nhaän 1 ñòa chæ logic goàm ñòa chæ ñoaïn vaø ñòa chæ offset, noù ñöôïc chuyeån ñoåi sang ñòa chæ vaät lyù baèng caùch dòch ñòa chæ ñoaïn sang traùi 4 bit roài coäng vôùi ñòa chæ offset . Ví duï : Giaû söû ta coù oâ nhôù coù ñòa chæ ñoaïn laø 2323 ( heä 16 ) vaø ñòa chæ offset 3434 (heä 16 ) thì ñòa chæ logic ñöôïc vieát nhö sau : 2323 : 3434 Vaø ñòa chæ vaät lyù ñöôïc tính baèng caùch dòch ñòa chæ ñoaïn sang traùi 4 bit ta ñöôïc 23230 sau ñoù coäng vôùi ñòa chæ offset ta nhaän ñöôïc ñòa chæ vaät lyù . 12
- 23230 + 3434 ___ 25664 Ngöôøi laäp trình chæ coù theå truy xuaát caùc oâ nhôù thoâng qua ñòa chæ logic, sau ñoù CPU seõ chuyeån caùc ñòa chæ logic naøy sang ñòa chæ vaät lyù ñeå gôûi ra Bus ñòa chæ. III . CAÙC THANH GHI CUÛA CPU : * Thanh ghi (register) : laø 1 vuøng nhôù naèm beân trong CPU. CPU 16 bit coù 14 thanh ghi, moãi thanh ghi chieàu daøi 16 bit. Caùc Thanh ghi ñeàu coù teân rieâng vaø coù coâng duïng rieâng. Ta coù theå chia caùc thanh ghi cuûa CPU ra thaønh 5 nhoùm chính sau ñaây : 1. Nhoùm caùc thanh ghi ña duïng ( general purpose register ) : Goàm 4 thanh ghi 16 bit coù teân laø : AX , BX, CX ,DX. Ñaëc ñieåm: coù theå söû duïng nhö 1 thanh ghi döõ lieäu 16 bit hay 2 thanh ghi döõ lieäu, moãi thanh ghi chieàu daøi 8 bit AX = AH + AL BX = BH + BL CX = CH + CL DX = DH+ DL Caùc thanh ghi 8 bit AH , BH, CH , DH, vaø AL, BL, CL, DL töông öùng goïi laø caùc phaàn cao 8 bit vaø phaàn thaáp 8 bit cuûa caùc thanh ghi AX, BX, CX, DX. 2. Nhoùm caùc thanh ghi con troû vaø chæ muïc ( Pointer and Index register ) : Goàm 4 thanh ghi coù teân BP, SP, SI, DI. Caùc thanh ghi naøy laø caùc thanh ghi 16 bit khoâng theå chia thaønh 2 thanh ghi 8 bit . X BP : Thanh ghi con troû cô sôû ( Base Pointer register) : duøng trong caùc pheùp ñònh ñòa chæ cô sôû khi truy xuaát STACK . X SP Thanh ghi ghi con troû STACK (Stack pointer register) ñöôïc duøng laøm con troû ñeå chæ ñeán phaàn töû ôû ñænh cuûa STACK. X SI vaø DI : Ñöôïc duøng trong caùc leänh xöû lyù chuoãi vaø trong caùc pheùp ñònh ñòa chæ chæ muïc khi truy xuaát boä nhôù . + SI, thanh ghi chæ soá nguoàn (Source Index Register) : Duøng ñeå xaùc ñònh ñòa chæ baét ñaàu cuûa chuoãi nguoàn. + DI, thanh ghi chæ soá ñích (Destination Index Register) : Duøng ñeå xaùc ñònh ñòa chæ baét ñaàu cuûa chuoåi ñích. 13
- 3. Nhoùm caùc thanh ghi segment : Goàm caùc thanh ghi coù teân CS, DS, ES, SS duøng ñeå chöùa ñòa chæ ñoaïn cuûa 1 ñoaïn. X Thanh ghi CS (Code segment) : Duøng ñeå chöùa ñòa chæ ñoaïn cuûa ñoaïn chöùa maõ leänh. X Thanh ghi DS (Data segment) : Duøng ñeå chöùa ñòa chæ ñoaïn cuûa ñoaïn chöùa döõ lieäu X Thanh ghi SS (Stack segment): Duøng ñeå chöùa ñòa chæ ñoaïn cuûa ñoaïn stack. X Thanh ghi ES (Extra segment) : Duøng ñeå chöùa ñòa chæ ñoaïn cuûa ñoaïn chöùa caùc döõ lieäu boå sung. 4. Thanh ghi con troû leänh chöông trình IP (Intruction Pointer) : Duøng ñeå xaùc ñònh ñòa chæ offset cuûa oâ nhôù chöùa maõ leänh cuûa leänh keá tieáp seõ ñöôïc CPU thi haønh ( oâ nhôù naøy naèm trong ñoaïn ñöôïc ñònh bôûi thanh ghi ñoaïn CS). Khi CPU thöïc hieän moät leänh, thanh ghi IP seõ töï ñoäng thay ñoåi ñeå chæ ñeán ñòa chæ offset cuûa oâ nhôù chöùa leänh seõ ñöôïc CPU thi haønh keá tieáp. 5. Thanh ghi côø hieäu (Flag): Thanh ghi côø hieäu laø 1 thanh ghi 16 bit. Duøng ñeå löu caùc thoâng tin ñaëc bieät veà traïng thaùi hieän thôøi cuûa CPU vaø veà keát quaû cuûa leänh vöøa ñöôïc CPU thöïc hieän . CPU chæ duøng 11 bit laøm côø, moãi côø goàm 2 traïng thaùi : 1 (set) vaø 0 (clear), 7 bit coøn laïi chöa söû duïng . Ta coù theå chia caùc côø laøm 2 nhoùm : 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF Sô ñoà caùc côø cuûa thanh ghi côø hieäu a. Nhoùm caùc côø traïng thaùi : Goàm 6 côø hieäu : CF, AF, PF, ZF, SF, OF. Caùc côø naøy coù theå bò aûnh höôûng moãi khi CPU thöïc hieän xong 1 leänh. X Côø nhôù CF (Carry Flag) : Ñöôïc baät 1 neáu keát quaû cuûa pheùp toaùn vöøa thöïc hieän coù nhôù hay coù möôïn. X Côø traøn OF (Overflow Flag) : Ñöôïc baät 1 neáu keát quaû cuûa 1 pheùp toaùn caùc soá coù daáu bò traøn (bò sai). X Côø phuï AF ( Auxiliary Carry Flag) : Ñöôïc baät 1 neáu keát quaû pheùp toaùn vöøa thöïc hieän coù nhôù hay coù möôïn ñoái vôùi 4 bit thaáp. X Côø zero ZF (Zero flag) : Ñöôïc baät 1 neáu keát quaû cuûa pheùp toaùn vöøa thöïc hieän baèng 0. X Côø daáu SF (Sign Flag) : Coù giaù trò töông öùng vôùi bit cao nhaát cuûa keát quaû 14
- pheùp toaùn vöøa thöïc hieän . X Côø kieåm tra chaún leû PF (Parity Flag) : Ñöôïc baät 1 neáu keát quaû cuûa pheùp toaùn coù toång 8 bit thaáp laø 1 soá chaün. b. Nhoùm caùc côø hieäu ñieàu khieån : Goàm 3 côø DF, TF, IF. X DF (Direction Flag) : Ñöôïc duøng trong caùc leänh xöû lyù chuoãi. Côø CF quy ñònh chieàu chuyeån döõ lieäu trong caùc leänh xöû lyù chuoãi X TF (Trap Flag) : Cho pheùp CPU chuyeån sang cheá ñoä thöïc hieän tuaàn töï töøng leänh cuûa chöông trình (single step mode), noù ñöôïc duøng trong vieäc hieäu chænh vaø gôõ roái chöông trình . Neáu TF = 1 thì CPU seõ phaùt sinh 1 ngaét (single step interrupt) sau moãi laàn 1 leänh cuûa chöông trình ñöôïc thöïc hieän xong . X IF (Interrupt Flag) : Cho pheùp 1 ngaét phaàn cöùng phaùt sinh seõ ñöôïc tieáp nhaän (enable) hay khoâng ñöôïc tieáp nhaän (disable). IF = 1 Caùc ngaét phaàn cöùng phaùt sinh seõ ñöôïc tieáp nhaän IF = 0 Caùc ngaét phaàn cöùng phaùt sinh seõ khoâng ñöôïc tieáp nhaän. IV. CÔ CAÁU TOÅ CHÖÙC VAØ HOAÏT ÑOÄNG CUÛA INTERRUPT : 1. Ngaét (interrupt) : Laø tín hieäu ñöôïc gôûi ñeán boä vi xöû lyù laøm taïm ngöng chöông trình ñang thöïc hieän ñeå xöû lyù 1 nhieäm vuï khaùc. Sau khi xöû lyù xong nhieäm vuï, thì chöông trình bò ngaét seõ ñöôïc tieáp tuïc thöïc hieän sau vò trí bò ngaét. Maùy tính coù taát caû 256 ngaét ñaùnh soá töø 0 ñeán FF 2. Phaân loaïi ngaét : a. Ngaét phaàn cöùng (Hardware interrupt) : Ñöôïc phaùt sinh bôûi phaàn cöùng cuûa maùy tính khi ñaùp laïi 1 söï kieän naøo ñoù. Noù ñöôïc duøng ñeå ñieàu khieån caùc thieát bò quan troïng treân heä maùy nhö baøn phím, oå ñóa, maùy in, . . . Caùc ngaét naøy ñöôïc linh kieän 8258A quaûn lyù. Tuøy theo töøng loaïi thieát bò noù seõ saép xeáp ñoä öu tieân theo möùc ñoä quan troïng tröôùc khi ñöôïc gôûi ñeán CPU ñeå thöïc hieän. Ñoái vôùi maùy AT CPU coù 16 ngaét phaàn cöùng (kyù hieäu töø IRQ0 - IRQ15) IRQ0 Timer IRQ1 Keyboard IRQ2 chæ duøng trong maùy AT, duøng laøm ngaét ñeäm cho IRQ8-IRQ15 15
- IRQ3 Serial port 2 IRQ4 Serial port 1 IRQ5 Sound card IRQ6 Floppy disk IRQ7 Parallel port 1 IRQ8 Real time clock IRQ9-IRQ11 : chöùa duøng IRQ12 PS mouse IRQ13 Math Co-Processor IRQ14 IDE port #1 IRQ15 IDE port #2 Ñoä öu tieân ñöôïc gaén theo thöù töï töø IRQ0 xuoáng IRQ15. Caùc ngaét naøy laø caùc ngaét chaén ñöôïc (maskable interrupt), nghóa laø coù theå chaén (loaïi boû) caùc ngaét naøy baèng leänh CLI ( Clear Interrupt Flag). b . Interrupt NMI (Non Maskable Interrupt) : Ngaét khoâng chaén ñöôïc, ñaây laù tín hieäu ngaét khoâng che ñöôïc baèng phaàm meàm, noù coù ñoä öu tieân cao nhaát. NMI ñöôïc phaùt sinh khi ñieän theá nguoàn yeáu hay phaùt hieän thaáy moät söï hö hoûng boä nhôù xaûy ra. c. Interrupt internal : Ñöôïc phaùt sinh bôûi CPU khi thöïc hieän chöông trình. Goàm 3 ngaét : X Divide by zero Interrupt : Ñöôïc töï ñoäng phaùt sinh bôûi CPU moãi khi pheùp chia coù sai nhö khi chia cho 0. X Into (Overflow Interrupt) : Ñöôïc phaùt sinh bôûi CPU khi 1 söï traøn döõ lieäu xaûy ra trong caùc pheùp toaùn. X Trap interrupt : Ñöôïc phaùt sinh bôûi CPU sau khi thöïc hieän xong 1 leänh trong tröôøng hôïp côø TF baät 1. d. Ngaét meàm (Software interrupt) : Do chöông trình yeâu caàu ñeå thöïc hieän 1 chöông trình con naøo ñoù coù saün trong ROM hay RAM. Moät ngaét phaàm meàm laø 1 ngaét ñöôïc goïi bôûi leänh INT. INT num 3. Baûng vector interrupt : Laø moät baûng coù chieàu daøi 1KB naèm trong boä nhôù trong baét ñaàu ôû ñòa chæ 0000:0000 ñeán ñòa chæ 0000:3FF . Baûng naøy goàm 256 phaàn töû, moãi phaàn töû goàm 4 byte, phaàn töû thöù i ñöôïc duøng ñeå chöùa ñòa chæ logic cuûa chöông trình xöû lyù ngaét thöù i. 16
- Caùc ngaét töø 00 ñeán 1F : caùc ngaét naèm trong ROM BIOS ( trong ñoù ngaét 2 laø ngaét NMI vaø caùc ngaét töø 08-0F laø caùc ngaét phaàn cöùng ) . Caùc ngaét töø 20 ñeán 3F : caùc ngaét meàm duøng trong DOS. V . CÔ CAÁU ÑÒNH ÑÒA CHÆ CUÛA CPU 16 bit: 1. Ngoân ngöõ maùy ngoân ngöõ maùy laø ngoân ngöõ duy nhaát maø CPU hieåu vaø thöïc hieän ñöôïc, thöôøng moãi CPU coù moät ngoân ngöõ maùy rieâng. Ñeå maùy tính coù theå thöïc hieän moät chöông trình, thì chöông trình phaûi ñöôïc vieát baèng chính ngoân ngöõ maùy cuûa CPU trong maùy tính ñoù . Moãi leänh maõ maùy cuûa CPU noùi chung goàm 3 phaân . X maõ leänh ( Opcode ) : töø 1 - 3 byte X ñoä dôøi ( Displacement ) : töø 0 - 4 byte . X döõ lieäu ( Data ) töø 0 - 2 byte . Giaûi thích : X Maõ leänh : duøng ñeå xaùc ñònh taùc vuï caàn thöïc hieän . X Ñoä dôøi : duøng ñeå xaùc ñònh vò trí vuøng nhôù . Vuøng nhôù naøy laø taùc toá cho taùc vuï do maõ leänh quy ñònh . X Döõ lieäu : laø moät giaù trò baèng 8 bit hay 16 bit laøm taùc toá cho taùc vuï do maõ leänh quy ñònh . 2. Leänh daïng gôïi nhôù : Caùc leänh cuûa CPU laø 1 daõy caùc soá nhò phaân 0 vaø 1 neä raát khoù ñoïc hieåu. Vì vaäy thay vì duøng caùc soá nhò phaân ñeå bieåu thò leänh, ngöôøi laäp trình coù theå duøng caùc töø gôïi nhôù naøy goïi laø daïng gôïi nhôù cuûa taäp leänh CPU. Daïng gôïi nhôù (mnenonic) cuûa 1 leänh CPU ñöôïc moâ taû bôûi 2 thaønh phaàn : Teân gôïi nhôù (mnenonic) vaø toaùn haïng (operand ). w Teân gôïi nhôù : laø moät töø gôïi nhôù baèng tieáng Anh. Töø gôïi nhôù naøy xaùc ñònh 1 haønh ñoäng caàn thöïc hieän cuûa caâu leänh. w Toaùn haïng : Duøng ñeå quy ñònh caùc döõ lieäu caàn thieát ñeå thöïc hieän haønh ñoäng cuûa caâu leänh. Coù 3 loaïi toaùn haïng : X Toaùn haïng tröïc haèng : Döõ lieäu laø tröïc haèng X Toaùn haïng thanh ghi : Döõ lieäu laø noäi dung cuaû thanh ghi X Toaùn haïng boä nhôù : Döõ lieäu laø noäi dung caùc oâ nhôù . v Daïng leänh maõ maùy döôùi daïng gôïi nhôù : 17
- Mnemonic [ operand 1 ] [ , operand 2 ] Caùc leänh cuûa CPU coù theå chia laø 3 nhoùm : X Nhoùm khoâng toaùn haïng. X Nhoùm coù 1 toaùn haïng. X Nhoùm coù 2 toaùn haïng.Trong tröôøng hôïp naøy toaùn haïng thöù nhaát goïi laø toaùn haïng nguoàn, toaùn haïng thöù 2 goïi laø toaùn haïng ñích hay toaùn haïng ñeán. v Ñònh nghóa pheùp ñònh ñòa chæ (addressing mode) : Caùc toaùn haïng cuûa moät leänh coù theå ñöôïc quy ñònh döôùi nhieàu daïng khaùc nhau, ñöôïc goïi laø caùc pheùp ñònh ñòa chæ. Caùc pheùp ñònh ñòa chæ xaùc ñònh caùc döõ lieäu caàn thieát cho caâu leänh maø CPU seõ thi haønh. Coù 3 pheùp ñònh ñòa chæ : X Pheùp ñònh ñòa chæ thanh ghi X Pheùp ñònh ñòa chæ tröïc haèng X Pheùp ñònh ñòa chæ boä nhôù 1. Pheùp ñònh ñòa chæ thanh ghi (register addressing mode ) : Trong pheùp ñònh ñòa chæ naøy, thanh ghi ñöôïc söû duïng seõ ñöôïc chæ roõ trong caâu leänh. Noäi dung cuûa thanh ghi naøy seõ laø giaù trò thaät cuûa toaùn haïng trong caâu leänh. Caùc thanh ghi ñöôïc duøng trong pheùp ñònh ñòa chæ thanh ghi laø : AH , BH , CH , DH , AL , BL , CL , DÖÕ LIEÄU AX , BX , CX , DX , SP , BP , SI , DI CS , DS , ES , SS Ví duï : ADD AX , BX ( AX ß AX + BX ) teân gôïi nhôù 2 toaùn haïng thanh ghi 2. Pheùp ñònh ñòa chæ tröïc haèng (immediate addressing mode) : Trong pheùp ñònh ñòa chæ tröïc haèng, moät giaù trò 8 bit hay 16 bit ñöôïc chæ roõ trong caâu leänh. Giaù trò naøy seõ laø giaù trò thaät cuûa toaùn haïng trong caâu leänh. Toaùn haïng tröïc haèng chæ coù theå duøng laøm toaùn haïng nguoàn. Ví duï : MOV AL , 47 teân gôïi nhôù toaùn haïng toaùn haïng thanh ghi tröïc haèng 8 bit 3. Pheùp ñònh vò boä nhôù ( memory addressing mode ) : Caùc leänh cuûa CPU coù theå laøm vieäc tröïc tieáp vôùi caùc döõ lieäu trong boä nhôù. Khi moät toaùn haïng boä nhôù ñöôïc söû duïng, CPU phaûi tính ñòa chæ caùc oâ nhôù chöùa döõ lieäu. Ñòa chæ naøy 18
- goïi laø ñòa chæ EA ( Effective Address ). Chuù yù : Trong moät caâu leänh khoâng theå coù caû 2 toaùn haïng nguoàn vaø ñích ñeàu laø toaùn haïng boä nhôù. Coù 2 caùch ñònh ñòa chæ boä nhôù : a. Pheùp ñònh ñòa chæ boä nhôù tröïc tieáp : Trong pheùp ñònh ñòa chæ naøy, ñòa chæ EA cuûa toaùn haïng boä nhôù naèm tröïc tieáp trong baûn thaân caâu leänh. Ñòa chæ naøy ñöôïc ghi giöõa 2 daáu moùc vuoâng ñeå phaân bieät vôùi caùc döõ lieäu tröïc haèng. Ví duï : MOV AL , DS : [100] teân gôïi nhôù toaùn haïng toaùn haïng thanh ghi tröïc haèng 8 bit Leänh naøy chuyeån noäi dung cuûa oâ nhôù coù ñòa chæ offset 100 trong ñoaïn chæ bôûi DS vaøo thanh ghi AL. b. Pheùp ñònh ñòa chæ boä nhôù giaùn tieáp : Trong pheùp ñònh ñòa chæ boä nhôù giaùn tieáp, ñòa chæ EA cuûa toaùn haïng boä nhôù khoâng naèm tröïc tieáp trong caâu leänh maø ñöôïc xaùc ñònh giaùn tieáp thoâng qua caùc thanh ghi cô sôû (BX hay BP ) hay caùc thanh ghi chæ muïc ( SI hay DI ). Ñòa chæ EA cuûa toaùn haïng boä nhôù coù theå xaùc ñònh bôûi : X Noäi dung cuûa moät thanh ghi cô sôû hay chæ muïc ( BX , BP , SI , DI ) coù theå coù hoaëc khoâng coù theâm moät ñaïi löôïng 8 bit hay 16 bit goïi laø ñoä dôøi. X Noäi dung cuûa toång 1 thanh ghi cô sôû vaø 1 thanh ghi chæ muïc coù theå coù hoaëc khoâng coù theâm moät ñoä dôøi 8 bit hay 16 bit. Trong CPU, caùc thanh ghi coù theå ñöôïc duøng laøm taùc haïng boä nhôù laø caùc thanh ghi BX , BP , SI ,DI. Ví duï : Leänh ADD AX , DS : [ BX ] Coäng noäi dung thanh ghi AX vôùi noäi dung oâ nhôù coù ñòa chæ laø noäi dung thanh ghi 19
- BX trong ñoaïn ñöôïc chæ bôûi DS. Keát quaû caát vaøo thanh ghi AX. 4. Phöông phaùp boû ngaàm ñònh thanh ghi ñoaïn : Trong pheùp ñònh vò boä nhôù neáu trong toaùn haïng khoâng ghi roõ thanh ghi ñoaïn thì thanh ghi ñoaïn cuûa toaùn haïng boä nhôù seõ phuï thuoäc vaøo kieåu ñònh ñòa chæ tröïc tieáp, giaùn tieáp cô sôû hay chæ muïc . Cheá ñoä ñòa chæ Toaùn haïng Thanh ghi ñoaïn Tröïc tieáp [offset] DS Giaùn tieáp cô sôû [ BX ] + disp DS [ BP ] + disp SS Giaùn tieáp chæ muïc [ SI ] + disp DS [ DI ] + disp DS Giaùn tieáp cô sôû [ BX + SI ] + disp DS Chæ muïc [ BX + DI ] + disp DS [ BP + SI ] + disp SS [ BP + DI ] + disp SS CAÂU HOÛI OÂN TAÄP 1 . Haõy chuyeån ñoåi caùc soá nguyeân döông thaäp phaân 16 bit sau sang daïng nhò phaân vaø thaäp luïc töông öùng : 45 , 72 , 254 , 5387 , 12345 , 32768 2 . Haõy chuyeån ñoåi caùc soá nguyeân ( coù theå döông hay aâm ) thaäp phaân 16 bit sau sang daïng nhò phaân vaø thaäp luïc töông öùng : -3086 , -7968 , 7968 , 513 , -32766 3 . Ñòa chæ logic vaø ñòa chæ vaät lyù laø gì ? caùch chuyeån ñoåi töø ñòa chæ logic sang ñòa chæ vaät ly . Haõy chuyeån ñoåi ñòa chæ logic 1A7B:ABCD sang ñòa chæ vaät lyù töông öùng. 4 . Giaû söû thanh ghi : 20
- AX = 60C5 BX = 703E Haõy tính giaù trò cuûa caùc côø khi coäng AX vaø BX, keát quaû löu vaøo thanh ghi AX. 5. Ngaét laø gì ? Haõy phaân bieät söï khaùc nhau giöõa ngaét cöùng vaø ngaét meàm. 6 . Ngoân ngöõ maùy laø gì ? Haõy trình baøy caáu truùc cuûa 1 leänh ngoân ngöõ maùy . Daïng gôïi nhôù cuûa ngoân ngöõ laø gì ? Taïi sao phaûi duøng daïng gôïi nhôù ? 7. Pheùp ñònh ñòa chæ laø gì ? Trình baøy chi tieát caùc pheùp ñònh ñòa chæ cuûa CPU 80286 8 . Xeùt ñoaïn chöông trình maõ maùy vieát döôùi daïng gôïi nhôù : MOV AL , FE SUB AL , 2 MOV BL , 8C MOV BH , 2D ADD BX , AX Haõy cho bieát noäi dung cuûa thanh ghi AX vaø BX döôùi daïng soá thaäp phaân khi thöïc hieän xong ñoaïn chöông trình trong 2 tröôøng hôïp sau : a. Xem caùc giaù trò treân bieåu dieãn soá nguyeân khoâng daáu b. Xem caùc giaù trò treân bieåu dieãn soá nguyeân coù daáu 9. Giaû söû Thanh ghi AX chöùa 1000, BX chöùa 04 Thanh ghi SI chöùa 1000, DI Chöùa 02 Trong ñoaïn chæ bôûi thanh ghi ñoaïn DS OÂ nhôù ôû ñòa chæ offset 1000,1001,1002,1003,1004,1005,1006,1007,1008 chöùa caùc trò 1B1, 1B3, 1B5, 1B7, 1B9, 2C0, 2C2, 2C4, 2C6. Xeùt caùc caâu leänh sau neáu hôïp leä haõy cho bieát keát quaû cuûa toaùn haïng ñích a. MOV DL, [1005] b. MOV DH , [SI] c. MOV BX, [SI + DI] d. MOV DX, [SI + 2] e. ADD AL, [SI] f. ADD [DI], [SI] g. SUB AX, BH h. ADD AL, [BX+DI] i. ADD AX, [BX+DI] j. SUB BX, [SI + 5] 21
- Chöông 3 CHÖÔNG TRÌNH GÔÕ ROÁI DEBUG I . GIÔÙI THIEÄU CAÙC CHÖÔNG TRÌNH GÔÕ ROÁI DEBUG: Caùc chöông trình soaïn thaûo vaên baûn chæ coù theå xem noäi dung cuûa caù taäp tin vaên baûn, khoâng theå xem noäi dung cuûa caùc taäp tin daïng nhò phaân, caùc taäp tin chöùa caùc leänh maõ maùy hay caùc taäp tin thi haønh ñöôïc ( coù teân môû roäng laø COM hay EXE ). Muoán xem noäi dung caùc taäp tin naøy ta phaûi duøng chöông trình gôõ roái debug. 1. Coâng duïng : Chöông trình gôõ roái debug laø 1 leänh ngoaïi truù cuûa DOS. Ñaây laø 1 chöông trình coù khaû naêng xaâm nhaäp ñeán caùc phaàn thaáp nhaát cuûa maùy tính. Noù coù caùc coâng duïng sau ñaây : X Cho pheùp thay ñoåi noäi dung moïi loaïi taäp tin : vaên baûn, nhò phaân vaø maõ maùy. X Cho pheùp dòch caùc leänh maõ maùy sang daïng gôïi nhôù vaø ngöôïc laïi X Cho pheùp vieát tröïc tieáp 1 ñoaïn chöông trình döôùi daïng maõ maùy hay döôùi daïng leänh gôïi nhôù. X Cho pheùp naïp vaø thöïc hieän caùc taäp tin thi haønh ñöôïc. Ñaëc bieät coù theå vöøa söûa vöøa thöïc hieän töøng böôùc chöông trình . X Cho pheùp truy xuaát vaø thay ñoåi töøng byte cuûa boä nhôù vaø noäi dung caùc thanh ghi cuûa CPU. 2. Caùch khôûi ñoäng : Phaàm meàm DEBUG coù theå khôûi ñoäng baèng 2 caùch : Caùch 1 : DEBUG Caùch 2 : DEBUG [ filename [ arglist ]] II. CAÙCH DUØNG CAÙC LEÄNH CUÛA CHÖÔNG TRÌNH DEBUG: 1. Caùc qui öôùc khi vieát cuù phaùp caâu leänh : X Chöõ ñaäm : laø teân leänh cuûa DEBUG. Phaûi nhaäp vaøo chính xaùc nhö trong taøi lieäu ghi. X Chöõ nghieâng : bieåu thò caùc tham soá cuûa caâu leänh DEBUG . X [ ] : caùc tham soá ñöôïc ñaët tronh 2 daáu [ ] laø tuøy choïn ( coù theå coù hoaëc khoâng ). 2. Caùc qui öôùc veà tham soá cuûa caâu leänh : X Drive : Laø moät giaù trò thaäp luïc phaân moät chöõ soá duøng ñeå chæ oå ñóa caàn truy 22
- xuaát. 0 bieåu thò oå ñóa A , 1 bieåu thò oå ñóa B, 2 bieåu thò oå ñóa C X Byte : laø moät giaù trò thaäp luïc phaân goàm 2 chöõ soá. X Value : Laø moät giaù trò thaäp luïc phaân goàm toái ña 4 chöõ soá . X Address : Goàm 2 phaàn ñöôïc ngaên caùch bôûi daáu ":", phaàn ñaàu laø teân thanh ghi ñoaïn ( CS, DS, ES, SS ) hay moät value chæ ñòa chæ ñoaïn. Phaàn thöù 2 laø moät value chæ ñòa chæ offset. Phaàn ñaàu coù theå coù hoaëc khoâng ( neáu khoâng coù thì khoâng caàn daáu ":") . X Range : coù 2 daïng Daïng 1 : Address1 Address2 bieåu thò moät vuøng nhôù baét ñaàu töø ñòa chæ address1 ñeán ñòa chæ address2 X String : laø moät chuoãi goàm moät daõy caùc kyù töï ñaët trong 2 daáu nhaùy keùp (”) hoaëc 2 daáu nhaùy ñôn (’). X List : laø moät daõy caùc byte hay caùc string . X Filename : laø teân taäp tin. Teân taäp tin coù theå goàm caû oå ñóa, teân ñöôøng daãn taäp tin (path) X Arglist : laø moät chuoãi caùc xaùc ñònh caùc tham soá caàn duøng cho taäp tin. Caùc tham soá ñöôïc phaân caùch nhau baèng moät hay nhieàu khoaûng traéng (hay Tab) 3. Caùc leänh cuûa DEBUG : a. Leänh D ( Dump ) : Cuù phaùp : D [ address ] hay D [ range ] Coâng duïng : Hieån thò noäi dung boä nhôù trong maùy tính ra maøn hình döôùi daïng thaäp luïc phaân. b. Leänh E ( Enter ) : Cuù phaùp : E address [ list ] Coâng duïng : Cho pheùp thay ñoåi noäi dung boä nhôù. Danh saùch thay theá cho trong list seõ ñöôïc thay vaøo vuøng nhôù taïi ñòa chæ do address quy ñònh . c . Leänh U ( Unassemble ) : Cuù phaùp : U [ address ] hay U [ range ] Coâng duïng : Hieån thò caùc leänh maõ maùy cuûa chöông trình trong boä nhôù ra maøn 23
- hình döôùi daïng leänh gôïi nhôù . d. Leänh A : Cuù phaùp : A [ address ] Coâng duïng : Cho pheùp vieát tröïc tieáp töø baøn phím caùc leänh maõ maùy döôùi daïng gôïi nhôù. DEBUG seõ chuyeån caùc töø gôïi nhôù naøy thaønh caùc maõ maùy töông öùng vaø löu tröõ trong boä nhôù taïi ñòa chæ do address quy ñònh . e. Leänh G ( Go ) Cuù phaùp : G [ = address1 ] [ address2 ] Coâng duïng : Thöïc hieän ñoaïn chöông trình trong boä nhôù baét ñaàu taïi ñòa chæ address1 vaø taïm döøng thöïc hieän khi chöông trình thöïc hieän ñeán ñòa chæ address2. Neáu khoâng coù address1 thì chöông trình seõ thöïc hieän baét ñaàu taïi ñòa chæ xaùc ñònh bôûi caëp thanh ghi CS:IP . Neáu khoâng coù address2 thì chöông trình seõ thöïc hieän cho ñeán khi gaëp leänh keát thuùc chöông trình. f .Leänh P (Proceed) vaø T (Trace) : Cuù phaùp : P [ = address ] [ value ] T [ = address ] [ value ] Coâng duïng : Duøng ñeå thöïc hieän töøng böôùc 1 hay nhieàu leänh baét ñaàu taïi ñiaï chæ do tham soá Address quy ñònh. Sau moãi leänh thì noäi dung caùc thanh ghi ñeàu hieän ra maøn hình. Value xaùc ñònh soá caùc leänh caàn thöïc hieän . X Neáu khoâng coù tham soá Address thì leänh P hay T thöïc hieän baét ñaàu taïi ñòa chæ xaùc ñònh bôûi caëp thanh ghi CS:IP. X Neáu khoâng coù Value thì chæ thöïc hieän 1 leänh. v Ñieåm khaùc nhau giöõa leänh P vaø leänh T laø : Leänh P xem leänh laëp, leänh goïi chöông trình con, leänh goïi ngaét laø 1 leänh duy nhaát. Coøn leänh T xem caùc leänh treân nhö laø1 taäp hôïp caùc leänh rieâng reõ khi thöïc hieän. Muoán thöïc hieàn töøng böôùc voøng laëp, töøng böôùc vaøo chöông trình con, vaøo ngaét ta phaûi duøng leänh t. g. Leänh M (Move) : Cuù phaùp : 24
- M range address Coâng duïng : Duøng ñeå sao cheùp noäi dung cuûa vuøng nhôù naøy sang vuøng nhôù khaùc. h. Leänh C (Compare) : Cuù phaùp : C range address Coâng duïng : Duøng ñeå so saùnh noäi dung 2 vuøng nhôù cuøng chieáu daøi. i. Leänh F (Fill) : Cuù phaùp : F range list Coâng duïng : Duøng ñeå ghi ñaày vuøng nhôù quy ñònh bôûi tham soá range baèng caùc trò cho trong danh saùch list j. Leänh S (Search) : Cuù phaùp : S range list Coâng duïng : Tìm danh saùch cho bôûi tham soá list trong vuøng nhôù range. k. Leänh R (Register) : Cuù phaùp : R [register – name] Coâng duïng : Cho pheùp xem hoaëc thay ñoåi noäi dung caùc thanh ghi cuûa CPU. Caùc teân thanh ghi ñöôïc duøng trong DEBUG : AX BX CX DX BP SP SI DI CS DS SS ES IP vaø F (thanh ghi côø) Caùc teân côø coù yù nghóa sau : Côø set clear OF OV NV DF DN UP IF EI DI SF NG PL ZF ZR NZ AF AC NA PF PE PO 25
- CF CY NC l. Leänh N (name) : Cuù phaùp : N filename [arglist] Coâng duïng : Duøng ñeå xaùc ñònh teân taäp tin caàn ñoïc hay ghi tröôùc khi duøng leänh L hay W m. Leänh L (Load) : Cuù phaùp : L [address] Coâng duïng : Naïp noäi dung taäp tin coù teân xaùc ñònh bôûi leänh N vaøo boä nhôù taïi ñòa chæ address. Caëp thanh ghi BX:CX seõ chöùa kích thöôùc taäp tin. Neáu khoâng coù tham soá address thì taäp tin ñöôïc naïp baét ñaàu taïi ñòa chæ CS:100 n. Leänh W (Write) : Cuù phaùp : W [address] Coâng duïng : Ghi moät vuøng nhôù coù ñòa chæ baét ñaàu do address quy ñònh, coù chieàu daøi ñöôïc cho trong caëp thanh ghi BX:CX leân 1 taäp tin coù teân xaùc ñònh bôûi leänh N. Neáu khoâng coù tham soá address thì taäp tin ñöôïc ghi baét ñaàu taïi ñòa chæ CS:100 o. Leänh H (Hex) : Cuù phaùp : H value1 value2 Coâng duïng : Hieån thò noäi dung pheùp coäng vaø tröø 2 soá thaäp luïc phaân ra maøn hình p. Leänh ? (Help) : Cuù phaùp : ? Coâng duïng : xem baûng trôï giuùp veà cuù phaùp caùc leänh cuûa DEBUG q. Leänh Q (Quit) : Cuù phaùp : Q Coâng duïng : Duøng ñeå chaám döùt chöông trình DEBUG vaø trôû veà heä ñieàu haønh 26
- BAØI TAÄP THÖÏC HAØNH DEBUG 1. Haõy khôûi ñoäng chöông trình DEBUG a. Duøng leänh E Haõy nhaäp ñoaïn vaên baûn sau vaøo boä nhôù taïi ñòa chæ DS:0100. 8086/8088/80286 Assembly language copyright 1988 by Brady Books, a division of Simon, Inc All rights reserved, inluding the right of reproduction in whole or in part, in any form Haõy löu ñoaïn vaên baûn treân vaøo taäp tin coù teân laø ASM.TXT. duøng leänh type ñeå xem laïi taäp tin ASM.TXT coù goõ ñuùng chöa ? Neáu chöa ñuùng haõy söûa laïi baèng DEBUG cho ñuùng. Chuù yù, kyù töï ñaàu doøng vaø xuoáng doøng coù maõ ASCII laø 0d, 0a. b. Haõy ñoåi töø Simon thaønh Jason c. Haõy cheøn theâm töø /80386/80486 sau töø 80286. Kieåm tra laïi caùc keát quaû. 2. Duøng leänh A ñeå vieát ñoaïn chöông trình maõ maùy döôùi daïng gôïi nhôù baét ñaàu taïi ñòa chæ CS:100 coù noäi dung nhö sau : MOV AL , FF ADD AL, 1 SUB AL , 2 MOV DL , AL ADD DL , 2 Duøng leänh P ñeå thöïc hieän töøng böôùc chöông trình, cho bieát noäi dung caùc thanh ghi vaø noäi dung caùc côø ZF, CF caø SF sau moãi leänh. 3. Duøng leänh E cuûa DEBUG vieát 1 chöông trình maõ maùy baét ñaàu taïi ñòa chæ CS:100 coù noäi dung nhö sau : 1E 33 C0 8E D8 A0 10 04 1F 24 30 BB 00 B0 3C 30 74 03 BB 00 B8 8E C3 E8 2B 00 BA 16 0A 33 DB E8 2C 00 C6 06 CD 01 1E 90 C6 06 CE 01 05 90 E8 32 00 BA 1E 0C 33 DB E8 15 00 B9 10 00 90 BE CF 01 E8 83 00 CD 20 B9 D0 07 B8 20 07 F3 AB C3 50 B0 50 F6 E6 32 F6 03 C2 D1 E0 8B F8 B1 0C D3 E3 03 FB 58 C3 51 57 B4 70 B0 DA AB 8A 0E CD 01 32 ED 83 E9 02 B0 C4 F3 AB B0 BF AB 5F 59 81 C7 A0 00 8A 0E CE 01 32 ED 83 E9 02 51 57 B4 70 B0 B3 AB 8A 0E CD 01 32 ED 83 E9 02 B0 20 F3 AB B0 B3 AB 5F 59 81 C7 A0 00 E2 E1 51 57 B4 70 B0 C0 AB 8A 0E CD 01 32 ED 83 E9 02 B0 C4 F3 AB B0 D9 AB 5F 59 81 C7 A0 00 C3 B4 07 AC AB E2 FC C3 00 00 48 65 6C 6C 6F 20 20 41 73 73 65 6D 62 6C 65 72 Haõy löu chöông trình naøy vaøo taäp tin coù teân hello.com. Duøng leänh U ñeå xem caùc leänh maõ maùy treân döôùi daïng gôïi nhôù. Duøng leänh G ñeå thöïc hieän chöông trình treân. Neáu goõ ñuùng chöông trình thì moät khung chöõ nhaät trong ñoù coù doøng chöõ “Hello Assembler” seõ hieån thò ôû giöõa maøn hình. Cuoái cuøng duøng leänh Q ñeå thoaùt khoûi DEBUG. 4. Khôûi ñoäng laïi chöông trình DEBUG vaø naïp taäp tin hello.com vaøo boä nhôù. a. Duøng leänh S ñeå tìm xem X Coù bao nhieâu trò 57 trong taäp tin X Coù bao nhieâu daõy caùc byte 32 ed 83 e9 trong taäp tin . X Coù bao nhieâu chuoãi “Hello” trong taäp tin . b. Haõy thay theá chuoãi : “Hello Assembler“ trong taäp tin thaønh chuoãi “Xin chao hop ngu“. 27
- c. Duøng leänh G thöïc hieän laïi chöông trình hello. d. Duøng leänh M sao cheùp taäp tin treân sang vuøng gôïi nhôù coù ñòa chæ 9000:1000. Naïp laïi taäp tin hello.com vaøo boä nhôù taïi ñòa chæ cs:100. Duøng leänh C ñeå so saùnh noäi dung cuûa taäp tin hello.com vôùi noäi dung vuøng nhôù taïi ñòa chæ 9000:1000. Ruùt ra nhaän xeùt. e. Löu noäi dung vuøng nhôù taïi ñòa chæ 9000:1000 vôùi soá byte baèng chieàu daøi cuûa taäp tin hello.com vaøo taäp tin coù teân chao.com. Duøng leänh Q ñeå keát thuùc chöông trình DEBUG. 5. Khôûi ñoäng laïi chöông trình DEBUG vaø naïp taäp tin chao.com vaøo boä nhôù . a. Duøng leänh P ñeå thöïc hieän töøng böôùc chöông trình cho ñeán khi gaëp leänh keát thuùc chöông trình INT 20 Leänh Call laø leänh goïi chöông trình con. Haõy ruùt ra yù nghóa cuûa caùc leänh goïi chöông trình con sau : Leänh CALL 145 taïi ñòa chæ CS:117 Leänh CALL 163 taïi ñòa chæ CS:12E Leänh CALL 1C6 taïi ñòa chæ CS:140 b. Haõy duøng leänh E ñeå söûa laïi chuoãi “Hello Assembler“ thaønh chuoãi “Xin chuc cac ban mot nam moi tot dep“ vaø duøng leänh A söûa leänh MOV CX , 10 taïi ñòa chæ CS:139 thaønh leänh MOV CX , 24 . Duøng leänh G thöïc hieän laïi chöông trình ta seõ thaáy keát quaû khaùc tröôùc. Haõy ruùt ra nhaän xeùt veà con soá 24 trong leänh MOV CX , 24. c. Luùc naøy ta thaáy moät phaàn chuoãi “Xin chuc cac ban mot nam moi tot dep“ naèm ngoaøi khung. Haõy chænh laïi chieàu daøi cuûa khung ñeå chuoãi treân naèm hoaøn toaøn trong khung. Duøng leänh G ñeå kieåm tra laïi keát quaû . Chuù yù : Chieàu daøi cuûa khung cho trong caâu leänh MOV byte ptr [ 01CD ] , 1E taïi ñòa chæ CS:122. Löu chöông trình môùi söûa treân vaøo taäp tin coù teân môùi nammoi.com d. Haõy söûa laïi vò trí cuûa khung vaø vò trí cuûa chuoãi ñeå khung hieän ra taïi goùc traùi döôùi cuûa maøn hình. ( HD : vò trí khung vaø vò trò chuoãi cho trong 2 leänh ôû ñòa chæ 11A vaø 131 nhö sau : 11A MOV DX , 0A16 131 MOV DX , 0C1E Haõy söûa laïi 2 doøng leänh treân cho phuø hôïp) 6. Duøng DEBUG haõy caét ñoâi taäp tin hello.com vaø ghi laàn löôït sang 2 taäp tin coù teân laø hello1.dat vaø hello2.dat. 7. Duøng DEBUG haõy noái 2 taäp tin hello1.dat vaø hell02.dat thaønh taäp tin duy nhaát hello3.dat. 8. Duøng DEBUG haõy so saùnh xem 2 taäp tin hello3.dat vaø hello.com coù gioáng nhau hay khoâng ? 28
- Chöông 4 TOÅNG QUAN VEÀ HÔÏP NGÖÕ I. GIÔÙI THIEÄU HÔÏP NGÖÕ : Hôïp ngöõ ( Assembly Language ) laø ngoân ngöõ laäp trình caáp thaáp gaàn vôùi daïng gôïi nhôù cuûa ngoân ngöõ maùy. Assembler laø chöông trình dòch caùc chöông trình vieát baèng hôïp ngöõ sang maõ maùy. Caùc chöông trình dòch thoâng duïng hieän nay laø Macro Assembler cuûa haõng Microsoft vaø Turbo Assembler cuûa haõng Borland. Hôïp ngöõ ñöôïc giôùi thieäu trong giaùo trình naøy döïa vaøo caùc quy ñònh cuûa chöông trình dòch Macro Assembler 5.0 II. CAÙC PHAÀN CÔ BAÛN CUÛA HÔÏP NGÖÕ : 1. Taäp tin hôïp ngöõ nguoàn (Assembler language soure file) : Taäp tin hôïp ngöõ nguoàn laø taäp tin goàm moät taäp hôïp caùc phaùt bieåu hôïp ngöõ (Assembler language Statement). Moãi phaùt bieåu ñöôïc vieát treân moät doøng, noù coù theå laø moät leänh hôïp ngöõ (Assembler Language Instruction) hay moät chæ daãn hôïp ngöõ ( Assembler directive). Caùc leänh hôïp ngöõ gaàn gioáng nhö caùc leänh gôïi nhôù cuûa CPU, noù xaùc ñònh caùc haønh ñoäng maø CPU seõ thöïc hieän. Khi Assembler dòch moät taäp tin hôïp ngöõ nguoàn thì moãi leänh hôïp ngöõ seõ ñöôïc dòch sang moät leänh maõ maùy töông öùng. Ngöôïc laïi caùc chæ daãn chæ laø leänh cuûa Assembler, khoâng phaûi laø leänh cuûa CPU. Caùc chæ daãn chæ laø caùc khai baùo duøng ñeå höôùng daãn trình bieân dòch Assembler thöïc hieän moät vaøi nhieäm vuï ñaëc bieät naøo ñoù khi dòch moät taäp tin hôïp ngöõ nguoàn sang maõ maùy. 2. Boä kyù töï cuûa hôïp ngöõ, töø khoùa, teân : a. Boä kyù töï : Hôïp ngöõ ñöôïc xaây döïng döïa vaøo caùc kyù töï sau : X Boä 26 chöõ caùi La tinh : 26 chöõ caùi lôùn : A - Z 26 chöõ caùi nhoû : a - z X Boä chöõ soá thaäp phaân : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. X Caùc kyù töï ñaëc bieät nhö : ? @ _ $: . [ ] ( ) { } + - / * & % ! ‘ ~ | \ = # ^ ; , “ Caùc kyù töï ngaên caùch goàm khoaûng traéng vaø tab. 29
- b. Töø vöïng : X Teân ( Symbol Name ) : goàm moät caùc daõy kyù töï duøng ñeå bieåu thò teân haèng, teân bieán, teân nhaõn, teân chöông trình con, teân ñoaïn Teân do ngöôøi laäp trình ñaët. Moät teân coù theå chöùa : w Caùc kyù töï chöõ caùi hoa vaø thöôøng A - Z vaø a - z, Assembler khi dòch khoâng phaân bieät chöõ hoa vaø thöôøng w Caùc chöõ soá : 0-9 w Caùc kyù töï ñaëc bieät : (. ), ( ? ), ( @ ), ( _ ), ( $ ). Kyù töï ñaàu tieân cuûa teân khoâng theå laø kyù töï soá maø phaûi laø kyù töï chöõ hoaëc caùc kyù töï ñaëc bieät ñeå Assembler coù theå phaân bieät söï khaùc nhau giöõa teân vaø soá. Daáu “.” khoâng theå duøng trong moät teân, chæ coù theå duøng laøm kyù töï ñaàu cuûa teân. Khi ñaët teân, hôïp ngöõ khoâng phaân bieät chöõ hoa vaø chöõ thöôøng. X Töø khoùa (keyword) : Laø teân daønh rieâng cuûa hôïp ngöõ nhö teân caùc thanh ghi, teân gôïi nhôù leänh , teân caùc toaùn töû Caùc töø khoùa naøy ñoøi hoûi ngöôøi laäp trình khi duøng phaûi vieát ñuùng nhö Assembler quy ñònh. Khoâng theå ñaët teân môùi truøng teân vôùi caùc töø khoùa cuûa Assembler. Ñeå cho chöông trình saùng suûa teân neân ñöôïc ñaët sao cho coù yù nghóa ñoái vôùi nhieäm vuï cuï theå. 3. Caáu truùc moät leänh hôïp ngöõ : Moät leänh hôïp ngöõ goàm 4 phaàn sau : [ nhaõn: ] [ teân gôïi nhôù ] [ toaùn haïng ] [ ;ghi chuù ] a. Nhaõn (label) : Moät caâu leänh coù theå coù moät nhaõn ñöùng tröôùc. Nhaõn laø 1 teân ñaët tröôùc daáu (:) duøng ñeå thay theá ñòa chæ caâu leänh. b. Teân gôïi nhôù (Mnemonic) : Teân gôïi nhôù xaùc ñònh haønh ñoäng cuûa caâu leänh. moãi teân gôïi nhôù goàm 2 ñeán 7 kyù töï. c. Toaùn haïng (operand) : Toaùn haïng xaùc ñònh caùc döõ lieäu maø caâu leänh caàn xöû lyù. Toaùn haïng coù theå goàm caùc daïng sau : X Haèng (Constant) : Laø giaù trò khoâng ñoåi duøng trong chöông trình. X Thanh ghi : Taát caû teân caùc thanh ghi cuûa CPU ñeàu coù theå duøng trong phaàn toaùn haïng cuûa 1 leänh hôïp ngöõ. 30
- X Teân töôïng tröng (symbol) : Laø moät teân duøng ñeå bieåu thò teân haèng, teân bieán, teân nhaõn, teân ñoaïn, teân chöông trình con, teân Macro, teân Record vaø Structure. X Bieåu thöùc (Expression) : Bieåu thöùc cho ta moät coâng thöùc tính toaùn moät giaù trò theo moät quy taéc toaùn hoïc. d. Vuøng chuù thích ( comment ) : Vuøng naøy luoân baét ñaàu baèng daáu chaám phaåy ( ; ), duøng ñeå ghi chuù hay giaûi thích yù nghóa cuûa 1 hay nhieàu caâu leänh ñeå ngöôøi laäp trình deã daøng tham khaûo, ñoïc vaø hieåu chöông trình. Assembler seõ boû qua phaàn naøy khi dòch. 4. Caùc daïng haèng duøng trong hôïp ngöõ : Assembler cho pheùp duøng caùc daïng haèng soá sau : a. Nhò phaân : Goàm moät daõy caùc chöõ soá 1 vaø 0 keát thuùc baèng kyù töï B. b. Thaäp phaân : Goàm moät daõy caùc chöõ soá töø 0 ñeán 9, coù theå coù theâm kyù töï + hay - ñeå bieåu thò daáu. coù theå keát thuùc baèng kyù töï D hoaëc khoâng caàn. c. Thaäp luïc phaân : Goàm moät daõy caùc chöõ soá töø 0 ñeán 9 vaø caùc kyù töï töø A-F (a-f), keát thuùc baèng kyù töï H. Kyù töï ñaàu tieân cuûa soá thaäp luïc phaân phaûi laø kyù töï soá. Neáu kyù töï ñaàu khoâng phaûi laø soá thì ta phaûi theâm soá 0 vaøo. d. Chuoãi : Goàm moät daõy caùc kyù töï naèm giöõa 2 daáu ( ‘ ) hay ( “ ) 5. Chæ daãn (Directive) : Gioáng nhö caùc leänh hôïp ngöõ, moät chæ daãn cuõng goàm 4 phaàn : [ teân ] teân-gôïi-nhôù [ toaùn haïng ] [ chuù thích ] Moãi phaàn ñöôïc taùch nhau baèng moät hoaëc nhieàu kyù töï ngaên caùch. III. KHAI BAÙO DÖÕ LIEÄU : 1. Khai baùo haèng baèng teân töôïng tröng : Assembler cung caáp 2 chæ daãn EQU vaø = ñeå khai baùo haèng. a. Chæ daãn EQU (equates): name EQU expression name EQU 31
- Chöùc naêng : chæ daãn EQU ñònh nghóa teân töôïng tröng name vaø gaùn trò cuûa bieåu thöùc haèng expression hay vaên baûn text cho name. b. Chæ daãn = : name = expression Chöùc naêng : Chæ daãn = cho pheùp ñinh nghóa hay ñònh nghóa laïi teân töôïng tröng name vaø gaùn trò cuûa bieåu thöùc expression cho name. directive = gioáng nhö EQU nhöng noù coù theå gaùn laïi trò cho name nhieàu laàn. 2. Khai baùo bieán : Taát caû caùc döõ lieäu duøng trong chöông trình phaûi ñöôïc khai baùo. Caùc döõ lieäu coù theå laø soá, kyù töï, chuoãi hay moät bieåu thöùc coù trò xaùc ñònh. Assembler cung caáp 3 chæ daãn DB, DW, DD ñeå khai baùo döõ lieäu. [ name ] DB data [, .] [ name ] DW data [, ] [ name ] DD data [, ] w DB : Duøng ñeå khai baùo döõ lieäu daïng byte w DW : Duøng ñeå khai baùo döõ lieäu daïng word w DD : Duøng ñeå khai baùo döõ lieäu daïng doubeword ( byte ) Name laø moät teân duøng ñeå truy xuaát vuøng döõ lieäu. Data : quy ñònh giaù trò ban ñaàu cuûa vuøng döõ lieäu. a. Khai baùo bieán ( byte, word, doubleword ) Bieán laø moät vuøng nhôù coù teân duøng ñeå chöùa döõ lieäu. Moãi bieán ñeàu coù moät ñòa chæ trong boä nhôù. Muoán truy xuaát giaù trò cuûa bieán ta chæ caàn duøng teân bieán trong caâu leänh. * Toaùn töû ? : Muoán khai baùo moät bieán maø khoâng caàn khôûi ñoäng trò ta duøng toaùn töû ?. Luùc ñoù giaù trò ban ñaàu cuûa bieán laø khoâng xaùc ñònh, noù phuï thuoäc vaøo noäi dung cuûa bieán naøy trong boä nhôù luùc Assembler dòch. * Caùch truy xuaát moät bieán : Bieán ñöôïc truy xuaát thoâng qua teân bieán. Ví duï : Muoán gaùn bieán i trò laø 100 ta duøng leänh MOV [i], 100 hay MOV i, 100 b. Khai baùo vuøng nhôù : Moät vuøng nhôù goàm moät taäp hôïp caùc oâ nhôù hay caùc töø nhôù. Toång soá byte cuûa vuøng nhôù goïi laø chieàu daøi vuøng nhôù. Moät vuøng nhôù ñöôïc xaùc ñònh baèng teân vuøng nhôù vaø chieàu daøi vuøng nhôù. 32
- Ví duï : Khai baùo vuøng nhôù A goàm 10 oâ nhôù coù trò laàn löôït laø 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 A DB 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 Caùc oâ nhôù cuûa vuøng nhôù truy xuaát thoâng qua teân vuøng nhôù A vaø caùc chæ soá. Teân A bieåu thò oâ nhôù ñaàu tieân, A+1 bieåu thò oå nhôù thöù hai, , A + 9 bieâuû thò oâ nhôù thöù möôøi. Muoán khai baùo vuøng nhôù goàm nhieàu oâ nhôù hay töø nhôù ta phaûi duøng toaøn töû DUP. * Toaùn töû DUP (Duplicate) : Cuù phaùp : count DUP ( data [, ] ) Duøng ñeå laëp caùc döõ lieäu vôùi soá laàn quy ñònh bôûi count. Chuù yù : Toaùn töû DUP coù theå loàng nhau c. Khai baùo moät chuoãi : Chuoãi ñöôïc khai baùo baèng chæ daãn DB. Chuoãi ñöôïc xaùc ñònh thoâng qua teân chuoãi, chieàu daøi chuoãi hay moät kyù töï duøng ñeå keát thuùc chuoãi. Gioáng nhö vuøng nhôù chuoãi cuõng ñöôïc truy xuaát thoâng qua teân chuoãi vaø caùc chæ soá. IV. KHAI BAÙO ÑOAÏN : 1. Khai baùo toaøn phaàn : v Chæ daãn Segment : Ñoaïn ñöôïc khai bao baèng chæ daãn segment vaø ends : Cuù phaùp : name SEGMENT [ align-type] [ combine-type] [‘class’] name ENDS 2. Khai baùo ñôn giaûn hoùa : Khai baùo naøy chæ duøng ñöôïc vôùi trình bieân dòch Macro Assembler 5.0 trôû leân. a. Chæ daãn .Model: Kích thöôùc cuûa ñoaïn maõ vaø döõ lieäu trong moät chöông trình ñöôïc xaùc ñònh baèng chæ daãn .Model. 33
- Cuù phaùp : .Model cheá_ñoä_boä_nhôù Caùc cheá ñoä boä nhôù goàm : tiny, small, medium, compact vaø large Small Chöông trình trong 1 ñoaïn, döõ lieäu trong 1 ñoaïn Medium Chöông trình coù theå nhieàu hôn 1 ñoaïn, Döõ lieäu trong 1 ñoaïn. Compact Chöông trình trong 1 ñoaïn, Döõ lieäu coù theå nhieàu hôn 1 ñoaïn. Large Chöông trình vaø Döõ lieäu coù theå nhieàu hôn 1 ñoaïn. 2. Khai baùo ñoaïn döõ lieäu : Ñoaïn döõ lieäu ñöôïc khai baùo baèng chæ daãn .Data theo sau laø caùc khai baùo bieán hay haèng. 3. Khai baùo ñoaïn Stack : Ñoaïn stack ñöôïc khai baùo baèng chæ daãn .Stack theo sau laø kích thöôùc stack (tính theo byte). Cuù phaùp : .Stack [stack_size] Neáu khoâng khai baùo kích thöôùc thì trò ñònh saün laø 1024 byte 4. Khai baùo ñoaïn chöông trình : Ñoaïn chöông trình ñöôïc khai baùo baèng chæ daãn .code Cuù phaùp : .Code [name] Phöông phaùp khai baùo ñôn giaûn ngaén goïn hôn khai baùo toaøn phaàn. Tuy nhieân vôùi khai baùo ñôn giaûn ngöôøi laäp trình khoâng ñieàu khieån ñöôïc vò trí, söï lieân keát vaø thöù töï vaø cuûa caùc ñoaïn trong boä nhôù. IV. Caùc toaùn töû (operator) duøng trong assembler : Toaùn töû thöôøng ñöôïc duøng trong caùc bieåu thöùc soá hoïc. Ñieåm quan troïng ñeå phaân bieät söï khaùc nhau giöõa toaùn töû vaø leänh laø : X Toaùn töû ñieàu khieån söï tính toaùn caùc bieåu thöùc haèng xaùc ñònh luùc dòch. X Leänh ñieàu khieån söï tính toaùn caùc bieåu thöùc coù theå coù trò khoâng xaùc ñònh ñöôïc cho ñeán khi chöông trình thöïc hieän. Assembler cung caáp caùc toaùn töû sau : 34
- § Caùc toaùn töû soá hoïc : toaùn töû cuù phaùp coâng duïng + +exp döông - -exp aâm * exp1*exp2 nhaân / exp1/exp2 chia mod exp1 mod exp2 phaàn dö + exp1 + exp2 coäng - exp1 - exp2 tröø shl exp shl count dòch exp sang traùi count bit shr exp shr count dòch exp sang phaûi count bit Trong ñoù exp, exp1, exp2 laø caùc bieåu thöùc haèng, count laø soá nguyeân. § Caùc toaùn töû logic : toaùn töû cuù phaùp not not exp and exp1 and exp2 or exp1 or exp2 xor exp1 xor exp2 § Nhoùm cung caáp thoâng tin veà bieán vaø nhaõn : X Toaùn töû SEG : SEG expression Cho ñòa chæ ñoaïn cuûa bieåu thöùc expression. Expression coù theå laø moät bieán, nhaõn, teân SEGMENT, teân GROUP hay caùc toaùn haïng boä nhôù khaùc. X Toaùn töû OFFSET : OFFSET expression Cho ñòa chæ offset cuûa bieåu thöùc expression. Expression coù theå laø moät bieán, nhaõn hoaëc caùc toaùn haïng boä nhôù tröïc tieáp khaùc. X Toaùn töû chæ soá [ ] ( index operator ) : Cuù phaùp : [ expression ] Toaùn töû chæ soá gioáng nhö toaùn töû + ñòa chæ. Toaùn töû chæ soá thöôøng duøng trong caùc pheùp ñònh ñòa chæ boä nhôù X Toaùn töû (:) ( segment override operator ) : Cuù phaùp: segment:expression 35
- Segment coù theå laø teân caùc thanh ghi ñoaïn CS, DS, ES, SS, hay teân ñoaïn, teân GROUP ñaõ khai baùo. Expression coù theå laø moät haèng soá hay moät bieåu thöùc. Chöùc naêng : toaùn töû (:) chæ roõ ñòa chæ ñoaïn cuûa toaùn haïng boä nhôù expression ñöôïc xaùc ñònh thoâng qua tham soá segment. X Toaùn töû $ : Cho ñòa chæ offset cuûa phaùt bieåu chöùa toaùn töû $ ñoù. Thöôøng toaùn töû $ duøng ñeå tính ñoä daøi cuûa moät chuoãi. Ví duï : Stg DB ‘To count every byte in a string’ DB ‘ especially if you might change it later’ len EQU $ - offset Stg § Nhoùm thuoäc tính : X Toaùn töû PTR ( pointer ) : Cuù phaùp : type PTR expression Cho pheùp thay ñoåi daïng cuûa bieåu thöùu expression. w Neáu expression laø moät bieán hay moät toaùn haïng boä nhôù thì type coù theå laø byte,word hay dword. w Neáu expression laø moät nhaõn thì type coù theå laø near hay far. V. Caùc chæ daãn ñieàu khieån (control directive) : 1. Directive END : Cuù phaùp : END [ Start_address ] Directive END baùo cho Assembler bieát chöông trình keát thuùc taïi vò trí END naøy. Start_address laø 1 nhaõn xaùc ñònh ñieåm baét ñaàu cuûa chöông trình maø DOS seõ thi haønh. Chuù yù : X Moãi taäp tin hôïp ngöõ nguoàn ñeàu phaûi chöùa moät chæ daãn END. X Neáu chöông trình goàm nhieàu module naèm taùch rôøi treân nhöõng taäp tin khaùc nhau, thì ta chæ coù theå ñònh nghóa Start_address sau chæ daãn END trong phaàn chöông trình chính (main module). 2. Chæ daãn ORG : Cuù phaùp : ORG expression Chæ daãn ORG duøng ñeå baùo cho Assembler bieát caùc maõ leänh vaø döõ lieäu ngay sau chæ daãn ORG seõ ñöôïc naïp vaøo boä nhôù baét ñaàu taïi ñòa chæ offset môùi xaùc ñònh bôûi bieáu thöùc expression. Ví duï : ORG 100h 36
- 3. Chæ daãn Mode : Vì Macro Assmbler laø chöông trình dòch cho caû CPU 8086/8088/80286/80386, do ñoù Mode directive duøng ñeå baùo cho Assmbler bieát chöông trình muoán dòch ñoái vôùi CPU loaïi naøo, neáu khoâng duøng Mode directive thì MASM seõ dòch chöông trình ñoái vôùi CPU 8086/8088. .8086 : Chæ cho pheùp dòch caùc leänh cuûa CPU 8086/8088 vaø boä vi xöû lyù toaùn hoïc 8087. .286 : Cho pheùp dòch caùc leänh cuûa CPU 8086/8088/80286 vaø boä vi xöû lyù toaùn hoïc 80287. .386 : Cho pheùp dòch caùc leänh cuûa CPU 8086/88/286/386 vaø boä vi xöû lyù toaùn hoïc 80387. VI. TAÄP TIN COM VAØ EXE : DOS chæ coù theå thi haønh ñöôïc 2 loaïi taäp tin maõ maùy : Taäp tin daïng EXE vaø daïng COM. Taäp tin daïng EXE thöôøng duøng ñeå duøng xaây döïng nhöõng chöông trình lôùn, coøn taäp tin daïng COM taïo caùc chöông trình nhoû. MASM cho pheùp taïo caû 2 daïng EXE vaø COM. 1. Taäp tin daïng COM : a. Ñaëc ñieåm cuûa taäp tin COM : X Chæ coù duy nhaát moät ñoaïn. chöông trình, döõ lieäu, stack duøng chung moät ñoaïn. X Kích thöôùc toái ña cuûa taäp tin daïng COM laø 64KB b. Caáu truùc cuûa chöông trình daïng COM : Xeùt ví duï ñôn giaûn : chöông trình hello1.asm. Hieån thò chuoãi "Hello Assembler" ra maøn hình * Phöông phaùp duøng kieåu khai baùo toaøn phaàn : code SEGMENT ASSUME CS : code, DS : code ORG 100H Begin : MOV AH, 9 MOV DX, OFFSET mess INT 21H ; goïi haøm 09 cuûa DOS ñeå hieån thò chuoãi hello ra maøn hình INT 20H ; thoaùt khoûi chöông trình trôû veà DOS mess DB ‘Hello Assembler$’ code ENDS 37
- END begin * Phöông phaùp duøng kieåu khai baùo ñôn giaûn : .Model small .code ORG 100H Begin : MOV AH, 9 MOV DX, OFFSET mess INT 21H ; goïi haøm 09 cuûa DOS ñeå hieån thò chuoãi hello ra maøn hình INT 20H ; thoaùt khoûi chöông trình trôû veà DOS mess DB ‘Hello Assembler$’ END begin 2. Taäp tin daïng EXE : a. Ñaëc ñieåm : X Chöông trình coù theå khai baùo nhieàu ñoaïn khaùc nhau. Moãi chöông trình coù theå coù nhieàu ñoaïn chöông trình, nhieàu ñoaïn döõ lieäu vaø nhieàu ñoaïn Stack. X Kích thöôùc taäp tin coù theå lôùn tuøy yù X Taäp tin daïng EXE coù moät header ôû ñaàu taäp tin. Header naøy chöùa caùc thoâng tin ñieàu khieån veà taäp tin ñeå DOS coù theå naïp noù vaøo boä nhôù vaø thöïc hieän. Kích thöôùc cuûa header phuï thuoäc vaøo soá caùc leänh trong chöông trình caàn ñeå ñònh vò laïi caùc ñòa chæ ñoaïn khi chöông trình ñöôïc naïp, nhöng noù luoân laø boäi soá cuûa 512 byte. b. Caáu truùc cuûa chöông trình daïng EXE : Vieát laïi ví duï hieån thò chuoãi "Hello Assembler" ra maøn hình duôùi daïng * Phöông phaùp khai baùo toaøn phaàn : stack SEMENT STACK DW 80 dup( ? ) stack ENDS data SEMENT mess DB ‘ hello Assembler$‘ data ENDS code SEGMENT ASSUME CS:code, DS:data 38
- Begin: MOV AX, SEG data MOV DS, AX MOV AH, 9 MOV DX, OFFSET mess INT 21H ; goïi haøm 09 ngaét DOS hieån thò chuoãi Hello ra maøn hình MOV AX, 4c00h INT 21H ; thoaùt khoûi chöông trình trôû veà DOS. Code ENDS END begin * Phöông phaùp khai baùo ñôn giaûn: .stack .Data mess DB ‘ hello Assembler$‘ .code Begin: MOV AX, @data MOV DS, AX MOV AH, 9 MOV DX, OFFSET mess INT 21H ; goïi haøm 09 ngaét DOS hieån thò chuoãi Hello ra maøn hình MOV AX, 4c00h INT 21H ; thoaùt khoûi chöông trình trôû veà DOS. END begin VIII. MACRO ASSEMBLER 5.1 : Trong giaùo trình naøy ta duøng chöông trình dòch Macro Assmbler cuûa haõng Microsoft version 5.1. Boä dòch naøy caàn 2 taäp tin : MASM.EXE : Dòch taäp tin hôïp ngöõ nguoàn sang taäp tin maõ maùy daïng Object töông öùng (coù teân môû roäng OBJ) LINK.EXE : Lieân keát caùc taäp tin maõ maùy daïng Object thaønh taäp tin thi haønh ñöôïc daïng EXE hay COM. 39
- CAÂU HOÛI OÂN TAÄP 1. Hôïp ngöõ laø gì ? Taïi sao phaûi hoïc hôïp ngöõ ? 2. Haõy phaân bieät söï khaùc nhau giöõa caâu leänh hôïp ngöõ vaø chæ daãn hôïp ngöõ. 3. Caùc khai baùo bieán var1, vaar2, var3 sau chieàm bao nhieâu byte trong boä nhôù ? var1 DB ?, ? var2 DW 4 dup( ? ), 20 var3 DB 10 dup( 5 dup( ? )) 4. Cho ñoaïn data chöùa döõ lieäu sau : data SEGMENT table1 DB 10, 34, 56, 89, 56, 91, 45, 156 DB 200, 234 table2 DW 1234H, 2A34H, 32BH, 145H, 0102H DW 0ABCDH, 3A4BH, 0001H, 0AH, 04A5H table3 DD 12345678H, 0FA12H, 10H, 123H DD 4A60H, 0B2CD3456H DD 12367ABD3H, 34B12345H data ENDS Haõy tính noäi dung cuûa caùc thanh ghi AL vaø DX trong caùc caâu leänh sau : MOV AX, SEG data MOV DS, AX MOV BX, 2 MOV SI, 3 MOV DI, 1 a. MOV AL, table1 + 3 MOV AL, table1[ BX ] 40
- MOV AL, table1[ BX +DI + 3 ] b. MOV AL, byte ptr table2 MOV AL, byte ptr table2 + 1 MOV DX, byte ptr table2 + 2 c. MOV DX, table2[ BX ] MOV DX, table2[ BX +SI ] MOV DX, table2[ BX +DI + 3 ] d. MOV AL, byte ptr table2[ BX ] MOV AL, byte ptr table2[ BX + SI +1 ] MOV AL, byte ptr table2[ BX + DI + 4 ] e. MOV DX, WORD ptr table3 MOV DX, WORD ptr table3[ BX + SI ] MOV DX, WORD ptr table3[ BX + DI +1 ] MOV DX, BYTE ptr table3[ BX + SI +1 ] 41
- CHÖÔNG 5 : LAÄP TRÌNH HÔÏP NGÖÕ I. CAÙC LEÄNH CÔ BAÛN : 1. Leänh Move : Cuù phaùp : MOV dest, source Toaùn haïng dest coù theå laø thanh ghi/boä nhôù Toaùn haïng source coù theå laø haèng/thanh ghi/boä nhôù Chöùc naêng : chuyeån noäi dung toaùn haïng source vaøo toaùn haïng dest · Ghi chuù : - Leänh mov khoâng aûnh höôûng thanh ghi côø - 2 toaùn haïng dest vaø source phaûi cuøng kích thöôùc - Trong moät caâu leänh khoâng theå caû 2 toaùn haïng ñeàu laø boä nhôù - Khoâng theå chuyeån moät thanh ghi ñoaïn vaøo thanh ghi ñoaïn - Khoâng theå chuyeån moät haèng vaøo thanh ghi ñoaïn - Thanh ghi ñoaïn CS khoâng theå laøm toaùn haïng ñích 2 . Leänh XCHG ( exchange ) : Cuù phaùp : XCHG dest , source Toaùn haïng source vaø dest chæ coù theå laø thanh ghi hay boä nhôù Chöùc naêng : Hoaùn chuyeån noäi dung cuûa 2 toaùn haïng nguoàn vaø ñích. ví duï : Giaû söû A, B laø 2 bieán daïng word, vieát chöông trình hoaùn chuyeån noäi dung 2 bieán A vaø B MOV AX, A XCHG AX, B MOV A, AX 3 . Leänh PUSH : Cuù phaùp : PUSH source Toaùn haïng source coù theå laø thanh ghi, boä nhôù hay moät haèng 16 bit Chöùc naêng : Llöu noäi dung toaùn haïng source 16bit vaùo STACK. 42
- Leänh PUSH töï ñoäng giaûm thanh ghi SP 2 ñôn vò vaø chuyeån noäi dung 16 bit cuûa toaùn haïng source vaøo treân ñænh cuûa STACK. Ñænh STACK ñöôïc xaùc ñònh bôûi caëp thanh ghi SS:SP 4 . Leänh POP : POP dest Toaùn haïng dest coù theå laø thanh ghi hay boä nhôù 16 bit Chöùc naêng : Ngöôïc vôùi leänh PUSH, POP laáy döõ lieäu 16 bit ñang hieän haønh treân ñænh cuûa STACK (ñöôïc xaùc ñònh bôûi caëp thanh ghi SS:SP ) vaø löu vaøo toaùn haïng dest. Leänh POP töï ñoäng taêng thanh ghi SP leân 2 ñôn vò ñeå chæ ñeán ñænh môùi cuûa STACK. Ví duï : Duøng leänh PUSH vaø POP ñeå chuyeån thanh ghi ñoaïn CS vaøo thanh ghi ñoaïn DS. PUSH CS POP DS X Giaûi thích caùch hoaït ñoäng cuûa STACK : Caùc hình veõ sau seõ giaûi thích caùch hoaït ñoäng cuûa STACK tröôùc vaø sau 1 leänh POP. Giaû söû thanh ghi con troû Stack SP coù giaù trò 1FE (A) STACK tröôùc khi PUSH CS (B) STACK sau khi PUSH CS 43
- (C) STACK sau khi POP CS Ví duï : Löu noäi dung 4 thanh ghi AX, BX, CX, DX vaøo STACK PUSH AX PUSH BX PUSH CX PUSH DX Khi muoán laáy laïi noäi dung caùc thanh ghi AX, BX, CX, DX ñaõ löu trong STACK ta phaûi POP chuùng ra theo thöù töï ngöôïc laïi POP DX POP CX POP BX POP AX 5 . Leänh PUSHA ( Push All) : PUSHA Chöùc naêng : Push taát caû caùc thanh ghi theo thöù töï AX, BX, CX, DX, SP, BP, SI, DI laán löôït vaøo satck. Chuù yù : Leänh PUSHA khoâng push caùc thanh ghi ñoaïn vaø thanh ghi côø vaøo STACK 6 . Leänh POPA ( Pop All ) : POPA Chöùc naêng : ngöôïc laïi vôùi leänh PUSHA, POPA pop taát caû caùc thanh ghi theo thöù töï ngöôïc laïi DI, SI, BP, SP, DX, CX, BX, AX laàn löôït ra STACK 7 . Leänh XLAT ( translate ) : XLAT [ source - table ] Chöùc naêng : Chuyeån noäi dung oâ nhôù trong 1 baûng vaøo thanh ghi AL. Trong ñoù baûng coù ñòa chæ baét ñaàu xaùc ñònh bôûi caëp thanh ghi DS:BX, vò trí offset cuûa oâ nhôù trong baûng ñöôïc xaùc ñònh bôûi thanh ghi AL. 44
- XLAT töông öùng vôùi caùc leänh sau : MOV AH , 0 MOV SI , AX MOV AL , [ BX + SI ] Ví duï : MOV AL, 02 XLAT ; AL = 45 MOV AL, 00 XLAT ; AL = 23 Chuù yù : X Baûng caùc oâ nhôù chæ daøi toái ña 256 bytes X Byte ñaàu tieân trong baûng coù offset 0, ví duï neáu AL chöùa trò 3 vaø oâ nhôù thöù 4 trong baûng coù giaù trò 56, thì leänh XLAT seõ chuyeån trò 56 vaøo thanh ghi AL Ví duï : Vieát chöông trình chuyeån ñoåi moät soá coù giaù trò trong khoaûng töø 0 ñeán 15 sang kyù töï thaäp luïc phaân töông öùng (töø ‘0’ ñeán ‘ 9 ’vaø töø ‘ A ‘ ñeán ‘ F ‘) Giaûi : ; Nhaäp AL coù trò töø 0 ñeán 15 MOV BX , offset bangkytu XLAT bangkytu ; AL seõ ñöôïc kyù töï thaäp luïc phaân töông öùng bangkytu db ‘0123456789ABCDEF ‘ 8. Leänh LEA ( Load Effective Address ) : Cuù phaùp : LEA reg16, mem Chöùc naêng : Chuyeån ñòa chæ offset cuûa toaùn haïng boä nhôù mem vaøo thanh ghi reg16. Ví duï : LEA SI , table ; chuyeån ñòa chæ offset cuûa table vaøo thanh ghi SI ; chuyeån ñòa chæ offset cuûa table + noäi dung thanh ghi SI vaøo thanh ghi BX LEA BX , table[SI] 45
- II. Caùc leänh nhaäp xuaát cô baûn : 1. Caùc leänh truy xuaát coång : CPU giao tieáp vôùi caùc thieát bò ngoaïi vi thoâng qua caùc coång vaøo ra (I/O port). Moãi coång ñöôïc xaùc ñònh duy nhaát baèng moät soá 16 bit goïi laø ñòa chæ coång. Moãi thieát bò ngoaïi vi coù theå söû duïng nhieàu ñòa chæ coång khaùc cho töøng muïc ñích khaùc nhau. Tuøy chöùc naêng cuûa töøng coång, caùc coång coù theå X Chæ ñoïc ñöôïc ( Input prot ) X Chæ ghi ñöôïc ( output port ) X Ñoïc vaø ghi ñöôïc ( Input/output port ) Ví duï : - Caùc coång coù ñòa chæ töø 60-6F duøng cho boä ñieàu khieån baøn phím - Caùc coång coù ñòa chæ töø 1F0-1F7 duøng cho Boå ñieàu khieån dóa cöùng AT - Caùc coång coù ñòa chæ töø 3B0-3DF duøng cho boä ñieàu khieån VGA Coù 2 leänh coù theå truy xuaát tröïc tieáp caùc coång vaøo ra laø leänh IN vaø OUT. a. Leänh IN : Cuù phaùp : IN AL , port IN AL , DX Chöùc naêng : ñoïc moät giaù trò 8 bit töø moät coång nhaäp vaøo thanh ghi AL. Neáu ñòa chæ cuûa coång coù giaù trò trong khoaûng töø 0 ñeán FF thì ñòa chæ ñoù coù theå vieát tröïc tieáp trong caâu leänh. Trong tröôøng hôïp ñòa chæ cuûa coång coù giaù trò > FF thì ta phaûi duøng thanh ghi DX ñeå ñònh ñòa chæ coång. Ví duï : IN AL , 60H ; ñoïc moät phím töø vuøng ñeäm baøn phím MOV DX , 03f8H IN AL , DX ; Doïc moät byte töø coång 03f8H b. Leänh OUT : Cuù phaùp : OUT port , AL OUT DX , AL Chöùc naêng : Gôûi moät giaù trò 8 bit cho trong thanh ghi al ra coång xuaát. Neáu ñòa chæ 46
- cuûa coång coù giaù trò trong khoaûng töø 0 ñeán FF thì ñòa chæ coù theå vieát tröïc tieáp trong caâu leänh. Trong tröôøng hôïp ñòa chæ coång coù giaù trò > FF thì ta phaûi duøng thanh ghi DX ñeå ñònh ñòa chæ coång. Ví duï : X Muoán môû loa maùy tính ta coù theå gôûi giaù trò 03 ra coång 61h MOV AL,03 OUT 61h, AL ; môû loa X Muoán taét loa maùy tính ta chæ caàn gôûi trò 0 ra coång 61h MOV AL,0 OUT 61h,AL ; taét loa 2. Ngaét vaø caùc chöông trình phuïc vuï : Vieäc giao tieáp vôùi caùc thieát bò ngoaïi vi thoâng qua coång laø coâng vieäc phöùc taïp vì caùc ñòa chæ coång coù theå thay ñoåi giöõa caùc loaïi maùy tính vaø ngöôøi laäp trình phaûi hieåu töông ñoái phaàn cöùng. Ñeå deã laäp trình, caùc nhaø saûn xuaát maùy tính ñaõ cung caáp caùc chöông trình phuïc vuï vaøo/ra cô baûn cho ngöôøi laäp trình. Coù 2 loaïi chöông trình phuïc vuï vaøo/ra cô baûn laø : Caùc chöông trình phuïc vuï cuûa BIOS vaø caùc chöông trình phuïc vuï cuûa DOS. Caùc chöông trình phuïc vuï BIOS ñöôïc chöùa trong ROM BIOS vaø taùc ñoäng tröïc tieáp vaøo caùc coång vaøo ra. Caùc chöông trình phuïc vuï DOS naèm trong heä ñieàu haønh vaø ñöôïc naïp vaøo boä nhôù khi maùy tính khôûi ñoäng heä ñieàu haønh. Caùc phuïc vuï Dos coù theå thöïc hieän caùc coâng vieäc phöùc taïp hôn, ví duï nhö hieån thò moät chuoãi hay quaûn lyù dóa, taäp tin vaø thö muïc Thöïc ra Caùc chöông trình phuïc vuï Dos vaãn söû duïng caùc phuïc vuï BIOS ñeå laøm neàn taûng ñeå thöïc hieän caùc thaùo taùc vaøo/ra tröïc tieáp. Leänh goïi ngaét INT : ñöôïc duøng ñeå goïi caùc chöông trình phuïc vuï cuûa Dos vaø Bios. Cuù phaùp : INT soá_hieäu_ngaét Moãi soá hieäu ngaét xaùc ñònh moät boâï chöông trình phuïc vuï. Moãi boä chöông trình goàm nhieàu haøm. Caùc haøm ñöôïc choïn thoâng qua thanh ghi AH. Ngaét quan troïng nhaát cuûa DOS laø ngaét ña duïng coù soá hieâuï ngaét laø 21h. Ngaét naøy chöùa raát nhieàu phuïc vuï trong ñoù coù caùc phuïc vuï nhaäp xuaát ñoái vôùi caùc thieát bò cô baûn nhö baøn phím vaø maøn hình. Döôùi ñaây ta seõ trình baøy moät soá phuïc vuï nhaäp xuaát cô baûn. a. Caùc haøm nhaäp : * Nhaäp kyù töï : u Haøm 01 : Nhaäp 1 kyù töï töø baøn phím vaø hieän kyù töï nhaäp ra maøn hình. Neáu khoâng coù kyù töï 47
- naøo ñöôïc nhaäp, haøm 01 seõ ñôïi cho ñeán khi moät kyù töï ñöôïc nhaäp. X Goïi vôùi : AH = 01 INT 21h X Trò traû veà : AL = maõ ASCII cuûa kyù töï nhaäp Ví duï : Nhaäp 1 kyù töï töø baøn phím MOV AH , 01 INT 21h ; Al chöùa maõ ASCII töông öùng cuûa kyù töï ñöôïc nhaäp u Haøm 08 : Ñoïc 1 kyù töï töø baøn phím gioáng nhö haøm 01 nhöng khoâng hieån thò kyù töï nhaäp ra maøn hình. X Goïi vôùi : AH = 08 INT 21h X Trò traû veà : AL = maõ ASCII cuûa kyù töï nhaäp Ví duï : Nhaäp khoâng hieän ra maøn hình moät kyù töï töø baøn phím MOV AH , 08 INT 21h * Nhaäp chuoãi : uHaøm 0A : Nhaäp 1 chuoãi daøi toái ña 255 kyù töï töø baøn phím. Cho pheùp duøng phím Back Sace ñeå söûa caùc kyù töï nhaäp. Phím ENTER ñeå keát thuùc chuoãi nhaäp. X Goïi vôùi : AH = 0A DS:DX = ñòa chæ ñoaïn vaø offset cuûa vuøng ñeäm löu chuoãi INT 21h X Trò traû veà : khoâng coù Chuù yù : Vuøng ñeäm ñöôïc duøng phaûi coù daïng sau : X Byte 0 : Soá byte toái ña caàn ñoïc ( keå caû ENTER ). X Byte 1 : Soá byte thöïc söï ñoïc ( khoâng keå ENTER ). 48
- X Byte 2 : Löu caùc kyù töï nhaäp ( keå caû ENTER ). Ví duï : Nhaäp moät chuoãi toái ña 80 kyù töï töø baøn phím MOV AH, 0Ah MOV DX, offset Buffer INT 21h Buffer DB 81 DB ? DB 81 dup( ? ) b. Caùc haøm xuaát : u Haøm 02 : Xuaát 1 kyù töï trong thanh ghi DL ra maøn hình taïi vò trí con troû hieän thôøi. X Goïi vôùi : AH = 02 DL = Maõ ASCII cuûa kyù töï caàn xuaát INT 21h X Trò traû veà : Khoâng coù Chuù yù : Caùc kyù töï ñieàu khieån - Kyù töï coù maõ ascii 07 : phaùt tieáng beep - Kyù töï coù maõ ascii 13 : veà ñaàu doøng - Kyù töï coù maõ ascii 10 : xuoáng doøng Ví duï 1 : Hieån thò kyù töï ‘A’ ra maøn hình MOV AH, 02 MOV DL , ‘A’ INT 21h Ví duï 2 : Phaùt hieän moät tieáng keâu Beep MOV AH, 02 MOV DL , 07 INT 21h * Xuaát chuoãi : u Haøm 09 : Xuaát 1 chuoãi kyù töï ra maøn hình taïi vò trí con troû hieän thôøi. Chuoãi phaûi ñöôïc keát thuùc baèng kyù töï $ . 49
- X Goïi vôùi : Ah = 09 DS:DX = ñòa chæ segment vaø ñòa chæ offset cuûa chuoãi caàn xuaát INT 21h X Trò traû veà : Khoâng coù Ví duï : Xuaát chuoãi “Khoa tin hoïc” ra maøn hình Mess DB ‘Khoa tin Hoïc$ ’ MOV AH, 09 MOV DX, offset Mess INT 21h BAØI TAÄP LAÄP TRÌNH Caâu 1: Vieát chöông trình nhaäp 3 kyù töï töø baøn phím. Xuaát 3 kyù töï naøy ra maøn hình theo chieàu ñöùng töø treân xuoáng beân leà traùi. Caâu 2: Vieát chöông trình hieån thò 1 baûng 5x10 ñieàn ñaày caùc daáu sao ra maøn hình. Caâu 3: Xeùt 1 baûng goàm 3x7 ñieàn ñaày caùc daáu sao. Nhaäp 1 kyù töï töø baøn phím. Hieån thò baûng treân ra maøn hình sao cho coät 4 cuûa baûng ñöôïc thay baèng kyù töï nhaäp. Caâu 4: Vieát chöông trình nhaäp 1 kyù töï töø baøn phím. Hieän thò kyù töï naøy ra maøn hình color taïi vò trí doøng 10 coät 20 vôùi thuoäc tính maøu ñoû vaø nhaáp nhaùy. Caâu 5 : Cho 2 vuøng nhôù mem1 vaø mem2, moãi vuøng daøi 6 byte. Vieát chöông trình hoaùn chuyeãn noäi dung 2 vuøng nhôù mem1 vaø mem2. Hieån thò keát quaû mem1 vaø mem2 ra maøn hình. Caâu 6: Vieát chöông trình nhaäp moät chuoãi goàm 7 kyù töï töø baøn phím. ñaûo ngöôïc chuoãi naøy. Hieån thò keát quaû ra maøn hình. Caâu 7: Cho 1 vuøng nhôù Mem daøi 10 byte. Vieát chöông trình nhaäp 2 chuoãi. Moãi chuoãi goàm 5 kyù töï . Chuyeån chuoãi 1 vaøo caùc byte chaün cuûa vuøng nhôù Mem vaø chuyeån chuoãi 2 vaøo caùc byte leõ cuûa vuøng nhôù Mem. Hieån thò keát quaû ra maøn hình. Ví duï : Nhaäp chuoãi 1 : abcde Nhaäp chuoãi 2 : 12345 Hieån thò keát quaû : a1b2c3d4e5 III. CAÁU TRUÙC ÑIEÀU KHIEÅN : 1. Leänh nhaûy khoâng ñieàu kieän jmp : JMP label 50
- Chöùc naêng : Leänh nhaûy JMP chuyeån ñieàu khieån ñeán thöïc hieän caâu leänh naèm sau nhaõn label Ví duï : JMP short next ; nhaûy qua vuøng döõ lieäu ñeán nhaõn next DB ‘ Tin Hoc ‘ next : 2. Leänh nhaûy coù ñieàu kieän : Cuù phaùp : Jcondition short_label trong ñoù short_label laø nhaõn ngaén nghóa laø vò trí nhaõn caùch leänh nhaõy khoâng quaù 128 byte. Leänh nhaõy coù ñieàu kieän chæ coù theå nhaõy gaàn, muoán nhaõy xa hôn ta phaûi duøng leänh nhaõy JMP Leänh nhaûy coù ñieàu kieän tröôùc tieân kieåm tra ñieàu kieän, sau ñoù nhaûy ñeán vò trí chæ bôûi nhaõn short_label neáu ñieàu kieän ñöôïc thoûa hoaëc tieáp tuïc thöïc hieän leänh keá tieáp neáu ñieàu kieän khoâng ñöôïc thoûa. a. Caùc leänh nhaûy duøng cho soá khoâng daáu : Leänh Ñieàu kieän Yù nghóa JA CF= 0 & ZF = 0 Nhaõy neáu lôùn hôn JAE CF = 0 Nhaûy neáu lôùn hôn hay baèng JB CF = 1 Nhaûy neáu nhoû hôn JBE CF = 1 | ZF = 1 Nhaûy neáu nhoû hôn hay baèng JE ZF = 1 Nhaûy neáu baèng nhau JNE ZF = 0 Nhaûy neáu khaùc nhau b. Caùc leänh nhaûy duøng cho soá coù daáu : Leänh Ñieàu kieän Yù nghóa JG SF=OF & ZF = 0 Nhaõy neáu lôùn hôn JGE SF = OF Nhaûy neáu lôùn hôn hay baèng JL SF ¹ OF÷ Nhaûy neáu nhoû hôn JLE CF ¹ OF | ZF = 1 Nhaûy neáu nhoû hôn hay baèng JE ZF = 1 Nhaûy neáu baèng nhau JNE ZF = 0 Nhaûy neáu khaùc nhau c. Caùc leänh nhaûy duøng chung : Leänh Ñieàu kieän Yù nghóa JC CF = 1 Nhaûy neáu coù nhôù JNC CF = 0 Nhaûy neáu khoâng coù nhôù JZ ZF = 1 Nhaûy neáu baèng zero 51
- JNZ ZF = 0 Nhaûy neáu khaùc zero JS SF = 1 Nhaûy neáu laø soá aâm JNS SF = 0 Nhaûy neáu khoâng phaûi soá aâm JO OF = 1 Nhaûy neáu bò traøn JNO OF = 0 Nhaûy neáu khoâng bò traøn JCXZ CX = 0 Nhaûy neáu thanh ghi CX = 0 3. Leänh so saùnh cmp : Cuù phaùp CMP left , right Chöùc naêng : So saùnh noäi dung toaùn haïng Left vaø noäi dung toaùn haïng Right, keát quaû cuûa pheùp so saùnh ñöôïc löu vaøo thanh ghi côø hieäu . Gioáng nhö leänh SUB, leânh CMP laáy toaùn haïng Left tröø toaùn haïng Right. Xoùa hoaëc baät caùc côø OF, SF, ZF, CF, PF, AF döïa vaøo keát quaû pheùp tröø, nhöng khaùc vôùi leänh SUB ôû choã noù khoâng thay ñoåi noäi dung cuûa toaùn haïng Left. * Keát quaû cuûa pheùp so saùnh : + Ñoái vôùi soá khoâng daáu : Chæ caán xeùt caùc côø ZF vaø CF ñieàu kieän ZF CF Left > Right 0 0 Left = Right 1 0 Left Right 0 0/1 0/1 Left = Right 1 0 0 Left B : Thì nhaûy ñeán nhaõn lab2 + Neáu A = B : Thì nhaûy ñeán nhaõn lab3 Giaûi : MOV AX , A CMP AX , B JG lab1 JL lab2 52
- JMP lab3 53
- IV. CAÁU TRUÙC LAËP 1. Leänh LOOP : Hôïp ngöõ cung caáp leänh LOOP ñeå taïo voøng laëp coù soá laàn laëp xaùc ñònh Cuù phaùp : LOOP short_label Thanh ghi ñeám CX seõ xaùc ñònh soá laàn laëp cuûa voøng laëp. Moãi laàn thöïc hieän leänh LOOP, thanh ghi CX töï ñoäng giaõm 1. Neáu CX khaùc khoâng thì leänh LOOP chuyeån ñieàu khieån ñeán nhaõn short_label ñeå laëp laïi. Neáu CX = 0 thì leänh tieáp leänh LOOP seõ ñöôïc thöïc hieän vaø voøng laëp keát thuùc. Ví duï 1 : Vieát moät voøng laëp hieån thò 80 kyùtöï * MOV CX, 80 MOV AH, 02 MOV DL, '*' repeat: INT 21h LOOP repeat Ví duï 2 : Vieát chöông trình nhaäp moät chuoãi toái ña 20 kyù töï töø baøn phìm. Hieån thò chuoãi ra maøn hình, trong ñoù caùc kyù töï thöôøng ñöôïc thay baèng caùc kyù töï hoa. JMP main Buffer DB 21 DB ? DB 21 dup(?) ; Nhaäp 1 chuoãi main: MOV AH,0Ah LEA DX , Buffer INT 21h ; xuoáng doøng mov ah, 02 mov dl, 13 int 21h mov dl, 10 int 21h ; Thöïc hieän 1 voøng laëp, moãi laàn ñoåi 1 kyù töï sang hoa vaø hieån thò ra maøn hình mov cl, [buffer+1] mov ch, 0 lea si, buffer+2 repeat: MOV AL , [ SI ] CMP AL , ‘ a ‘ JB notupper CMP AL , ‘ z ‘ JA notupper 54
- SUB AL , 32 noupper : ; hieån thò kyù töï ra maøn hình MOV AH, 02 MOV DL, AL INT 21h INC SI ; qua kyù töï keá LOOP repeat ; keát thuùc chöông trình INT 20h 2. VOØNG LAËP while vaø do while * voøng laëp do while do caùc leänh ñöôïc laëp laïi while * voøng laëp while while caùc leänh ñöôïc laëp laïi Voøng laëp while vaø do . While coù theå thöïc hieän baèng leänh CMP vaø caùc leänh nhaûy : * Ví duï 1: Vieát moät voøng laëp ñeå nhaäp caùc kyù töï cho ñeán khi gaëp kyù töï $. Ñeám toång soá kyù töï ñöôïc nhaäp (khoâng keå kyù töï $). Löu keát quaû vaøo 1 bieán count. * Minh hoïa baèng maõ giaû count = 0; do cin >> c; if (c != '$') count++; while (c != '$'); Giaûi : MOV count, 0 MOV ah, 01 55
- rep_read: INT 21h CMP al, '$' Je EndRepeat INC count JMP rep_read * Ví duï 2: Vieát chöông trình tính öôùc soá chung lôùn nhaát cuûa 2 soá khoâng daáu 16 bit A vaø B. Löu keát quaû vaøo bieán Uscln. * Minh hoïa baèng maõ giaû while A B then A := A-B else B := B - A; end_while Ucsln : = A; Giaûi : JMP main A dw 20 B dw 8 Uscln dw ? main: mov Ax, A mov Bx, B while: Cmp AX, Bx JE end_while JA greater ; A B SUB Ax, Bx JMP while MOV Uscln, Ax ; keát thuùc chöông trình Int 20h 56
- 3 . Caùc leänh LOOP coù ñieàu kieän : Leänh LOOP chæ chaám döùt voøng laëp khi thanh ghi CX = 0. Ñoâi khi ta caàn chaám döùt voøng laëp tröoùc khi CX = 0. Muoán vaäy ta phaûi duøng caùc leänh LOOP coù ñieàu kieän. Cuù phaùp : LOOP short_label a . Leänh LOOPE ( Loop while Equal ) : Cuù phaùp : LOOPE short_label Chöùc naêng : Moãi laàn thöïc hieän leänh LOOPE, thanh ghi CX töï ñoäng giaõm 1. Neáu CX 0 vaø côø ZF = 0 thì leänh LOOP chuyeån ñieàu khieån ñeán nhaõn short_label ñeå laëp laïi. Neáu CX = 0 hay côø ZF = 1 thì leänh tieáp leänh LOOPE seõ ñöôïc thöïc hieän vaø voøng laëp keát thuùc. d . Leänh LOOPNZ (Loop while not Zero ) : Gioáng nhö leänh LOOPNE Ví duï : Trong ñoaïn chæ bôûi DS, cho chuoãi stg goàm 10 kyù töï. Vieát chöông trình tìm kyù töï 'S' trong chuoãi stg. Hieån thò keát quaû. Giaûi : JMP main stg DB 'ABCDEFSPQR' Mess1 DB 'Tìm thaáy kyù töï S trong chuoãi $' Mess2 DB 'Khoâng tìm thaáy kyù töï S trong chuoãi $' main: MOV CX , 10 MOV BX , offset stg - 1 nextchar: INC BX CMP byte ptr [BX], ‘S’ LOOPNE nextchar 57
- JE found Lea DX, Mess2 JMP write found: lea DX, Mess1 write: mov ah, 09 Int 21h ; keát thuùc chöông trình Int 20h BAØI TAÄP PHAÀN CAÁU TRUÙC ÑIEÀU KHIEÅN VAØ VOØNG LAËP 1 . Vieát chöông trình nhaäp töø baøn phím moät soá chæ thöù ( 1 ñeán 7 ) vaø in ra maøn hình teân ngaøy baèng chöõ töông öùng ( Monday, Tuesday, Wednesday, Thurday, Friday, Saturday, Sunday ). 2. Vieát chöông trình nhaäp 2 kyù töï töø baøn phím. Hieån hieän kyù töï coù maõ ascii lôùn nhaát 3. Vieát chöông trình nhaäp moät kyù töï, cho bieát kyù töï laø hoa hay thöông ? 4 . Vieát chöông trình troø chôi meøo, chuoät, voi nhö sau : Ngöôøi 1 nhaäp 1 kyù töï : ( M, C, V ) Ngöôøi 2 nhaäp 1 kyù töï : ( M, C, V ) Bieát raèng : M thaéng C, C thaéng V, V thaéng M In keát quaû ngöôøi thaéng cuoäc 5. Vieát chöông trình nhaäp 1 kyù töï. Hieän thò noù 80 laàn treân doøng tieáp theo. 6. Vieát chöông trình nhaäp 1 chuoãi toái ña 50 kyù töï töø baøn phím. Hieån thò chuoãi ngöôïc ra maøn hình. 7. Vieát chuông trình nhaäp 1 chuoãi toái ña 80 kyù töï. Hieän thò chuoãi naøy ra maøn hình trong ñoù loaïi boû caùc khoaûng traéng beân traùi cuûa chuoãi. 8. Vieát chöông trình nhaäp 10 kyù töï töø baøn phím. Hieån thò kyù töï coù maõ ascii lôùn nhaát ra maøn hình. 9. Vieát chöông trình nhaäp moät chuoãi toái ña 80 kyù töï töø baøn phím. Haõy hieän thò chuoãi treân ra maøn hình trong ñoù loaïi boû caùc khoaûng traéng. 10. Vieát chöông trình nhaäp moät chuoãi toái ña 80 kyù töï töø baøn phím. Haõy hieän thò chuoài treân ra maøn hình trong ñoù caùc khoaûng traéng lieàn nhau ñöôïc thay baèng 1 khoaûng traéng duy nhaát. 11. Vieát chöông trình nhaäp Hoï teân cuûa moät sinh vieân. Haõy hieån thò Hoï teân ra maøn hình trong ñoù caùc kyù töï ñaàu cuûa moãi töø (Hoï, teân, chöõ loùt) ñöôïc ñoåi thaønh kyù töï Hoa, caùc kyù töï coøn laïi ñoåi thaønh kyù töï thöoøng. Ví duï : Nhaäp : nguyen vAn sinH Hieån thò : Nguyen Van Sinh 58
- V. CHÖÔNG TRÌNH CON Chöông trình con laø moät ñoaïn chöông trình coù teân maø ta coù theå goïi thöïc hieän nhieàu laàn taïi nhieàu vò trí khaùc nhau trong chöông trình. Khi goïi ta khoâng caàn goõ laïi caùc leänh cuûa chöông trình con maø chæ caàn goïi teân cuûa chöông trình con. Chöông trình con cho pheùp ngöôøi laäp trình xaây döïng chöông trình moät caùch coù caáu truùc, ñaëc bieät ñoái vôùi nhöõng chöông trình lôùn. Chöông trình con coù theå nhaän caùc tham soá vaøo, xöû lyù vaø xuaát keát quaû neáu caàn. 1. Khai baùo chöông trình con : Chöông trình con ñöôïc khai baùo baèng chæ daãn PROC vaø ENDP. Cuù phaùp : name PROC caùc caâu leänh hôïp ngöõ RET name ENDP Chæ daãn PROC ñaùnh daáu ñieåm baét ñaàu vaø chæ daãn ENDP ñaùnh daáu ñieåm keát thuùc cuûa chöông trình con. name laø teân chöông trình con do ngöôøi laäp trình ñaët. 2 . Leänh RET ( Return ) : Cuù phaùp : RET Leänh return duøng ñeå keát thuùc 1 chöông trình con. 2. Caùc tham soá cuûa chuông trình con : Thöôøng caùc chöông trình con ñeàu coù tham soá. Coù 2 loaïi tham soá : tham soá nhaän caùc giaù trò vaøo ñeå xöû lyù goïi laø tham soá vaøo. Tham soá cho keát quaû goïi laø tham soá ra. Caùc tham soá coù theå xaùc ñònh thoâng qua thanh ghi, stack hay bieán. Tham soá xaùc ñònh baèng bieán ít duøng trong hôïp ngöõ. Thöôøng ta duøng tham soá baèng thanh ghi vì ñaây laø caùch truyeàn nhanh nhaát. Coøn tham soá xaùc ñònh qua Stack thöôøng duøng vôùi caùc chöông trình con giao tieáp vôùi caùc ngoân ngöõ caáp cao nhö pascal hay C Khi khai baùo moät chöông trình con ñieàu quan troïng tröôùc tieân laø phaûi xaùc ñònh roõ chính xaùc caùc tham soá cuûa chöông trình con. Ví duï : Vieát moät chöông trình con upcase chuyeån kyù töï thöôøng sang hoa. Upcase nhaän 59
- tham soá laø thanh ghi AL löu kyù töï caàn chuyeån, keát quaû chuyeån vaøo AL. Sau ñoù duøng chöông trình con upcase ñeå vieát chöông trình chuyeån chuoãi str goàm 100 kyù töï trong ñoaïn chæ bôûi DS sang chöõ hoa. ; chöông trình chính LEA BX , str MOV CX , 100 next : MOV AL , [ BX ] CALL upcase MOV [ BX ] , AL INC BX LOOP next ; chöông trình con upcase PROC CMPAL , ‘a’ JB lab CMPAL , ‘z’ JA lab SUB AL , ‘a’ - ‘A’ lab : RET upcase ENDP 3. Caùch goïi chöông trình con : Chöông trình con ñöôïc goïi baèng leänh Call Cuù phaùp : CALL procedurenane Goïi chöông trình con coù teân ñöôïc khai baùo laø procedurename Caùch haønh ñoäng cuûa leänh CALL w Tröôùc tieân leänh CALL push ñòa chæ offset cuûa leänh keá tieáp sau leänh CALL vaøo Stack. w Sau ñoù naïp ñòa chæ offset baét ñaàu cuûa chöông trình con vaøo thanh ghi con troû leänh IP vaø chuyeån ñieàu khieån ñeán chöông trình con ( luùc naøy coù ñòa chæ xaùc ñònh bôûi caëp thanh ghi CS:IP ) Ví duï : 1100:03E0 MOV DX, offset str 1100:03E3 CALL PrintStr 1100:03E6 next : INT 20h 100:03E8 Str DB ‘ Khoa Tin Hoc ‘ 60
- . . . . . . . . . 1100:0600 PrintStr PROC near MOV AH , 09 INT 21h RET PrintStr ENDP Giaûi thích : Khi CPU thöïc hieän leänh CALL PrintStr, noù push ñòa chæ offset cuûa nhaõn PrintStr next ( 03E6 ) vaøo Stack vaø naïp ñòa chæ offset cuûa nhaõn PrintStr ( 0060 ) vaøo thanh ghi con troû leänh IP. Cuoái cuøng chuyeån ñieàu khieån ñeán ñòa chæ môùi 600 ñeå thöïc hieän chöông trình con PrintStr Sau khi thöïc hieän xong chöông trình con. CPU seõ POP ñòa chæ offset cuûa nhaõn next ( 03E6 ) ra khoûi Stack ñeå naïp vaøo thanh ghi con troû leänh IP vaø quyeàn ñieàu khieån ñöôïc traû veà chöông trình chính taïi ñòa chæ 03E6. X Caùch giao tieáp giöõa hôïp ngöõ vaø ngoân ngöõ caáp cao : Assembler cho pheùp theâm caùc maõ leänh vieát baèng hôïp ngöõ cho caùc chöông trình vieát baèng ngoân ngöõ caáp cao nhö Pascal hay C. Ñoái vôùi caùc chöông trình vieát baèng Pascal hay C, thöôøng coù 1 soá ñoaïn caàn vieát baèng hôïp ngöõ môùi ñaûm baûo toác ñoä thöïc hieän nhö caùc ñoaïn xöû lyù maøn hình ñoà hoïa hoaëc caùc ñoaïn thaâm nhaäp sau vaøo heä thoáng. Luùc ñoù ta phaûi vieát caùc ñoaïn ñoù baèng hôïp ngöõ döôùi daïng caùc chöông trình con trong caùc taäp tin hôïp ngöõ nguoàn. Dòch caùc taäp tin hôïp ngöõ nguoàn sang taäp tin daïng OBJ. Sau khi lieân keát chuùng laïi vôùi chöông trình caáp cao, thì chöông trình caáp cao seõ goïi ñöôïc caùc chöông trình con vieát baèng hôïp ngöõ . Ví duï : Vieát 1 moät chöông trình con OUTB baèng hôïp ngöõ goàm 2 tham soá port vaø val daïng int ñeå xuaát trò val ra coång coù ñòa chæ xaùc ñònh bôûi port. Chöông trình con naøy ñöôïc goïi trong chöông trình chính vieát baèng Pascal nhö sau : Procedure outb (port, val : integer); EXTERNAL, var port, val : integer ; begin port := $03B8 ; val := $ 87; (* Xuaát trò 87 Hex ra coång 03B8 *) outb ( port,val) ; 61
- end. Tröôùc khi goïi chöông trình con outb, chöông trình chính seõ chuyeån tham soá port vaø val vaøo Stack cho chöông trình con out nhö sau : MOV AX , 03F8h MOV BX , 14 PUSH AX ; chuyeån tham soá port vaøo Stack PUSH BX ; chuyeån tham soá val vaøo Stack CALL far ptr outb ; goïi chöông trình con outb Chöông trình con outb ñöôïc vieát baèng hôïp ngöõ phaûi nhaän tham soá port vaø val trong Stack. Pucblic outb outb PROC far PUSH BP MOV BP , SP ; BP troû ñeán ñæmh Stack ñeå truy xuaát caùc ; tham soá ñöôïc truyeàn trong Stack MOV DX, [ BP + 8 ] ; chuyeån trò port vaøo thanh ghi DX MOV AX, [ BP + 6 ] ; chuyeån trò val vaøo thanh ghi AX OUT DX,AL POP BP RET 4 ; chaám döùt chöông trình con outb vaø loaïi boû ; 2 tham soá port vaø val ra khoûi Stack outb ENDP VI. NHOÙM LEÄNH TÍNH TOAÙN SOÁ HOÏC 1. caùc leänh xöû lyù pheùp coäng : * Leänh ADD ( addition ) : Add dest, source Chöùc naêng : Thöïc hieän coäng khoâng nhôù. Leänh ADD coäng noäi dung cuûa toaùn haïng source vaø toaùn haïng dest, keát quaû löu vaøo toaùn haïng dest. * Leänh ADC ( ADD with Carry ) : 62
- ADC dest , source Chöùc naêng : Gioáng nhö leänh ADD, nhöng thöïc hieän pheùp coäng coù nhôù. Leänh ADC coäng noäi dung cuûa toaùn haïng source vaø toaùn haïng dest roài coäng theâm 1 neáu côø CF baät 1, keát quaû löu vaøo toaùn haïng dest. * Leänh INC ( Increment ) : INC dest ( Chöùc naêng : Taêng noäi dung toaùn haïng dest leân 1 2. Caùc leänh xöû lyù pheùp tröø : * Leänh SUB : SUB dest , source Chöùc naêng : thöïc hieän pheùp tröø . Leänh SUB laáy noäi dung toaùn haïng dest tröø noäi dung toaùn haïng source, keát quaû löu vaøo toaùn haïng dest. * Leänh SBB : SBB dest , source Chöùc naêng : Gioáng nhö leänh SUB, nhöng thöïc hieän pheùp tröø coù möôïn. Leänh SBB laáy noäi dung toaùn haïng dest tröø noäi dung toaùn haïng source roài tröø theâm 1 neáu côø CF baät 1, keát quaû löu vaøo toaùn haïng dest. * Leänh DEC : DEC dest ( Reg hay Mem ) Chöùc naêng : Giaûn noäi dung toaùn haïng dest xuoáng 1 * Leänh NEG : NEG dest ( Reg hay Mem ) Chöùc naêng : Ñoåi daáu toaùn haïng dest 3. Caùc leänh xöû lyù pheùp nhaân : * Leänh MUL : MUL source Chöùc naêng : Thöïc hieän pheùp nhaân soá khoâng daáu . Coù 2 tröôøng hôïp : + Tröôøng hôïp 1 : source laø toaùn haïng 8 bit AX ß AL * source + Tröôøng hôïp 2 : Source laø toaùn haïng 16 bit DX:AX ß AX * source16 Chuù yù : Leänh naøy chæ aûnh höôûng ñeán côø CF vaø OF . Caùc côø CF vaø OF baät 1 neáu phaàn cao cuûa keát quaû khaùc khoâng , ngöôïc laïi côø CF vaø OF baèng 0 neáu phaàn cao cuûa keát quaû baèng 0 . ( Ñoái vôùi source 8 bit thì phaàn cao laø AH , ñoái vôùi source 16 bit thì phaàn cao laø DX ) 63
- * Leänh IMUL : IMUL source Chöùc naêng : Gioáng nhö leänh MUL nhöng thöïc hieän pheùp nhaân 2 soá coù daáu, cho keát quaû laø soá coù daáu . Chuù yù : Leänh naøy chæ aûnh höôûng ñeán côø CF vaø OF . Neáu caùc côø CF vaø OF baät 1 thì AH hay DX chöùa phaàn cao cuûa keát quaû . Ngöôïc laïi neáu CF vaø OF baèng 0 thì AH hay DX bieåu thò daáu cuûa keát quaû . 4. Caùc leänh xöû lyù pheùp chia : * Leänh DIV : DIV source Chöùc naêng : Thöïc hieän pheùp chia soá khoâng daáu Coù 2 tröôøng hôïp : + TH1 : neáu source laø toaùn haïng 8 bit AX DIV source - > AL AX MOD source - > AH + TH2 : neáu source laø toaùn haïng 16 bit DX:AX DIV source > AX DX:AX MOD source > DX Ví duï : Vieát chöông trình con print_word hieån thò 1 soá nhò phaân 2 byte ra maøn hình döôùi daïng thaäp phaân print_word proc MOV CX , 0 MOV BX , 10 cont : MOV DX , 0 DIV BX PUSH DX INC CX CMP AX , 0 JZ print JMP cont print : POP DX ADD DL,’0’ CALL out_char LOOP print RET print_word endp Caùc tröôøng hôïp xaûy ra Divide overflow ñoái vôùi leänh DIV 64
- 1 - Chia cho 0 2 - Thöông soá pheùp chia bò traøn Ví duï : Chia soá 23456786 cho 10 MOV AX, word ptr a MOV DX, word ptr a + 2 MOV BX, 10 DIV BX a DD 23456786 ; pheùp chia khoâng thöïc hieän ñöôïc vì keát quaû 2345678 vöôït quaù kích thöôùc cuûa thanh ghi AX ; CPU seõ phaùt sinh INT 0 vaø xuaát thoâng baùo loãi “ Divide overflow ” * Leänh IDIV : IDIV source chöùc naêng : gioáng nhö leänh DIV nhöng thöïc hieän pheùp chia 2 soá coù daáu vaø keát quaû laø soá coù daáu . Caùc tröôøng hôïp xaûy ra Divide overflow ñoái vôùi leänh IDIV + Chia cho 0 + Thöông soá naèm ngoaøi khoaûng ( -128,127 ) ñoái vôùi pheùp chia soá coù daáu daïng byte + Thöông soá naèm ngoaøi khoaûng ( -32767,32768 ) ñoái vôùi pheùp chia soá khoâng daáu daïng word. VI. CAÙC LEÄNH DÒCH CHUYEÅN VAØ QUAY ( SHIFT AND ROTATE ) 1 . Caùc leänh dòch chuyeån logic SHL vaø SHR : * Leänh SHL : SHL dest , n SHL dest , CL Chöùc naêng : - Leänh SHL dest , n Dòch chuyeån noäi dung toaùn haïng dest sang traùi n bit , bit cuoái cuûa toaùn haïng dest ñöôïc ñaåy vaøo CF , bit ñaàu trôû thaønh 0 . CF 0 Chuù yù : + Neáu toaùn haïng dest chöùa 1 soá nguyeân khoâng daáu thì leänh SHL dest , 1 seõ nhaân noäi dung cuûa toaùn haïng dest vôùi 2 , tuy nhieân leänh naøy thöïc hieän nhanh hôn leän MUL raát nhieàu . Ví duï : Cho bieán mem16 daïng word chöùa 1 soá nguyeân khoâng daáu , vieát chöông trình nhaân mem16 vôùi 10 keát quaû löu vaøo thanh ghi AX . 65
- MOV AX,mem16 SHL AX,1 ; AX = x* 2 MOV BX,AX ; löu x*2 vaøo bx SHL AX,1 ; AX = x*4 SHL AX,1 ; AX = x*8 ADD AX,BX ; AX = x*8 + x*2 = x*10 * Leänh SHR ( shift logical right ) : SHR dest , n SHR dest , CL Chöùc naêng : nhö leänh SHL , nhöng thay vì dòch chuyeån sang traùi ta dòch chuyeån sang phaûi . - Leänh SHR , 1 : Dòch chuyeån noäi dung cuûa toaùn haïng dest sang phaûi 1 bit , bit ñaàu cuûa toaùn haïng dest ñöôïc ñaåy vaøo CF , bit cuoái trôû thaønh 0 . 0 CF Chuù yù : + Neáu toaùn haïng dest chöùa 1 soá nguyeân khoâng daáu thì leänh SHR dest , 1 seõ chia noäi dung cuûa toaùn haïng dest cho 2 , tuy nhieân leänh naøy thöïc hieän nhanh hôn leänh DIV raát nhieàu . 2 . Caùc leänh quay ( rotate ) : * Leänh ROL ( Rotateleft ) : ROL dest , 1 hay ROL dest ,CL chöùc naêng : quay toaùn haïng dest sang traùi moät hay nhieàu bit + Leänh ROL dest , 1 : Quay noäi dung cuûa toaùn haïng dest sang traùi 1 bit. Gioáng nhö leänh SHL, nhöng thay vì bit ñaàu laø 0 thì ñoái vôùi leänh ROL bit cuoái ñöôïc dòch chuyeån vaøo bit ñaàu . CF Ví duï : Vieát chöông trình in moät soá nhò phaân 1 byte hay 2 byte ra maøn hình döôùi daïng thaäp luïc phaân ; In noäi dung cuûa AL ra maøn hình döôùi daïng hex MOV CH , 2 CALL print_hex ; In noäi dung cuûa AX ra maøn hình döôùi daïng hex MOV CH , 4 CALL print_hex print_hex PROC MOV CL , 4 66
- MOV DX, AX MOV BX, offset table next : ROL DX, CL MOV AL, DL AND AL, 0Fh XLAT PUSH DX MOV DL , AL CALL out_char POP DX DEC CH CMP CH, 0 JNZ next RET table db ‘ 0123456789ABCDEF ’ * Leänh ROR ( Rotate Right ) : ROR dest , 1 ROR dest , CL Chöùc naêng : Gioáng nhö leänh ROL, thay vì quay bit sang traùi, ta quay bit sang phaûi + Leänh ROR desr , 1 : Quay noäi dung cuûa toaùn haïng dest sang phaûi 1 bit. CF * Leänh RCL ( Rotate thought Carry Left ) : RCL dest , n RCL dest , CL Chöùc naêng : Gioáng nhö leänh ROL, nhöng bit côø CF ñöôïc ñaåy vaøo bit ñaàu cuûa toaùn haïng dest thay vì bit cuoái ñöôïc ñaåy vaøo bit ñaàu CF * Leänh RCR (Rotate thought Carry Right ) : RCR dest , 1 RCR dest , CL Chöùc naêng : Gioáng nhö leänh ROR , nhöng bit côø CF ñöôïc ñaåy vaøo bit cuoái cuûa toaùn haïng dest thay vì bit ñaàu ñöôïc ñaåy vaøo bit cuoái . VII . NHOÙM CAÙC LEÄNH LOGIC : 67
- 1 . Leänh AND : AND dest , source Chöùc naêng : Laáy noäi dung cuûa toaùn haïng source , thöïc hieän pheùp toaùn logic AND töøng bit vôùi noäi dung cuûa toaùn haïng ñích , keát quaû löu vaøo toaùn haïng ñích . Leänh naøy thöôøng duøng ñeå xoùa 1 bit naøo ñoù , ví duï muoán xoùa 1 bit cuoái cuûa thanh ghi AL ta chæ caàn thöïc hieän AND AL,00111111B 2 . Leänh OR : OR dest , source Chöùc naêng : Laáy noäi dung cuûa toaùn haïng source , thöïc hieän pheùp toaùn logic OR töøng bit vôùi noäi dung cuûa toaùn haïng ñích , keát quaû löu vaøo toaùn haïng ñích . Leänh naøy ngöôïc vôùi leänh AND , duøng ñeå baät 1 bit naøo ñoù leân 1 , ví duï muoán baät 2 bit cuoái cuûa thanh ghi AL leân 1 ta chæ caàn thöïc hieän OR AL , 11000000B 3 . Leänh XOR : XOR dest , source Chöùc naêng : Laáy noäi dung cuûa toaùn haïng source , thöïc hieän pheùp toaùn logic XOR töøng bit vôùi noäi dung cuûa toaùn haïng ñích , keát quaû löu vaøo toaùn haïng ñích . Leänh naøy thöôøng duøng ñeå xaùc ñònh nhöõng bit naøo khaùc nhau giöõa 2 toaùn haïng , hoaëc muoán ñaûo ngöôïc 1 soá bit naøo ñoù . Ví duï : Vieát chöông trình ñeám soá bit khaùc nhau giöõa 2 thanh ghi AL vaø AH . MOV dem,0 XOR AL,AH MOV CX,8 l1 : SHR AL,1 JC bit1 JMP l2 bit1 : INC dem l2 : LOOP l1 4 . Leänh NOT : NOT dest Chöùc naêng : Ñaûo ngöôïc töøng bit cuûa noäi dung toaùn haïng dest , leänh not hoaøn toaøn khoâng aûnh höôûng ñeán caùc côø . Ví duï : Vieát chöông trình set bit i vaø xoùa i cuûa thanh ghi al vaø thanh ghi ah , bieát i laø bieán daïng byte coù trò töø 0 ñeán 7 . i DB 3 mask DB 1 MOV CL,i 68