Lập trình bằng hợp ngữ với 8088

LẬP TRÌNH BẰNG HỢP NGỮ VỚI 8088 Mở đầu Trong chương trước ta đã giới thiệu khá tỉ mỉ tập lệnh của bộ vi xử lý 8086/88. Trong chương này ta sẽ giới thiệu cách lập trình dùng hợp ngữ trên các máy IBM PC hoặc tương thích với IBM PC (từ nay được gọi chung là IBM PC), vì đó là môi trường phổ thông và tiện lợi nhất để tạo ra và thử nghiệm các chương trình viết bằng hợp ngữ. Nói như vậy là vì a) về phần cứng, máy IBM PC có cấu trúc khá tiêu biểu của một hệ vi xử lý, b) về phần mềm, ta có thể tận dụng các chương trình soạn thảo văn bản hoặc rất nhiều chức năng sẵn có khác của máy IBM PC cho các chương trình của ta thông qua các dịch vụ (các chương trình con phục vụ ngắt) của các ngắt của DOS (Disk Operating System, hệ điều hành) và của BIOS (Basic Inpus Output System, hệ thống vào ra cơ sở). Tuy nhiên, một hệ thống vi xử lý cụ thể có thể có kết cấu khác một máy vi tính IBM PC, do đó khi lập trình cho các hệ thống giả định kiểu như vậy, sẽ có những chương trình mà ta không thể đem thử nghiệm trên máy IBM PC được. Các chương trình này sẽ được đánh dấu cẩn thận bằng dấu /// để ta không đem chúng cho chạy thử trên IBM PC nhằm tránh các hậu quả đáng tiếc có thể xảy ra. Ta sẽ sử dụng chương trình dịch hợp ngữ MASM 5.0 (Macro assemler phiên bản 5.0) của Microsoft với cách định nghĩa đoạn đơn giản và chế độ bộ nhớ nhỏ. Điều này hoàn toàn đủ để đáp ứng các yêu cầu nảy sinh khi ta thực hiện các chương trình đơn giản ban đầu. Ta cũng có thể dùng chương trình dịch hợp ngữ TASM 4.0 (Turbo assembler phiên bản 4.0) của Borland International để thử nghiệm các chương trình hợp ngữ. 1. Giới thiệu chung của chương trình hợp ngữ 1.1. Cú pháp của chương trình hợp ngữ Trước khi trình bày cách lập trình bằng hợp ngữ ta phải tìm hiểu qua cú pháp của ngôn ngữ này, bởi vì như ta đã biết, để làm việc được với bất kỳ một ngôn ngữ lập trình nào ta cũng cần nắm được cú pháp của nó. Chương trình dưới dạng hợp ngữ mà ta viết ra, nếu đúng về cú pháp, sẽ được chương trình dịch hợp ngữ MASM dịch ra mã máy, từ chương trình mã máy này ta có thể tạo ra các chương trình chạy (thực hiện) được ngay bằng cách dịch tiếp ra các tệp có đuôi EXE hoặc COM. Do vậy khi viết một chương trình hợp ngữ ta phải tuân thủ những quy tắc cú pháp nhất định để chương trình MASM có thể hiểu và dịch được nó.

doc55 trang | Chia sẻ: tlsuongmuoi | Lượt xem: 2137 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Lập trình bằng hợp ngữ với 8088, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Caáu truùc tuaàn töï Caáu truùc tuaán töï laø moät caáu truùc thoâng duïng vaø ñôn giaûn nhaát. Trong caáu truùc naøy caùc leänh ñöôïc saép xeáp tuaàn töï, leänh noï tieáp leänh kia. Sau khi thöïc hieän xong leänh cuoái cuøng cuûa caáu truùc thì coâng vieäc phaûi laøm cuõng ñöôïc hoaøn taát. Ngöõ phaùp: Leänh1 Leänh2 . . Leänhn Ví duï Caùc thanh ghi CX vaø BX chöùa caùc giaù trò cuûa bieán c vaø b. Haõy tính giaù trò cuûa bieåu thöùc a = 2´(c+b) vaø chöùa keát quaû trong thanh ghi AX. Giaûi Ta coù theå thöïc hieän coâng vieäc treân baèng maãu chöông trình sau: XOR AX, AX ; toång taïi AX luùc ñaàu laø 0. ADD AX, BX ; coäng theâm b. ADD AX, CX ; coäng theâm c. SHL AX, l ; nhaân ñoâi keát quaû trong AX. RA: ; loái ra cuûa caáu truùc. · Caáu truùc IF - THEN Ngöõ phaùp (hình 4.2): IF Ñieàu kieän THEN coâng vieäc. Töø ngöõ phaùp cuûa caáu truùc IF-THEN ta thaáy neáu thoaû maõn Ñieàu kieän thì Coâng vieäc ñöôïc thöïc hieän neáu khoâng Coâng vieäc seõ bò boû qua. Ñieàu naøy töông ñöông vôùi vieäc duøng leänh nhaûy coù ñieàu kieän ñeå boû qua moät thao taùc naùo ñoù trong chöông trình hôïp ngöõ. Ñieàu kieän Coâng vieäc Sai Ñuùng Hình 4.2 Caáu truùc IF-THEN Ñieàu kieän Sai Ñuùng Coâng vieäc 1 Coâng vieäc 1 Hình 4.3 Caáu truùc IF-THEN-ELSE Ví duï Gaùn cho BX giaù trò tuyeät ñoái cuûa AX. Giaûi Ñeå thöïc hieän pheùp gaùn BX ¬ ½AX½ ta coù theå duøng caùc leänh sau: CMP AX,0 ; AX<0? JNL GAN ; khoâng, gaùn luoân. NEG AX ; ñuùng. ñaøo daáu, roài GAN: MOV BX, AX ; loái ra cuûa caáu truùc. · Caáu truùc IF - THEN - ELSE Ngöõ phaùp (hình 4.3): IF ÑieàuKieän THEN CoângVieäc1 ELSE CoângVieäc2 Töø ngöõ phaùp cuûa caáu truùc IF-THEN-ELSE ta thaáy neáu thoaû maõn Ñieàu kieän thì Coângvieäc1 ñöôïc thöïc hieän neáu khoâng thì Coângvieäc2 ñöôïc thöïc hieän. Ñieàu naøy töông ñöông vôùi vieäc duøng leänh nhaûy coù ñieàu kieän vaø khoâng ñieàu kieän ñeå nhaûy ñeán caùc nhaõn naøo ñoù trong chöông hôïp ngöõ. Ví duï Gaùn cho CL giaù trò bit daáu cuûa AX. Giaûi Ta coù theå thöïc hieän caùc coâng vieäc treân baèng maåu chöông trình sau: QR AX, AX ; AX>0?. JNS DG ; ñuùng. MOV CL, l ; sai, cho CL ¬ 1 roài JMP RA ; di ra. DG: XOR CL, CL ; cho CL ¬ 0. RA: ; loái ra cuûa caáu truùc. · Caáu truùc CASE Ngöõ phaùp (hình 4.4) : CASE Bieåuthöùc Giaùtrò1: Coângvieäc1 Giaùtrò2: Coângvieäc2 . . . GiaùtròN: CoângvieäcN END CASE Bieåuthöùc Coângvieäc1 CoângvieäcN Coângvieäc2 Giaùtrò1 Giaùtrò2 GiaùtròN Hình 4.4. Caáu truùc leänh CASE Töø ngöõ phaùp cuûa caáu truùc ta thaáy neáu Bieåuthöùc coù Giaùtrò1 thì Coângvieäc1 ñöôïc thöïc hieän. neáu Bieåuthöùc coù Giaùtrò2 thì Coângvieäc2 ñöôïc thöïc hieän vaø ... Ñieàu naøy töông ñöông vôùi vieäc duøng caùc leänh nhaûy coù ñieàu kieän vaø nhaûy khoâng ñieàu kieän ñeå nhaõy caùc nhaõn naøo ñoù trong chöông trình hôïp ngöõ. Caáu truùc CASE coù theå thöïc hieän baèng caùc caáu truùc löïa choïn loáng nhau. Ví duï Duøng CX ñeå bieåu hieän caùc giaù trò khaùc nhau cuûa AX theo quy taéc sau: Neáu AX < 0 thì CX =-1, neáu AX = 0 thì CX =0, neáu AX > 0 thì CX =1. Giaûi Ta coù theå thöïc hieän caùc coâng vieäc treân baèng maãu chöông trình sau: CMP AX, 0 ; Kieåm tra daáu cuûa AX. JL AM ; AX<0. JE KHONG ; AX =0. JG DUONG ; AX > 0. AM: MOV CX, -1 JMP RA DUONG: MOV CX, 1 JMP RA KHONG: XOR CX. CX RA: ; loái ra cuûa caáu truùc. · Caáu truùc laëp FOR - DO Ngöõ phaùp (hình 4.5): FOR Soá laàn laëp DO Coâng vieäc Töø ngöõ phaùp cuaû caáu truùc FOR - DO ta thaáy ôû ñaây Coâng vieäc ñöôïc thöïc hieän laëp ñi laëp laïi taát caû Soá laàn laëp laïi. Ñieàu naøy hoaøn toaøn töông ñöôg vôùi vieäc duøng leänh LOOP trong hôïp ngöõ ñeå laëp laïi CX laàn moät Coâng vieäc naøo ñoù, ñöông nhieân tröôùc ñoù ta phaûi gaùn Soá laàn laëp cho thanh ghi CX. Ví duï Hieån thò moät doøng kí töï '$' treân maøn hình. ìKhôûi ñaàu boä ñeám Coâng vieäc ìGiaûm boä ñeám ñi 1 sai Boä ñeám=0 ñuùng Hình 4.5. Caáu truùc laëp FOR - DO. Giaûi Moät doøng maøn hình treân maùy IBM PC chöùa ñöôïc nhieàu nhaát laø 80 kí töï. Ta seõ söû duïng haøm 2 cuûa ngaét 21H ñeå hieån thò 1 kí töï. Ta phaûi laëp laïi coâng vieäc naøy 80 laàn caû thaûy baèng leänh LOOP. Muoán duøng leän naøy, ngay töø ñaàu ta phaûi naïp vaøo thanh ghi CX soá laàn hieån thò, noäi dung cuûa Cx ñöôïc töï ñoäng giaûm ñi1 do taùc ñoäng cuûa leänh LOOP. Sau ñaây laø maåu chöông trình thöïc hieän caùc coâng vieäc treân: MOV CX, 80 ; soá laàn hieän thò trong cx MOV AH, 2 ; AH chöùa soá hieäu haøm hieän thò, MOV DL, '$' ; DL chöùa kí töï caàn hieän thò, HIEN: INT 21H ; hieän thò LOOP HIEN ; caû moät doøng kí töï. RA: ; loái ra cuûa caáu truùc. · Caáu truùc laëp WHILE - DO Ngöõ phaùp (hình 4.6): WHILE Ñieàu kieän DO Coâng vieäc Töø ngöõ phaùp cuûa caáu truùc WHILE - DO ta thaáy: Ñieàu kieän ñöôïc kieåm tra ñaàu tieân. Coâg vieäc ñöôïc laëp ñi laëp laïi chöøng naøo Ñieàu kieän coøn ñuùng. Ñieàu naøy trong hôïp ngöõ hoaøn toaøn töông ñöông vôùi vieäc duøng leänh CMP ñeå kieåm tra Ñieàu kieän vaø sau ñoù duøng leänh nhaûy coù ñieàu kieän ñeå thoaùt khoûi voøng laëp. Ñieàu kieän Coâng vieäc sai ñuùng sai ñuùng Ñieàu kieän Coâng vieäc Hình 4.6. Caáu truùc WHILE - DO Hình 4.7. Caáu truùc REPEAT - UNTIL Ví duï Ñeám soá kyù töï ñoïc ñöôïc töø baøn phím, khi gaëp kyù töï CR thì thoâi. Giaûi Ta coù theå thöïc hieän coâng vieäc treân baèng maåu chöông trình sau: XOR CX, CX ; toång soá kyù töï ñoïc ñöôïc luùc ñaàu laø 0 MOV AH, 1 ; haøm ñoïc kyù töï töø baøn phím. TIEP: INT 21H ; ñoïc 1 kyù öï, Al chöùa maõ kyù töï. CMP AL, 13 ; ñoïc ñöôïc CR? JE RA ; ñuùng, ra. INC CX ; sai, theâm 1 kyù töï vaøo toång. RA: ; loái ra cuûa caáu truùc. · Caáu truùc laëp REPEAT - UNTIL Ngöõ phaùp (hình 4.7: REPEAT Coâng vieäc UMTIL Ñieàu kieän Töø ngöõ phaùp cuûa caáu truùc REPEAT - UNTIL ta thaáy: Coâng vieäc ñöôïc thöïc hieän ñaàu tieân. Ñieàu ñoù coù nghóa laø coâng vieäc ñöôïc thöïc hieän ít nhaát moät laàn . Ñieàu kieän ñöôïc kieåm tra sau ñoù. Coâng vieäc ñöôïc laëp ñi laëp laïi cho tôùi Ñieàu kieän ñöôïc thoaû maõn. Ñieàu naøy trong hôïp ngöõ hoaøn toaøn töông ñöông vôùi vieäc duøng leänh CMP ñeå kieåm tra Ñieàukieän vaø sau ñoù duøng leänh nhaûy coù ñieàu kieän ñeå thoaùt khoûi voøng laëp. Ví duï: Ñoïc kyù töï töø baøn phím cho tôùi khi gaëp '$' thì thoâi. Giaûi Ví duï naøy chæ laøm moät phaàn coâng vieäc cuûa ví duï tröôùc. Taïi ñaây ta chæ phaûi ñoïc caùc kyù töï ñoïc ñöôïc. Ta coù theå töïc hieän coâng vieäc treân baèng maåu chöông trình sau: MOV Ah, 1 ; haøm ñoïc kyù töï baøn phím. TIEP: INT 21H ; ñoïc 1 kyù töï. CMP AL, '$' ; ñoïc ñöôïc ñoâla ? RA: ; loái ra cuûa caáu truùc. 4. Moät soá chöông trình cuï theå: Trong phaàn naøy ta seõ xeùt moät soá chöông trình cho caùc öùng duïng cuï theå, thoâng qua caùc ví duï naøy ta coù theå hoïc ñöôïc caùc leänh, caùch laäp chöông trình cuøng vôùi caùch toå chöùc döõ lieäu ñeå giaûi quyeát caùc baøi toaùn cuï theå. Moät soá chöông trình lieân quan ñeán caùc vaán ñeà khaùc chöa ñöôïc ñeà caäp ñeán töø tröôùc ñeán nay coù theå ñöôïc neâu ra ôû nhöõng chöông töông öùng sau chöông naøy. Tröôùc khi giôùi thieäu caùc ví duï ta heä thoáng laïi moät vaøi haøm cuûa caùc loaïi ngaét coù trong maùy IBM PC vôùi heä ñieàu haønh MS DOS hay chöa ñöôïc duøng trong caùc ví duï ñaõ neâu tröôùc ñaây vaø sau naøy. Ngaét INT 20H daønh rieâng ñeå keât thuùc chöông trình loaïi . COM Haøm 1 cuûa ngaét INT 21H: ñoïc 1 kyù töï töø baøn phím Vaøo: AH = 1 Ra: AL = maõ ASCH cuûa kyù töï caàn hieän thò Al = 0 khi kyù töï goõ vaøo laø töø caùc phím chöùc naêng Haøm 2 cuûa ngaét INT 21H: hieän 1 kyù töï leân maøn hình Vaøo: AH = 2 DL = maõ ASCH cuûa kyù töï caàn hieän thò. Haøm 9 cuûa ngaét INT 21H: hieän chuoãi kyù töï vôùi $ ôû cuoái leân maøn hình Vaøo: AH = 9 DX = ñòa chæ leäch cuûa chuoãi kyù töï caàn hieän thò. Haøm 4CH cuûa ngaét INT 21H: keát thuùc chöông trình loaïi . EXE Vaøo: AH = 4CH Moät ñieàu caàn nhaéc laïi laàn nöõa ñeå löu yù khi ñoïc caùc ví duï Daáu \\\\\\\\ ( neáu coù) ñaët tröôùc moät ví du laø ñeå caûnh baùo raèng ví duï lieân quan chæ duøng ñeå moâ taû thuaät giaûi cho vaán ñeà naøo ñoù maø khoâng chaïy ñöôïc treân caùc maùy IBM PC hoaëc töông thích. · Caùc ví duï: Ví duï 1 Trong phaàn ñaàu cuûa chöông trình hôïp ngöõ ta coù giöùo thieäu moät chöông trình hieän lôøi chaøo baêng tieáng Anh "Hello". Baây giôø ta phaûi theâm moät lôøi chaøo baèng tieáng Vieät khoâng daáu "Chao ban" naèm caùch lôøi chaøo "Hello" tröôùc ñaây moät soá doøng nhaát ñònh naøo ñoù. Giaûi Ta cuõng vaãn söû duïng phöông phaùp ñaõ ñöôïc duøng ôû chöông trình maãu tröôùc ñaây ñeå hieän thò lôøi chaøo 'taây', hieän caùc doøng giaõn caùch vaø hieän lôøi chaøo 'ta'. Trong ví duï naøy ta cuõng boû bôùt ñi caùc doøng caùch ôû ñaàu vaø cuoái ñeå chöông trình ñôõ röôøm raø. . Model Small . Stack 100 . Data CRLF DB 13, 10, '$' Chao tay DB 'hello!$' ChaoTa DB 'Chao ban!$' . Code MAIN Proc ; khôûi ñaàu thanh ghi DS MOV AX, @ Data MOV DS, AX ; hieän thò lôøi chaøo duøng haøm 9 cuûa INT 21H MOV AH, 9 LEA DX, ChaoTay INT 21H ; caùch 5 doøng duøng haøm 9 cuûa INT 21H LEA DX, CELF MOV CX, 6 CX chöùa soá doøng caùch +1 LAP: INT 21H LOOP LAP ; hieän thò lôøi chaøo duøng haøm 9 cuûa INT 21H LEA DX, ChaoTa INT 21H ; trôû veà DOS duøng haøm 4 CH cuûa INT 21H MOV AH, 4CH INT 21H MAIN Endp END MAIN Trong chöông trình treân ta ñaõ duøng thanh ghi CX ñeå chöùa soá doøng phaûi giaõn caùch. Vôùi caùch laøm naøy moãi khi muoán thay ñoåi soá doøng daõn caùch giöõa 2 lôøi chaøo ta vaø lôøi chaøo taây, ta phaûi gaén giaù trò khaùc cho thaønh ghi CX. Ñieàu naøy chaéc chaén laø khoâng phaûi thuaän tieän ñoái vôùi ngöôøi söû duïng chöông trình. Ví duï 2 Treân cô sôû ví duï tröôùc, ta phaûi vieát chöông trình sao cho soá doøng phaûi giaõn caùch coù theå thay ñoåi ñöôïc ngay trong khi chaïy chöông trình. Giaûi Muoán coù soá doøng caùch thay ñoåi ñöôïc theo yù muoán giöõa 2 lôøi chaøo ta vaø taây khi chaïy chöông trình maø khoân phaûi thay giaù trò môùi gaùn cho thanh ghi CX ngay trong chöông trinh nhö ôû ví duï tröôùc, ta caàn duøng theâm 1 bieán môùi ñeå chöùa soá doøng caùch vaø vieát chöông trình sao cho môùi ñeå chöùa soá doøng caùch vaø vieát chöông trình sao cho moãi khi cho chaïy chöông trình coù theâm phaàn ñoái thoaïi ñeå ngöôøi söû duïng coù theå tuøy yù thay ñoåi giaù trò cuûa soá doøng giaõn caùch ñoù. thay ñoåi giaù trò cuûa soá doøng giaõn caùch ñoù. Sau ñaây laø vaên baûn cuûa chöông trình thöïc hieän coâng vieäc treân: . Model Small . Stack 100 . Data CRLF DB 13,10,'$' ChaoTay DB 'Hello!S' Chaota DB 'Chao ban!S' .Code MAIN Proc ; khôûi ñaàu thanh ghi DS MOV AX, @Data MOV DS,AX ; hieån thò lôøi chaøo duøng haøm 9 cuûa INT 21H MOV AH, 9 LEA DX, ChaoTay INT 21H ; Caùch 5 doøng duøng haøm 9 cuûa INT 21H LEA DX, CFLF MOV CX, 6 ; CX chöùa soá doøng caùch +1 LAP: INT 21H LOOP LAP ; hieån thò lôøi chaøo duøng haøm 9 cuûa INT 21H LEA DX, ChaoTa INT 21H ; trôû veà DOS duøng haøm 4CH cuûa INT 21H MOV AH, 4CH I'NT 21H MAIN Endp END MAIN Trong chöông trình treân ta ñaõ duøng thanh ghi CX ñeå chöùa soá doøng phaûi giaõn caùch. Vôùi caùch laøm naøy moãi khi muoán thay ñoåi soá doøng giaõn caùch giöõa hai lôøi chaøo ta vaø lôøi chaøo taây, ta phaûi gaùn giaù trò khaùc cho thanh ghi CX. Ñieàu naøy chaéc chaén khoâng phaûi laø thuaän tieän ñoái vôùi ngöôøi söû duïng chöông trình. Ví duï 2 Treân cô sôû ví duï tröôùc, ta phaûi vieát chöông trình sao cho soá doøng phai giaõn caùch coù theå thay ñoåi ñöôïc ngay trong khi chaïy chöông trình. Giaûi Muoán coù soá doøng caùch thay ñoåi ñöôïc theo yù muoán giöõa 2 lôøi chaøo ta vaø taây khi chaïy chöông trình maø khoâng phaûi thay giaù trò môùi gaùn cho thanh ghi CX ngay trong chöông trình nhö ôû ví duï tröôùc, ta caàn duøng theâm 1 bieán môùi ñeå chöùa soá doøng caùch vaø vieát chöông trình sao cho moãi khi cho chaïy thì chöông trình coù theâm phaàn ñoái thoaïi ñeå ngöôøi söû duïng coù theå thay ñoåi giaù trò cuûa soá doøng giaõn caùch ñoù. Sau ñaây laø vaên baûn cuûa chöông trình thöïc hieän coâng vieäc treân: .Model Small .Stack 100 .Data CRLF DB 13,10,'$' ChaoTay DB 'Hello!S' ChaoTa DB 'Chao ban!S' Thongbao DB 'go vao so dong cach:S' SoCRLF DB ? .Code MAIN Proc MOV AX, @Data ; khôûi ñaàu thanh ghi DS MOV DS, AX ; hieän thoâng baùo duøng haøm 9 cuûa INT 21H MOV AH, 9 LEA DX, Thongbao INT 21H ; ñoïc soá doøng caùch duøng haøm 1 cuûa INT 21H MOV AH, 1 INT 21H ; ñoïc soá doøng caùch AND AL, OFH ; ñoåi ra heä hai MOV SoCRLE, AL ; caát ñi ; caùch 1 doøng duøng haøm 9 cuûa INT 21H MOV AH, 9 LEA DX, CRLF INT 21H ; hieån thò lôøi chaøo duøng haøm 9 cuûa INT 21H MOV AH, 9 LEA DX, ChaoTay INT 21H LEA DX, CFLF XOR CX, CX MOV CL, SoCRLE ; CX chöùa soá doøng caùch LAP: INT 21H LOOP LAP ; hieän thò lôøi chaøo duøng haøm 9 cuûa INT 21H LEA DX, ChaoTa INT 21H ; trôû veà DOS duøng haøm 4CH cuûa INT 21H MOV AH, 4CH INT 21H MAIN Endp END MAIN Trong thí duï treân coù moät ñieàu caàn chuù yù laø khi ñoïc moät kyù töï töø baøm phím (trong tröôøng hôïp cuï theå naøy thì ñoù laø soá doøng caùch) ta seõ thu ñöôïc trong thanh ghi AL maõ ASCII cuûa kyù töï (soá ) ñaõ goõ. Ñeå söû duïng noù trong tröôøng hôïp cuï theå nhö moät giaù trò soá vaø caát noù taïi bieán SoCRLF, ta phaûi bieán ñoåi maõ ASCII naøy thaønh heä soá hai. Ñeå ñoái maõ ASCII cuûa moät soá ra trò soá hoaëc ngöôïc laïi ta caàn nhôù raèng giöõa giaù trò soá vaø maõ ASCII cuûa soá ñoù coù moät khoaûng caùch laø 30H. ví duï soá 9 coù maõ ASCII laø 39 HH (coù theå ñöôïc vieát laø "9"), töông töï soá 0 coù maõ ASCII laø 30H (coù theå ñöôïc vieát laø "0") Nhö vaäy vieäc bieán ñoåi maõ ASCII (giaû thieát ñaõ coù saün trong AL)® giaù trò soá coù theå thöïc hieän ñöôïc baèng moät trong caùc leänh sau: + SUB AL30H + AND AL0FH Töông töï nhö vaäy, vieäc bieán ñoåi ngöôïc laïi töø soá heä hai (thöôøng giaû thieát ñaõ coù saün trong thanh ghi DL) ® maõ ASCII (ñeå ñöa ra hieän leân maõn hình) coù theå laøm ñöôïc baèng moät trong caùc leänh sau: + ADD DL30H + OR DL30H Ví duï 3 Ñoïc töø baøn phím moät soá heä hai (daøi nhaát laø 16 bit), keát quaû ñoïc ñöôïc ñeå taïi thanh ghi BX. Sau ñoù hieän noäi dung thanh ghi BX ra maøn hình. Giaûi Coâng vieäc cuûa maøi naøy thöïc chaát goàm hai phaàn, moät phaàn ñaàu ta phaûi ñoïc ñöôïc soá heä hai vaø caát noù taïi BX, trong phaàn tieáp theo ta phaûi ñöa ñöôïc noäi dung cuûa thanh ghi BX ra maøn hình. Sau ñaây laø vaên baûn cuûa chöông trình thöïc hieän coâng vieäc treân: .Model Small .Stack 100 . Data TBao DB 'Go vao 1 so he hai (max 16 bit,' DB 'CR de thoi):$' .Code MAIN proc MOV AX, @ Data MOV DS, AX MOV AH, 9 ; hieän thò thoâng baùo LEA DX, TBao INT 21H XOR BX,BX ; BX chöùa keát quaû, luùc ñaàu laø 0 MOV AH, 1 ; haøm ñoïc 1 soá töø baøn phím TIEP: INT 21H CMP AL, 13 ; CR? JF THOIDOC ; ñuùng, thoâi ñoïc AND AL,OFH ; khoâng, ñoåi maõ ASCII ra soá SHL BX, 1 ; dòch traùi BX 1 bít ñeå laáy choã OR BL,AL ; cheøn bít vöøa ñoïc vaøo keát quaû JMP TIEP ; ñoïc tieáp moät kyù töï THOIDOC:MOV CX,16 ; CX chöùa soá bít cuûa BX MOV AH,2 ; haøm hieän kyù töï HIEN:XOR DL,DL ; xoaù DL ñeå chuaån bò ñoåi ROL BX,1 ; ñöa bít MSB cuûa BX sang CF ADC DL, 30H ; ñoåi giaù trò bít ñoù ra ASCII INT 21H ; hieån thò 1 bít cuûa BX LOOP HIEN ; laëp laïi cho ñeán heát MOV AH, 4CH ; trôû veà DOS INT 21H MAIN Endp END MAIN Chöông trình hôïp ngöõ cho coâng vieäc ñaõ neâu ñöôïc hình thaønh töø 2 phaàn, moät phaàn vôùi chöùc naêng ñoïc vaø moät phaàn vôùi chöùc naêng hieän thò. Thuaät toaùn cho phaàn ñoïc: ñoïc moät kyù töï soá, chuyeån maõ ASCII ra soá roài cheøn soá ñoïc ñöôïc vaøo BX theo thöù töï töø phaûi qua traùi, laëp laïi coâng vieäc treân caùc soá khaùc. Thuaät toaùn cho phaàn hieän thò ngöôïc laïi so vôùi phaàn ñoïc: laáy ra 1 bít cuûa soá ñoù trong BX theo thöù töï töø traùi qua phaûi, ñoåi soá ñoù ra maõ ASCII roài cho hieän thò noù ra maøn hình, laëp laïi coâng vieäc treân cho caùc soá khaùc. Caùc thuaät toaùn cuûa2 phaàn treân veà cô baûn coù theå öùng duïng ñöôïc cho tröôøng hôïp phaûi ñoïc vaø hieän thò soá heä möôøi saùu hoaëc heä möôøi. Moät soá nhaän xeùt coù theå ruùt ra khi ñoïc chöông trình treân: + Leänh xoùa thanh ghi BX laø raát caàn thieát ñeå sau naøy khi goõ vaøo caùc bít cuûa noù ta khoâng nhaát thieát phaûi goõ ñuû 16 bít maø vaãn xaùc ñònh ñöôïc giaù trò cuûa thanh ghi naøy. + Trong chöông trình naøy ta ñaõ duøng leänh ROL ñeå quay troøn thanh ghi BX, vì vaäy sau khi quay vaø hieän thò taát caû 16 bít cuûa BX ta vaãn baûo toaøn ñöôïc giaù trò cuûa thanh ghi BX luùc ñaàu. Ñeå so saùnh , neáu ôû phaàn treân thay vì leänh quay ROL ta duøng leänh dòch SHL thì ta vaãn hieän thò ñöôïc ñuùng thanh ghi BX, nhöng sau khi hieän thò xong thì quaù trò nguyeân thuûy cuûa thanh ghi BX, nhöng sau khi hieän thò xong thì giaù trò nguyeân thuyû cuûa thanh ghi BX bò maát do quaù trình dòch gaây neân. + Trong chöông trình naøy ta ñaõ duøng leänh coäng coù nhôù ADC moät caùch raát hieäu duïng ñeå laáy ra 1 bít cuûa thanh ghi BX töø giaù trò cuûa côø CF vaø ñoåi luoân ñöôïc noù ra maõ ASCII caàn thieát cho vieäc hieän thò. Ví duï 4 Ngöôøi ta ñeå saün trong boä nhôù 2 soá heä hai, moãi soá naøy coù ñoä daøi 10 byte vaø ñöôïc ñeå theo thöù töï MSB...LSB. Ta phaûi tính toång cuûa hai soá nhieàu byte ñoù, keát quaû cuõng ñeå trong boä nhôù. Giaûi Ñeå laøm tính coäng vôùi caùc toaùn haïng laø caùc soá vôùi ñoä daøi nhieàu hôn 1 byte nhö treân ta phaûi nghó ngay ñeán vieäc duøng leänh coäng coù nhôù ADC cho caùc byte naèm beân traùi cuûa LSB. Coøn ñeå coäng caùc byte LSB cuûa 2 soá, taát nhieân ta phaûi duøng leänh coäng bình thöôøng ADD. Ñeå cho vieäc toå chöùc caùc leänh trong chöông trình ñöôïc toái öu, ta thay theá leänh ADD trong tröôøng hôïp coäng 2 LSB naøy baèng leänh ADC nhöng vôùi côø CF = 0. Xeùt veà maët toå chöùc döõ lieäu cho chöông trình trong ñoaïn döõ lieäu, ta thaáy maûng oâ nhôù duøng chöùa keát quaû caàn coù ñoä daøi 11 byte ñeå chöùa heát ñöôïc keát quaû cuûa pheùp coäng trong tröôøng hôïp toång quaùt. Chính vì vaäy ta cuõng caàn taêng ñoä daøi cho caùc maûng chöùa toaùn haïng, moãi maûng theâm 1 byte nöõa, gaùn saün cho chuùng giaù trò 0 vaø ñaët phía tröôùc caùc byte MSB ñeå taïo ra ñoä daøi thoáng nhaát cho caùc maûng döõ lieäu chöùa caùc toaùn haïng vaø keát quaû cuûa pheùp coäng. Baèng caùch naøy trong khi vieát chöông trình ta coù theå ñaït ñöôïc vieäc quaûn lyù ñôn giaûn hôn ñoái vôùi caùc thanh ghi leäch. Sau ñaây laø chöông trình thöïc hieän coâng vieäc noùi treân. .Model Small .Stack 100 .Data TBao DB 'DU lieu bat dau tö day' So1 DB 00, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10 So2 DB 00, y1, y2, y3, y4, y5, y6, y7, y8, y9, y10 ;xi vaø yi phaûi ñöôïc thay baèng soá cuï theå ; Sum DB 11 dup (0) . Code MAIN proc MOV AX, @Data MOV DS, AX MOV ES, AX LEA BX, So1 ; BX troû vaøo ñaàu daõy So1 LEA SI, So2 ; SI troû vaøo ñaàu daõy So2 LEA DI, Sum ; DI troû vaøo ñaàu daõy Sum MOV CX, 11 ; CX chöùa soá byte phaûi coäng XOR AL, AL ; xoùa côø CF vaø AL LAP:MOV AL, 10[BX] ; laáy 1 byte cuûa So1 ADC AL, 10[SI] ; coäng vôùi byte cuûa So2 MOV 10[DI],AL ; caát keát quaû vaøo Sum DEC BX ; giaûm con troû tôùi caùc maûng DEC SI DEC DI LOOP LAP ; laëp laïi vôùi caùc byte khaùc MOV AH, 4CH ; trôû veà DOS INT 21H MAIN Endp END MAIN Trong chöông trình treân ta khoâng coù phaàn leänh ñeå hieän thò keát quaû cuûa pheùp coäng, vì vaäy ngay caû khi ñaõ thay caùc giaù trò soá cuï theå vaøo caùc bieán So1 vaø So2 roài dòch ra teäp chöông trình coù ñuoâi.EXE vaø cho chaïy noù, ta cuõng khoâng kieåm tra keát quaû baèng caùch duøng chöông trình tìm loãi Debug (xem theâm phaàn phuï luïc ñeå hieåu ñöôïc caùc thao taùc caàn thieát trong Debug). Baèng chöông trình Debug ta coù theå quan saùt ñöôïc caùc leänh cuûa chöông trình treân ñöôïc dòch vaø caát trong boä nhôù nhö theá naøo, ñoàng thôøi ta cuõng xem ñöôïc caùc maûng döõ lieäu cuûa 2 toaùn haïng vaø cuûa keát quaû ñöôïc toå chöùc ra sao trong boä nhôù. Luùc naøy ta môùi giaûi thích lyù do taïi sao ta coù ñònh nghóa doøng thoâng baùo TBao trong ñoaïn döõ lieäu maø ôû beân trong chöông trình treân ta ñaõ khoâng heà söû duïng ñeán noù. Thöïc chaát ñaây chi laø caùch duøng moät chuoãi kyù töï ñeå ñaùnh daáu ñoaïn döõ lieäu maø ta quan taâm. Ñieàu naøy cho pheùp ta deã daøng nhaän ñöôïc ñoaïn döõ lieäu maø ta quan taâm. Ñieàu naøy cho pheùp ta deã daøng nhaän ra ñöôïc ñoaïn döõ lieäu maø ta caàn quan taâm trong moät vuøng nhôù chöùa döõ lieäu moãi khi ta duøng Debug ñeå xem noäi dung cuûa noù. Baây giôø ta seõ ñeà caäp ñeán vaán ñeà söû duïng Deug cuï theå hôn. Neáu ta goõ vaên baûn cuûa chöông trình treân roài ñaët teân laø teäp ADC.ASM vaø dòch noù ra teäp ADC.EXE ta coù theå duøng leänh sau ñeå chaïy ADC trong Debug: Debug adc.exe Treân maøn hình seõ xuaát hieän daáu-ñoù laø daáu nhaéc cuûa Debug Taïi daáu nhaéc ñoù cuûa Debug neáu ta goõ -u 0 60 ta seõ nhaän ñöôïc moät maøn hình, trong ñoù moät beân chöùa ñòa chæ caùc oâ nhôù keøm theo noäi dung cuûa caùc oâ ñoù (caùc maõ leänh vaø döõ lieäu) vaø beân kia laø caùc doøng leänh gôïi nhôù töông öùng. Thöïc ra phaàn maõ leänh cuûa chöông trình keát thuùc taïi ñòa chæ IP=0029H (byte cuoái cuûa leänh INT 21H). Tieáp ngay sau ñoù chính laø phaàn daønh cho caùc döõ lieäu cuûa caùc toaùn haïng vaø keát quaû, nhö nhöõng döõ lieäu ñoù luùc naøy (do ta ñang ôû cheá ñoä dòch ngöôïc -unassemble) ñaõ bò Debug coi nhö laø maõ leänh vaø ñöôïc dòch ra thaønh caùc leänh gôïi nhôù. Muoán xem caùc maûng döõ lieäu naøy ta goõ: -d CS:0 60 ta seõ thaáy maõ leänh vaø döõ lieäu coù taïi moät ñòa chæ naøo ñoù ñöôïc hieän leân theo 2 kieåu: baèng caùc soá heä möôøi saùu (phaàn beân traùi) vaø baèng caùc kyù töï ASCII (phaàn beân phaûi). Chính treân phaàn hieän thò ôû beân phaûi naøy ta deã daøng nhaän thaáy doøng kyù töï duøng ñeå ñaùnh daâu maø ta ñaõ noùi ñeán tröôùc ñaây ('Du lieu bat dau tu day'). Neáu laáy haøng chöõ naøy laøm moác vaø nhìn sang phaàn hieän thò döôùi daïng soá heä möôùi saùu ôû beân traùi (baét ñaàu töø ñòa chæ leäch 002AH) ta deã daøng ta tìm ra vò trí vaø noäi dung cuûa caùc byte döõ lieäu (laø caùc toaùn haïng) vaø keát quaû (keát quaû ñöôïc taïm gaùn baèng 0 luùc ñaàu). Ñeå xem chöông trình naøy cho keát quaû ra sao ta phaûi cho noù chaïy trong moâi tröôøng Debug. Muoán vaäy ta coù theå goõ -g 50 Sau khi nhaän ñöôïc töø maáy caâu traû lôøi 'program terminated normally' -chöông trình keát thuùc bình thöôøng (khoâng loãi), ta goõ tieáp -d CS: 0 50 ñeå xem keát quaû cuûa chöông trình sau khi chaïy ñöôïc caát giöõ trong boä nhôù ra sao. Sau ñaây laø moät tröôøng hôïp cuûa chöông trình treân vôùi caùc döõ lieäu cuï theå. Neáu ta goõ vaøo caùc byte cuûa caùc toaùn haïng vieát döôùi daïng caùc soá heä möôøi saùu: So1 = 00H 80H 81H 82H 83H 80H 80H 80H 83H 84H 85H vaø So2 = 00H 80H 81H 82H 83H 80H 80H 80H 83H 84H 85H thì khi cho chaïy chöông trình ta seõ nhaän ñöôïc. Sum = 01H 01H 03H 05H 07H 01H 01H 01H 07H 09H 0AH Ta coù theå tính 'baèng tay' ñeå kieåm chöùng laïi keát quaû treân. Cuoái cuøng ñeå ra khoûi Debug ta goõ - q Qua moät vaøi thao taùc sô boä trong ví duï treân ta cuõng ñaõ thaáy ñöôïc phaàn naøo söï tieän lôïi cuûa chöông trình Debug trong vieäc cho chaïy vaø thöû nghieäm caùc chöông trình hôïp ngöõ ñôn giaûn Ví duï 5 Trong thanh ghi BX coù saün 4 soá heä möôøi saùu, moãi soá ñöôïc bieåu dieãn baèng 1 oâ maøu: Haõy laäp trình ñeå bieán ñoåi thanh ghi BX thaønh: (ví duï: neáu nhö luùc ñaàu thanh ghi BX chöùa giaù trò 1234H thì sau khi bieán ñoåi, BX seõ chöùa giaù trò 3241H.v.v...) Giaûi Thöïc chaát ñaây laø kieåu baøi toaùn cuï theå naøy, sau khi xem xeùt daïng thöùc cuûa thanh ghi BX tröôùc vaø sau khi bieán ñoåi, ta thaáy coù theå thu ñöôïc keát quaû moât caùch raát ñôn giaûn baèng caùch quay traùi thanh ghi BX nguyeân goác ñi 12 bít roài sau ñoù quay tieáp thanh ghi BH ñi 4 bít laø xong. Sau ñaây laø chöông trình thöïc hieän coâng vieäc treân. .Model Small .Stack 100 .Code MAIN Proc MOV CL,12 ROL BX,CL ; quay BX ñi 12 bít MOV CL, 4 ROR BH, CL ; traùo 4 bít thaáp vaø cao cuûa BH MOV AH, 4CH ; trôû veà DOS INT 21H MAIN Endp END MAIN Ví duï 6 Coù moät chuoãi kyù töï trong boä nhôù. Haõy taïo ra moät baûn sao cuûa choãi treân roài caát trong boä nhôù. Giaûi Ñeå giaûi baøi toaùn loaïi naøy coù theå öùng duïng caùc leänh chuyeån chuoåi. Sau ñaây laø caùch toå chöùc döõ lieäu vaø chöông trình cho baøi toaùn treân vôùi ñoä daøi choãi laø 8 byte .Model Small .Stack 100 .Data Str1 DB 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' Tbao DB "baûn sao cuûa choãi goác:', 10,13 Str2 DB 8 DUP (' ') DB '$' . Code MAIN proc MOV AX, @Data ; khôûi ñaàu cho DS vaø ES MOV DS, AX MOV ES, AX LEA SI, Str1 ; SI chæ vaøo chuoãi goác. LEA DI, Str2 ; DI chæ vaøo chuoãi ñích. CLD ; ñònh höôùng tieán MOV CX, 8 ; CX chöùa soá byte phaûi coùp REP MOVSB ; coùp sang choãi ñích LEA DX, Tbao ; chuaån bò hieån thò baûn sao MOV AH, 9 INT 21H MOV AH, 4CH ; veà DOS INT 21H MAIN Endp END MAIN Ví duï 7 Coù moät chuoãi kyù töï thöôøng trong boä nhôù. Haõy taïo ra moät chuoãi kyù töï chöõ hoa töø chuoãi treân roài caát chuoãi ñoù trong boä nhôù. Giaûi: Ví du naøyï vaø ví duï tröôùc khi khaùc nhau chuùt ít trong vieäc xöû lyù caùc kyù töï cuûa chuoãi, vì vaäy phaàn treân caùc leänh coù tính chaát chuaån bò tröôùc vaø sau caùc thao taùc vôùi chuoãi coù theå coi laø nhö nhau. Ñeå giaûi baøi toaùn naøy coù theå öùng duïng caùc leänh LODSB vaø STOSB vôùi chuoãi ñaõ cho. Thuaät toaùn laø: + Laáy töøng kyù töï cuûa chuoãi goác (cuõ) baèng leänh LODSB, + Bieán ñoåi thaønh chöõ hoa baèng caùch tröø ñi 20H, + Caát kyù töï ñaõ bieán ñoåi vaøo chuoãi ñích (môùi) baèng leänh STOSB. Sau ñaây laø caùch toå chöùc döõ lieäu vaø chöông trình cho baøi toaùn treân vôùi ñoä daøi chuoãi laø 8 byte. Ñeå minh hoaï moät caùch thao taùc khaùc so vôùi caùch ôû ví duï tröôùc trong ví duï naøy laø duøng caùch thao taùc luøi ñoái vôùi chuoãi kyù töï. .Model Small .Stack 100 .Data Str1 DB 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' Tbao DB 'chuoãi ñaõ ñöôïc ñoåi: ' , 10,13 DB '$' .Code MAIN Proc MOV AX, @Data ; khôûi ñaàu ñaàu cho DS vaø ES MOV DS, AX MOV ES, AX LEA SI, Str1+7 ; SI chæ vaøo cuoái chuoãi cuõ LEA DI, Str2+7 ; DI chæ vaøo cuoái chuoãi môùi STD ; ñònh höôùng luøi MOV CX, 8 ; CX chöùa soá byte phaûi ñoåi LAP : LODSB ; laáy 1 kyù töï cuûa chuoãi cuõ SUB AL, 20H ; ñoåi thaønh chöõ hoa STOSB ; caát vaøo chuoãi môùi LOOP LAP ; laøm cho ñeán heát LEA DX, Tbao ; chuaån bò hieän chuoãi môùi MOV AH, 9 INT 21H MOV AH, 4CH ; veà DOS INT 21H MAIN Endp END MAIN Ví duï 8 Cho 1 maûng goàm caùc phaàn töû kieåu byte. Haõy saép xeáp chuùng theo thöù töï lôùn daàn. Giaûi: Ñaây laø baøi toaùn kinh ñieån raát hay gaëp trong khi hoïc laäp trình vôùi caùc ngoâ ngöõ khaùc nhau. Thuaät giaûi cuûa noù vì theá cuõng khaù quen thuoäc: tìm phaàn töû lôùn nhaát (max) trong daõy vaø xeáp phaàn töû ñoù vaøo cuoái daõy, tieáp tuïc laøm nhö vaäy vôùi caùc phaàn töû coøn laïi (tröø phaàn töû vöøa ñöôïc tìm thaáy vaø ñöôïc xeáp vaøo cuoái daõy). Ñeå minh hoïa thuaät toaùn treân nhöng vôùi döõ lieäu cuï theå, ta giaû thieát chuoãi caàn saép xeáp laø chuoãi cuûa caùc kyù töï ASCII goàm 10 phaàn töû. Taát nhieân, chöông trình vaãn chaïy ñuùng khi tö thay caùc phaàn töû cuûa maûng treân baèng caùc soá khoâng daáu coù ñoä lôùn bieåu dieãn ñöôïc trong phaïm vi 1 byte. Taïi ñaây ta toå chöùc chöông trình thaønh 1 chöông trình chính vaø 1 chöông trình con. Chöông trình con coù teân laø DOICHO ñöôïc goïi ra moãi khi caàn ñoåi choã 2 phaàn töû cuûa daõy. Sau ñaåy laø chöông trình thöïc hieän coâng vieäc treân. . Model Sall . Stack 100 . Data Tbao DB 'chuoãi ñaõ saép xeáp:' , 10, 13 MGB DB 'a' , 'Y' , 'G' , 'T' , 'y' , 'Z' , 'U' , 'B' , 'D' , 'E' DB '$' . Code MAIN Proc MOV AX, @Data ; khôûi ñaàu DS MOV DS, AX ; BX: soá phaàn töû cuûa maûng LEA DX, MGB ; DX chæ vaøo ñaàu maûng byte DEC BX ; soá voøng so saùnh phaûi laøm LAP : MOV SI, DX ; SI chæ vaøo ñaàu maûng MOV CX, BX ; CX soá laàn so cuûa voøng so MOV DI, SI ; giaû söû phaàn töû ñaàu laø max MOV AL, {DI} ; AL chöùa phaàn töû cuûa max TIMMAX: INC SI ; chæ vaøo phaàn töû beân caïnh CMP {SI}, AL ; phaàn töû môùi > max ? JNG TIEP ; khoâng, tim max MOV DI, SI ; ñuùng, DI chæ vaøo max MOV AL, {DI} ; AL chöùa phaàn töû max TIEP: LOOP TIMMAX ; tìm max cuûa moät voøng so CALL DOICHO ; ñoåi choã max - soá môùi DEC BX ; soá voøng so coøn laïi JNZ LAP ; laøm tieáp voøng so môùi MOV AH, 9 ; hieån thò chuoãi ñaõ saép xeáp LEA DX, Tbao INT 21H MOV AH, 4CH ; veà DOS INT 21H MAIN End DOICHO Proc PUSH AX MOV AL, {SI} XCHG AL, {DI} MOV {SI}, AL POP AX RET DOICHO Endp END MAIN Sau khi dòch vaø cho chaïy chöông trìnhtreân ta thu ñöôïc caùc doøng sau: chuoi da sap xep: B, D, E, G, T, U, Y, Z, a, y Ví duï 9 Ñoïc vaøo moät haøng (max 80) kyù töï roài hieån thò noù theo thöù töï ngöôïc laïi Giaûi Thuaâät toaùn cho vieäc ñoïc vaø hieån thò moät haøng kyù töï khoâng coù gì laø phöùc taïp. Ñeå coù theå hieån thò caùc kyù töï theo thöù töï ngöôïc laïi so vôùi khi ñoïc moät caùch thuaän tieän vaø traùnh ñöôïc caùc thao taùc röôøm raø, ta coù theå nghó ngay ñeán vieäc öùng duïng nguyeân taéc laøm vieäc "vaøo tröôùc ra sau" cuûa ngaên xeáp: khi ñoïc ñöôïc caùc kyù töï ta caát chuùng laàn löôït vaøo ngaên xeáp vaø sau ñoù laïi laáy laàn löôït caùc kyù töï treân ra ñeå hieån thò. Sau ñaây laø chöông trình thöïc hieän coâng vieäc treân. . Model Small . Stack 100 . Data Tbao1 DB 'goõ vaøo moät daõy kyù töï: S' Tbao2 DB 13, 10, 'daõy kyù töï xeáp ngöôïc laïi: S' . Code MAIN Rroc MOV AX, @Data MOV DS, AX MOV AH, 9 LEA DX, Tbao1 INT 21H ; hieän Tbao1 XOR CX, CX ; CX: ñeám soá kyù töï ñoïc ñöôïc MOV AH, 1 DOCTIEP: INT 21H ; ñoïc 1 kyù töï LAP : CMP AL, 13 ; CR ? JE THOIDOC ; ñuùng, hieån thò Tbao2 PUSH AX ; khoâng, caát noù vaøo ngaên xeáp INC CX ; caäp nhaät boä ñeám soá kyù töï IMP DOCTIEP THOIDOC:LEA DX, Tbao2 MOV AH, 9 INT 21H ; caùch 1 doøng vaø hieän Tbao2 MOV AH, 2 ; chuaån bò hieån thò kyù töï HIEN: POP DX ; laáy kyù töï ra töø ngaên xeáp INT 21H LOOP HIEN ; hieän doøng kyù töï xeáp ngöôïc MOV AH, 4CH ; veà DOS INT 21H MAIN Endp END MAIN Ví duï 10 Ta phaûi ñoïc vaøo 1 doøng kyù töï töø baøn phím, keát thuùc baèng Enter. Sau ñoù ta phaûi ñeám soá nguyeân aâm vaø soá phuï aâm coù trong daõy kyù töï ñoù roài hieån thò caùc soá ñoù. Giaûi Trong baøi toaùn naøy coâng vieäc ñoïc vaøo moät daõy kyù töï töø baøn phím laø raát ñôn giaûn. Chæ coøn phaûi noùi qua veà thuaät toaùn ñeå tìm caùc nguyeân aâm vaø phuï aâm: ta phaûi toå chöùc döõ lieäu thaønh nhoùm caùc nguyeân aâm vaø nhoùm caùc phuï aâm vaø seõ so saùnh caùc kyù töï ñoïc ñöôïc vôùi caùc thaønh phaàn cuûa moãi nhoùm naøy. Moãi khi tìm ñöôïc kyù töï caùc phaàn töû ngöôøi ta thöôøng duøng leänh kieåu REPNE SCASB. Sau ñaây laø chöông trình NAMPAMASM thöïc hieän coâng vieäc treân. ; tính soá nguyeân aâm vaø phuï aâm trong moät doøng kyù töï .Model Small .Stack 100 .Data Str DB 80 dup (0) NAM DB 'AaEeIiOoUuYy' Pam' DB 'BCDFGHJKLMNPQRSTVWXZ' DB 'bcdfghjklmnpqrstvwxz' Tbao1 DB 13, 10, 'so ky tu la nguyen am = s' Tbao2 DB 13, 10, 'so ky tu la phu am = s' Tbao3 DB 'go vao 1 xau ky tu la phu am = '$' SoNAM DW 0 SoPAM DW 0 .Code MAIN Proc MOV AX, @Data ; khôûi ñaàu cho DS vaø ES MOV DS, AX MOV ES, AX LEA DI, Str ; DI chæ vaøo chuoãi CALL DOCXAU ; ñoïc chuoãi, soá kyù töï taïi BX MOV SI, DI ; SI chæ vaøo chuoãi vöøa ñoïc CLD ; ñònh höôùng tieán LAMLAI: LODSB ; laáy 1 phaàn tö cuûa chuoãi LEA DI, NAM ; DI chæ vaøo chuoãi ng.aâm MOV CX, 12 ; 6 nguyeân aâm, 2 loaïi chöõ REPNE SCASB ; kyù töï laø nguyeân aâm ? JNE PHUAM ; khoâng, ñoù laø phuï aâm INC SoNAM ; taêng soá nguyeân aâm JMP TIEP PHUAM : LEA DI, PAM ; DI chæ vaøo chuoãi phuï aâm MOV CX, 40 ; 20 phuï aâm, 2 loaïi chöõ REPNE SCASB ; kyù töï laø phuï aâm ? JNE TIEP ; khoâng INC SoPAM ; taêng soá phuï aâm TIEP: DEC BA ; soá kyù töï phaûi kieåm tra JNE LAMLAI ; laøm laïi MOV AH, 9 ; chuaån bò hieån thò Tbao1 LEA DX, Tbao1 INT 21H MOV AX, SoNAM ; laáy soá nguyeân aâm CALL OUTSO ; hieån thò soá phuï aâm MOV AH, 4CH ; veà DOS INT 21H MAIN Endp DOCXAU Proc ; ñoïc vaø löu moät chuoãi kyù töï, keát thuùc baèng Enter ; Vaøo: DI chöùa ñòa chæ leäch cuûa chuoãi ; Ra: DI chöùa ñòa chæ leäch cuûa chuoãi BX chöùa soá kyù töï ñoïc ñöôïc PUSH DI ; caát con troû CLD ; ñònh höôùng tieán ñeå caát XOR BX, BX ; xoùa boä ñeám soá kyù töï MOV AH, 1 ; chuaån bò ñoïc moät kyù töï DOCTIEP : INT 21H CMP AL, 13 ; CR ? JE THOI ; ñuùng, keát thuùc CMP AL, 8 ; BS ? (xoùa traùi) JNE LUU ; khoâng, caát DEC DI ; ñuùng, ñoåi laïi con troû DEC BX ; bôùt ñi moät kyù töï JMP DOCTIEP ; ñoïc tieáp LUU: STOSB ; caát kyù töï INC BX ; caäp nhaät soá kyù töï ñaõ ñoïc JMP DOCTIEP ; ñoïc tieáp THOI: POP DI ; laáy laïi con troû RET ; veà CTC DOCXAU Endp OUTSO Proc ; hieån thò soá trong AX ; Vaøo: AX MOV BL, 10 ; duøng BL ñeå chöùa soá chia XOR CX, CX ; CX: boä ñeám soá laàn hieän LAP: DIV BL ; AL: thöôïng, AH: dö PUSH AX ; caát soá dö INC CX ; caäp nhaät soá laàn XOR AH, AH ; chuaån bò chia tieáp OR AL, AL ; thöông = 0? JNE LAP ; chöa, laëp MOV AH, 2 ; roài, chuaån bò hieån thò HIEN: POP DX ; laáy laïi soá dö OR DH, 30H ; ñoåi soá dö ra maõ ASCII MOV DL, DH INT 21H ; hieån thò keát quaû LOOP HIEN ; laáy laïi soá laàn phaûi hieän RET ; veà CTC OUTSO Endp END MAIN So vôùi caùch laøm töø tröôùc ñeán nay thì trong phaàn chöông trình ñoïc kyù töï (DOCXAU) ta ñaõ ñöa vaøo theâm moät soá leänh ñeå laøm cho vieäc xöû lyù caùc kyù töï goõ töø baøn phím ñöôïc meàm deûo hôn: ta coù theå loaïi boû kyù töï goõ nhaàm baèng caùch duøng phím BS (Back space, xoùa traùi). Tuy nhieân, treân maøn hình ta khoâng thaáy ñöôïc hieäu öùng xoùa traùi thaät söï cuûa BS vì chöông trình maø ta vieát ôû ñaây vaãn coøn quaù ñôn giaûn ñeå coù theå xöû lyù ñöôïc vaán ñeà khaù phöùc taïp naøy. Muoán laøm ñöôïc ñieàu vöøa neâu ta seõ phaûi vieát moät chöông trình phöùc taïp hôn trong ñoù phaûi söû duïng ñeán caùc haøm khaùc cuûa ngaét 21H. Taïi chöông trình naøy ta cuõng thaáy ñöôïc caùch laøm ra caùc caâu chuù giaûi cho phaàn maøo ñaàu cuûa caùc chöông trình con. Thoâng thöôøng trong caùc chuù giaûi kieåu naøy ta phaûi neâu leân ñöôïc moät caùch vaén taét caùc vaán ñeà sau: + Nhieäm vuï cuûa chöông trình con + Caùc thanh ghi tham gia vaøo vieäc truyeàn tham soá cuûa chöông trình khi vaøo hoaëc ra chöông trình ñoù. Nhôø phaàn maøo ñaàu naøy cuûa moãi chöông trình con ta coù theå thu ñöôïc caùc thoâng tin sô boä veà baûn thaân chöông trình con ñöôïc söû duïng. Ví duï nhö trong chöông trình con DOCXAU, ta coù theå thaáy ñöôïc caùc thanh ghi naøo tham gia vaøo vieäc truyeàn tham soá giöõa chöông trình chính vaø chöông trình con. Vaán ñeà truyeàn tham soá giöõa caùc chöông trình cuõng laø vaán ñeà maø ta seõ ñeà caäp kyõ hôn ôû phaàn sau. Ví duï 11 Laäp moät chöông trình treã vôùi thôøi gian treã 1ms döôùi daïng chöông trình con ñeå coù theå söû duïng noù trong caùc tröôøng hôïp caàn thieát. Giaûi Chöông trình treã thôøi gian coù raát nhieàu öùng duïng trong thöïc teá: töø vieäc taïo ra xung aâm thanh vôùi caùc thanh ñieäu khaùc nhau cho ñeán vieäc ñieàu khieån caùc ñaïi löôïng vaät lyù trong moät heä thoáng vi xöû lyù - ñieàu khieån öùng duïng trong coâng nghieäp. Ñeå giaûi quyeát vaán ñeà naøy, thoâng thöôøng ta laäp ra moät chöông trình trong ñoù coù chöùa moät caáu truùc laëp, beân trong caáu truùc laëp ñoù chöùa caùc leänh maø thôøi gian ñeå chaïy moãi leänh ñoù coù theå xaùc ñònh ñöôïc töø caùc taøi lieäu tra cöùu. Soá laàn laëp cuûa voøng laëp thöôøng ñöôïc chöùa trong moät thanh ghi ñeå coù theå thay ñoåi ñöôïc. Moät chöông trình nhö nhö vaäy thöôøng phuï thuoäc raát nhieàu vaøo phaàn cöùng cuûa heä thoáng (chí ít cuõng phuï thuoäc vaøo loaïi CPU vaø taàn soá cuûa ñoàng hoà nhòp cho noù). Trong thí duï sau ñaây, ñeå cho coâng vieäc tính toaùn ñöôïc ñôn giaûn, ta giaû thieát CPU laø loaïi 8088-5 MHz (Tclk = 0.200ms). Moät chöông trình vieát döôùi daïng thuû tuïc ñeå taïo thôøi gian treã 1ms coù theå nhö sau: TRE1ms Proc ; chöông trình treã 1ms ; CLI ; caám caùc ngaét PUSH CX ; caát CX MOV CX, 292 ; xem caùch tính '292' ôû döôùi LAP:; NOP ; coù NOP ñeå taêng thôøi gian LOOP LAP POP CX ; laáy laïi CX ; STI ; cho pheùp ngaét trôû laïi RET TRE1ms Endp Trong chöông trình con noùi treân, soá laàn laäp ñeå trong CX phaûi ñöôïc tính toaùn sao cho thôøi gian chaïy toaøn boä chöông trình vôùi caùc voøng laëp keùo daøi xaáp xæ 1ms. Ta noùi xaáp xæ laø vì trong thöïc teá khi CPU laøm vieäc, noù coøn coù theå coøn bò treo ñeå cho quaù trình laøm töôi boä nhôù ñöôïc hoaøn taát (neáu heä thoáng söû duïng RAM ñoäng). Theâm vaøo ñoù, vì soá laàn laëp chöùa trong CX phaûi laø soá nguyeân neân keát quaû töø caùc tính toaùn thöïc caàn phaûi ñöôïc laøm troøn cho phuø hôïp, töø ñoù gaây ra sai soá. Trong moät heä vi xöû lyù hoaït ñoäng vôùi nhieàu nguoàn gaây ngaét, ñoâi khi ñeå taïo ra moät khoaûng thôøi gian treã xaùc ñònh vaø khoâng chòu taùc ñoäng cuûa caùc yeâu caàu ngaét, ta coøn phaûi coù caùc leänh caám/cho phaùp caùc yeâu caàu ngaét tröôùc/sau khi chaïy phaàn leänh tính thôøi gian (nhö ôû trong ví duï treân, ta coù theå boû caùc daáu chaám phaåy'.' ñöùng tröôùc caùc leänh CLI vaø STI ñeå ñaït ñöôïc ñieàu naøy). Baây giôø ta seõ noùi qua veà caùch tính giaù trò soá phöûi ñöa vaøo thanh ghi CX trong thí duï treân (khoâng tính ñeán caùc leänh CLI.NOP vaø STI) Theo taøi lieäu tra cöùu daønh cho taäp leänh cuûa CPU 8088, ta coù ñöôïc thôøi gian cho caùc leänh lieân quan trong chöông trình treân tính theo ñôn vò Tclk nhö sau: Leänh Soá chu kyø PUSH 11 POP 8 MOV 4 LOOP 17 (hoaëc 5 trong tröôøng hôïp khoâng laëp) RET 16 Neáu ta goïi soá caàn tìm ñeå ñöa vaøo thanh ghi CX laø N, ta seõ thu ñöôïc N khi giaûi phöông trình sau: Tclk* (11 + 8 + 4 + 16 +(N-1)*17 + 5) = 1 ms Thay soá vaøo ta ñöôïc: 34 + 17 * N = 5000 hay N = 5000/17-2 Töø ñoù ruùt ra N » 292, ñaây chính laø giaù trò phaûi ñöa vaøo thanh ghi CX ôû treân. Nhaän xeùt phöông trình cuoái cuøng ta thaáy thöoøi gian maø voøng laëp phaûi "gieát" lôùn hôn raát nhieàu so vôùi thôøi gian daønh cho caùc leänh khaùc, vì vaäy ta coù theå tính ñöôïc N vôùi sai soá khoâng lôùn laém khi laáy N » 5000/17 » 294. Trong ví duï treân ta môùi chæ duøng ñeán moät giaù trò nhoû maø thanh ghi CX coù khaû naêng bieåu dieãn. Neáu ta thay giaù trò lôùn nhaát CX = 65535 thì coù theå ñaït ñöôïc thôøi gian treã lôùn nhaát khoaûng 224 ms. Trong caùc maùy IBM PC caùc chöông trình treã thôøi gian ñaït ñoä chính xaùc cao thöôøng ñöôïc thöïc hieän baèng caùch duøng chöông trình ñeå ñeám caùc xung thu ñöôïc töø caùc maïch ñònh thôøi gian (timer) coù saün trong maùy. Caùc maïch ñònh thôøi gian naøy seõ coù xung ñaàu vaøo raát chính xaùc ñöôïc laáy töø caùc xung ñoàng hoà cuûa heä thoáng. 5. Vaán ñeà truyeàn tham soá giöõa caùc chöông trình Trong khi laäp trình cho caùc öùng duïng cuï theå, moät vaán ñeà raát ñaùng quan taâm laø caùch truyeàn tham soá giöõa chöông trình chính (CTC) vaø chöông trình con (cyc) hoaëc giöõa caùc moâñun chöông trình vôùi nhau (khi duøng kyõ thuaät laäp trình kieåu moâñun maø ta khoâng xem xeùt ôû ñaây). Noùi chung trong thöïc teá ngöôøi ta thöôøng duøng caùc caùch truyeàn thoâng soá sau: + Truyeàn tham soá qua thanh ghi + Truyeàn tham soá qua oâ nhôù - bieán + Truyeàn tham soá qua oâ nhôù coù ñòa chæ do thanh ghi chæ ra + Truyeàn tham soá qua ngaên xeáp Sau ñaây laø moät soá ví duï veà vieäc truyeàn tham soá giöõa caùc chöông trình. Ví duï 1: truyeàn tham soá qua thanh ghi Caùch truyeàn tham soá thoâng qua thanh ghi trong caùc ngoân ngöõ khaùc coøn ñöôïc goïi laø truyeàn baèng giaù trò. Ví duï trình baøy moät chöông trình doïc vaø hieån thò moät heä soá möôøi saùu goàm 2 phaàn ñöôïc toå chöùc theo kieåu CTC vaø ctc. CTC goïi 1 ctc ñeå ñoïc vaøo moät soá heä möôøi saùu roài caát noù trong thanh ghi BX vaø goïi tieáp 1 ctc khaùc laáy soá vöøa ñoïc caát taïi BX ñeå hieän thò ra maøn hình; noùi khaùc ñi, 2 phaàn cuûa chöông trình truyeàn tham soá vôùi nhau thoâng qua noäi dung cuûa thanh ghi BX. Caùc chöông trình con ñöôïc gaén vaøo sau chöông trình chính nhôø leänh giaû INCLUDE. Sau ñaây laø avön baûn chöông trình thöïc hieän coâng vieäc treân. Teäp CHINH.ASM (chöùa CTC): .Model Small .Stack 100 .Code MAIN Proc CALL INHEX ;vaøo soá heä hex, keát quaû ôû BX MOV AH, 2 ;caùch 1 doøng MOV DL, 13 INT 21H MOV DL, 10 INT 21H CALL OUTHEX ;hieän thò keát quaû coù taïi BX MOV AH, 4CH ;veà DOS INT 21H MAIN Endp INCLUDE vao.asm; vao.asm chöùa INHEX INCLUDE ra.asm ; ra.asm chöùa INHEX ;caùc ctc naøy naèm trong cuøng thö muïc vôùi CTC END MAIN Tieáp theo ñaây laø teäp VAO.ASM chöùa thuû tuïc INHEX vaø taäp RA.ASM chöùa thuû tuïc OUTHEX. Caùc thuû tuïc naøy ñöôïc goïi trong chöông trình CHINH.ASM ñaõ noùi ôû treân. Teäp VAO.ASM vaø RA.ASM phaûi ñöôïc ñeå trong cuøng moät thö muïc vôùi CHINH.ASM, neáu khoâng ta phaûi ghi caû ñöôøng daãn ñaày ñuû cuûa chuùng. Teäp VAO.ASM (chöùa ctc INHEX): INHEX Proc ;nhaân vaøo 4 soá heä möôøi saùu. ;ra : BX chöùa keát quaû BDAU:XOR BX, BX ; xoùa BX ñeå chöùa keát quaû MOV CX, 4 ;CL chöùa soá laàn dòch MOV AH, 2 ;chuaån bò hieän daáu nhaéc MOV DL,'?' INT 21H MOV AH, 1 ;ñoïc 1 kyù töï LAP1: INT 21H CMP AL, 13 ;CR ? JE RA ;ñuùng, ra CMP AL, '0' ;kyù töï >='0' ? JNGE SAI ;khoâng, xöû lyù sai CMP AL'9' ;kyù töï <='9' ? JG CHUI ;khoâng, coù theå laø chöõ AND AL, OFH ;ñuùng, ñoåi ra soá. JMP DICH ;xöû lyù tieáp CHU1: CMP AL.'A' ;kyù töï >='A' ? JNLE SAI ;khoâng, xöû lyù sai CMP AL'F' ;kyù töï <='F' ? JNLE SAI ;khoâng, xöû lyù sai SUB AL, 37H ;ñoåi kyù töï heä hex ra soá DICH: SHL BX, CL ;dòch 4 bit ñeå laáy choã OR BL, AL ;cheøn soá ñoïc ñöôïc vaøo BX JMP LAP1 ;ñoïc tieáp 1 kyù töï RA : RET ;veà CTC SAI: MOV AH, 2 MOV DL, 13 INT 21H MOV DL, 10 INT 21H ;veà daàu doøng môùi JMP BDAU ;laøm laïi töø ñaàu INHEX Endp OUTHEX Proc ;hieän thò soá heä möôøi saùu trong BX MOV CX, 4 ;CX: boä ñeám soá laàn hieän MOV AH, 2 ;chuaån bò hieän keát quaû LAP2: PUSH CX ;caát boä ñeám soálaàn hieän MOV CL, 4 ;CL: soá bit phaûi quay ROL BX, BL ;cuûa thanh ghi BX MOV DL, BL ;chuyeån sang DL ñeå xöû lyù AND DL, OFH ;chæ quan taâm 4 bit cuoái CMP DL, 9 ;soá hex ñoù laø chöõ? JG CHU2 ;ñuùng, ñoåi chöõ ra maõ ASCII OR DL, 30H ;khoâng, ñoåi soá ra maõ ASCII IMP HIEN CHU2:ADD DL, 37H HIEN: INT 21H ;hieån thò keát quaû POP CX ;laáy laïi soá laàn phaûi hieän LOOP LAP2 ;hieän cho ñeán heát thì thoâi RET ;veà CTC OUTHEX Endp Chöông trình OUTHEX chaúng qua laø chöông trình OUTSO ñaõ giôùi thieâäu ôû phaàn tröôùc vaø ñöôïc thay ñoåi chuùt ít cho phuø hôïp vôùi vieäc hieän thò soá heä möôøi saùu. Trong chöông trình treân, ñeå laøm cho chöông trình ñôn giaûn ta chæ vieát caùc leänh ñeå hieän ra daáu?. Vôùi muïc ñích nhaéc nhôû ngöôøi söû duïng goõ vaøo 4 soá heä möôøi saùu ñuùng quy caùch. ta ñònh nghóa caùc soá sau laø caùc chöõ soá heä möôøi saùu ñuùng quy caùch cho chöông trình treân. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F Trong khi chaïy chöông trình seõ töï ñoäng tieán haønh kieåm tra vieäc goõ vaøo heä soá möôøi saùu ñeå loaïi boû tröôøng hôïp caùc kyù töï khoâng hôïp leä. Neáu ngöôøi söû duïng goõ vaøo caùc kyù töï khoâng ñuùng quy caùch thì phaûi goõ laïi töø ñaàu. Ví duï 2: truyeàn tham soá qua oâ nhôù bieán Ví duï naøy trình baøy moät chöông trình coäng 2 soá goàm 2 phaàn, toå chöùc theo kieåu chöông trình chính vaø chöông trình con. Hai phaàn naøy truyeàn vaøo tham soá vôùi nhau thoâng qua oâ nhôù daønh cho bieán (thanh ghi ngoaøi). Chöông trình cuûa ví duï naøy ñöôïc vieát ra vôùi muïc ñích chính chæ laø ñeå trình baøy moät caùch toå chöùc moái lieân heä giöõa moät chöông trình chính vaø moät chöông trình con: vì vaäy vaán ñeà maø chöông trình caàn giaûi quyeát ñöôïc ñaët ra thaät ñôn giaûn: coäng 2 soá maø toång cuûa chuùng nhoû hôn 10. Neáu ta goõ vaøo 2 soá khoâng ñuùng yeâu caàu treân thì chöông trình khoâng traû lôøi ñöôïc vaø töï thoaùt ra. Sau ñaây laø vaên baûn chöông trình thöïc hieän coâng vieäc treân. .Model Small .Stack 100 .Data Tbao1 DB 'Goõ vaøo 2 soá coù toång <10: S' Tbao2 DB 13, 10, ' Toång cuûa ' So1 DB ? DB ' vaø ' So2 DB ? DB ' laø ' SUM DB -30H, '$' .Code MAIN Proc MOV AX, @Data MOV DS, AX ;khôûi taïo MOV AH, 9 LEA DX, Tbao1 INT 21H ;hieän Tbao1 MOV AH, 1 ;ñoïc So1 INT 21H MOV Sol, AL ;caát maõ soá So1 MOV DL, ',' ;daáu phaåy ñan xen giöõa 2 soá MOV AH, 2 INT 21H MOV AH, 1 ;ñoïc soá 2 INT 21H MOV So2, AL ;caát maõ cuûa So2 CALL ADD2SO ;coäng 2 soá LEA DX, Tbao2 MOV AH, 4CH ;veà DOS INT 21H MAIN Endp ADD2SO Proc MOV AL, So1 ;laáy maõ soá1 ADD AL, So2 ;coäng vôùi maõ soá2 ADD SUM, AL ;ñoåi ra ASCII vaø caát ñi RET ADD2So Endp END MAIN Ví duï 3: truyeàn tham soá qua oâ nhôù ñòa chæ cho bôûi thanh ghi Ñaây laø moät caùch truyeàn tham soá maø trong caùc ngoân ngöõ laäp trình khaùc thöôøng ñöôïc mang teân laø truyeàn baèng ñòa chæ cuûa tham soá Ñeå deã so saùnh caùc caùch truyeàn tham soá vôùi nhau, ta minh hoïa caùch truyeàn tham soá naøy baèng caùch giöõ nguyeân baøi toaùn cuûa ví duï trwosc Caùc thanh ghi SI, DI vaø BX ñöôïc söû duïng ñeå chöùa ñòa chæ leäch cuûa caùc tham soá caàn truyeàn (coøn thanh ghi ñoaïn döõ lieäu ngaàm ñònh laø DS) Sau ñaây laø vaên baûn chöông trình thöïc hieän coâng vieäc treân. .Model Small .Stack 100 .Data Tbao1 DB 'Goõ vaøo 2 soá coù toång <10: S' Tbao2 DB 13, 10, 'Toång cuûa ' So1 DB ? DB ' vaø ' So2 DB ? DB ' laø ' SUM DB -30H, '$' .Code MAIN Proc MOV AX, @Data MOV DS, AX ;khôûi taïo DS MOV AH, 9 LEA DX, Tbao1 INT 21H ;hieän Tbao1 MOV AH, 1 ;ñoïc So1 INT 21H MOV Sol, AL ;caát maõ cuûa noù ñi MOV DL, ',' ;daáu phaåy ñan xen giöõa 2 soá MOV AH, 2 INT 21H MOV AH, 1 ;ñoïc soá 2 INT 21H MOV So2, AL ;caát maõ cuûa noù ñi LEA SI, So1 ;SI chæ vaøo toaùn haïng 1 LEA DI, So2 ;DI chæ vaøo toaùn haïng 2 LEA BX, SUM ; BX chæ vaøo keát quaû CALL ADD2SO ;coäng 2 soá LEA DX, Tbao2 INT 21H ;hieän thò Tbao2 MOV AH, 4CH ;veà DOS INT 21H MAIN Endp ADD2SO Proc ;tính toång 2 soá ;Vaøo: SI: ñòa chæ cuûa soá haïng 1 DI: ñòa chæ cuûa soá haïng 2 BX: ñòa chæ cuûa keát quaû ;Ra: {DS:BX} chöùa keát quaû MOV AL, {SI} ;laáy maõ cuûa soá1 ADD AL, {DI} ;coäng vôùi maõ cuûa soá2 ADD {BX}, AL ;ñoåi ra ASCII vaø caát ñi RET ;veà CTC ADD2SO Endp END MAIN Ví duï 4: truyeàn tham soá qua ngaên xeáp Trong ví duï naøy ta söû duïng ngaên xeáp ñeå laøm choã chöùa caùc tham soá caàn phaûi truyeàn. Ñeå deã so saùnh caùc caùch truyeàn tham soá vôùi nhau, ta vaãn giöõ nguyeân baøi toaùn ôû ví duï tröôùc nhöng thay ñoåi caùch giaûi ñeå höôùng ví duï vaøo minh hoïa vieäc söû duïng ngaên xeáp. Sau ñaây laø vaên baûn chöông trình thöïc hieän coâng vieäc treân .Model Small .Stack 100 .Data Tbao1 DB 'Goõ vaøo 2 soá coù toång <10: S' Tbao2 DB 13, 10, 'Toång cuûa ' So1 DB ? DB ' vaø ' So2 DB ? DB ' laø ' SUM DB -30H, '$' .Code MAIN Proc MOV AX, @Data MOV DS, AX ;khôûi taïo DS MOV AH, 9 LEA DX, Tbao1 INT 21H ;hieän Tbao1 MOV AH, 1 ;ñoïc So1 INT 21H MOV Sol, AL ;caát vaøo bieán ñeå hieän thò PUSH AX ;vaø vaøo ngaên xeáp ñeå truyeàn MOV DL, ',' ;daáu phaåy ñan xen giöõa 2 soá MOV AH, 2 INT 21H MOV AH, 1 ;ñoïc So2 INT 21H MOV So2, AL ;caát vaøo bieán ñeå hieän thò PUSH AX ;vaø vaøo ngaên xeáp ñeå truyeàn CALL ADD2SO ;coäng 2 soá ADD SUM, AL ;löu keát quaû ñeå hieän thò MOV AH, 9 LEA DX, Tbao2 INT 21H ;hieän thò Tbao2 MOV AH, 4CH ;veà DOS INT 21H MAIN Endp ADD2SO Proc ; tính toång 2 soá ; Vaøo: ngaên xeáp luùc keå töø ñænh ; ñòa chæ trôû veà ; soá haïng 2 ; soá haïng 1 ; Ra: AX chöùa keát quaû PUSH BP ;caát BP ñeå duøng vaøo vieäc MOV BP, SP ;BP chæ vaøo ñænh ngaên xeáp MOV AX, (BP+6) ;laáy kyù töï cuûa Sol MOV AX, (BP+4) ;coäng vôùi kyù töï cuûa So2 POP BP ;laáy laïi BP RET 4 ;trôû veà vaø boû qua 4 byte ADD2SO Endp END MAIN Trong chöông trình naøy khi ñoïc ñöôïc cac toaùn haïng cuûa pheùp coäng, moät maët ta caát chuùng taïi oâ nhôù daønh cho bieán (chæ ñöôïc duøng ñeán khi hieän thò thoâng baùo Tbao2 nhö ñaõ laøm ôû caùc ví duï tröôùc), maët khaùc ta cuõng caát chuùng taïi ngaên xeáp ñeå truyeàn giöõa caùc khuùc chöông trình. Khi thöïc hieän pheùp coäng ta laáy laïi ñöôïc ñòa chæ trôû veà vò trí ban ñaàu nhö khi chöa duøng ñeán ngaên xeáp. Moät ñieàu nöõa cuõng phaûi nhaän thaáy trong chöông trình naøy laø: laø ngoaøi vòeâc duøng ngaên xeáp ñeå truyeàn tham soá (caùc toaùn haïng), ôû ñaây ta ñaõ söû duïng theâm caû thanh ghi AX cho vieäc truyeàn keát quaû.

Các file đính kèm theo tài liệu này:

  • docLập trình bằng hợp ngữ với 8088.doc
Tài liệu liên quan