Lập trình hợp ngữ họ MCS-51_chương 3

Chia sẻ: Trần Huệ Mẫn | Ngày: | Loại File: PDF | Số trang:22

0
147
lượt xem
86
download

Lập trình hợp ngữ họ MCS-51_chương 3

Mô tả tài liệu
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tại phần trước chúng ta đã chỉ ra cấu trúc 3-bus chung cho tất cả các họ vi xử lý. Với cấu trúc này, tất cả các họ vi xử lý khác nhau có thể thực hiện được mọi công việc mà ta có thể thấy trong cuộc sống.

Chủ đề:
Lưu

Nội dung Text: Lập trình hợp ngữ họ MCS-51_chương 3

  1. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 CHÖÔNG 3: LAÄP TRÌNH HÔÏP NGÖÕ HOÏ MCS-51 Taïi phaàn tröôùc chuùng ta ñaõ chæ ra caáu truùc 3-bus chung cho taát caû caùc hoï vi xöû lyù. Vôùi caáu truùc naøy, taát caû caùc hoï vi xöû lyù khaùc nhau coù theå thöïc hieän ñöôïc moïi coâng vieäc maø ta coù theå thaáy trong cuoäc soáng, töø ñieàu khieån caùc quaù trình phöùc taïp, truyeàn thoâng, troø chôi ñieän töû… Moät caâu hoûi ñaët ra laø: vaäy thì caùi gì ñaëc tröng cho boä vi xöû lyù ñeå noù coù theå thöïc hieän chöùc naêng rieâng bieät cuûa vi xöû lyù. Ñoù chính laø phaàn meàm (software), hay chöông trình. I. CAÙC KHAÙI NIEÄM CÔ BAÛN VEÀ LAÄP TRÌNH CHO VI XÖÛ LYÙ VAØ VI ÑIEÀU KHIEÅN 1. Chöông trình - Chöông trình (program) laø chuoãi caùc caâu leänh hay phaùt bieåu ñöôïc vieát trong moät daïng ñaëc thuø (ngoân ngöõ laäp trình). Caùc leänh naøy khi ñöôïc thöïc hieän bôûi vi xöû lyù seõ thöïc hieän nhöõng thao taùc nhaát ñònh vôùi keát quaû ñoaùn tröôùc ñöôïc. - Coù nhieàu loaïi ngoân ngöõ laäp trình: + Ngoân ngöõ maùy (machine language) Maõ nhò phaân Maõ baùt phaân hoaëc thaäp luïc phaân + Hôïp ngöõ (assembly language) [caàn coù assembler – trình dòch hôïp ngöõ] Maõ kí hieäu + Ngoân ngöõ caáp cao [caàn coù compiler – trình bieân dòch] Pascal, Fortran, Basic, C, C++, … 2. Löu ñoà chöông trình - Böôùc ñaàu tieân cuûa vieäc laäp trình laø xaùc ñònh roõ raøng muïc ñích cuûa chöông trình vaø trình töï caàn thieát ñeå ñaït muïc ñích ñoù. Moät trong nhöõng coâng cuï quan troïng trong vieäc phaùt trieån chöông trình laø löu ñoà chöông trình. - Löu ñoà chöông trình laø bieåu dieãn baèng hình aûnh thöù töï caùc thao taùc caàn laøm ñeå giaûi quyeát moät vaán ñeå cuï theå. Löu ñoà chöông trình khoâng phuï thuoäc ngoân ngöõ laäp trình hoaëc loaïi vi xöû lyù cuï theå naøo. Löu ñoà chöông trình chæ phuï thuoäc vaøo coâng vieäc maø ngöôøi laäp trình muoán hoaøn thaønh. - Caùc khoái cô baûn duøng trong löu ñoà chöông trình: Khoái baét ñaàu vaø Khoái quyeát ñònh (khoái reõ Khoái thöïc hieän keát thuùc nhaùnh coù ñieàu kieän) Ñaàu noái Goïi chöông trình con Khoái nhaäp/xuaát Choã noái chung (khi qua trang môùi) Raát nhieàu ngöôøi laäp trình khi môùi baét ñaàu vôùi vieäc laäp trình thöôøng khoâng thích söû duïng löu ñoà chöông trình vì nghó raèng vieäc veõ löu ñoà laø toán thôøi gian. Ñieàu naøy chæ ñuùng vôùi caùc chöông trình ngaén vaø ñôn giaûn, nhöng tröôøng hôïp chöông trình daøi hôn thì neáu khoâng coù löu ñoà seõ raát deã bò roái raém. Löu ñoà chöông trình giuùp saép xeáp caùc yù töôûng vaø lôøi giaûi cuûa töøng vaán ñeà rieâng bieät. Sau khi hoaøn thaønh löu ñoà, ta coù theå trao ñoåi vôùi ngöôøi khaùc veà yù töôûng http://www.ebook.edu.vn 1
  2. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 cuûa mình. Coù löu ñoà chöông trình thì duø sau moät thôøi gian daøi ta vaãn coù theå quay laïi vôùi chöông trình cuûa mình moät caùch deã daøng maø khoâng bò “laïc” trong caùc doøng leänh voán raát chi tieát cuûa chöông trình hôïp ngöõ. 3. Khuoân daïng cuûa chöông trình hôïp ngöõ Moät chöông trình hôïp ngöõ coù theå bao goàm: - Caùc leänh (instruction) cuûa vi xöû lyù/vi ñieàu khieån - Caùc chæ daãn (directive) cuûa trình dòch hôïp ngöõ - Caùc ñieàu khieån (control) cuûa trình dòch hôïp ngöõ - Caùc chuù thích (comment) Caùc leänh laø caùc maõ gôïi nhôù quen thuoäc vaø seõ ñöôïc dòch ra maõ maùy töông öùng vôùi vi xöû lyù/vi ñieàu khieån. Caùc chæ daãn cuûa trình dòch hôïp ngöõ laø caùc leänh cuûa trình dòch hôïp ngöõ duøng ñeå ñònh nghóa caáu truùc chöông trình, caùc kyù hieäu, döõ lieäu, caùc haèng soá… Caùc ñieàu khieån cuûa trình dòch hôïp ngöõ thieát laäp caùc cheá ñoä trình dòch hôïp ngöõ vaø caùc luoàng hôïp dòch tröïc tieáp. Caùc chuù thích giuùp cho chöông trình deã ñoïc baèng caùch ñöa ra caùc giaûi thích veà muïc ñích vaø hoaït ñoäng cuûa caùc chuoãi leänh. Caùc doøng chöùa caùc leänh vaø caùc chæ daãn phaûi ñöôïc vieát theo caùc qui luaät maø trình dòch hôïp ngöõ hieåu ñöôïc. Moãi doøng ñöôïc chia thaønh caùc tröôøng caùch bieät nhau bôûi khoaûng traéng hay khoaûng tab. Khuoân daïng toång quaùt cuûa moãi doøng nhö sau: Teân (Nhaõn) Maõ gôïi nhôù Caùc toaùn haïng Chuù thích trong ñoù chæ coù tröôøng maõ gôïi nhôù laø baét buoäc. Vôùi trình dòch hôïp ngöõ ASM51, tröôøng maõ gôïi nhôù khoâng caàn ôû treân cuøng moät doøng vôùi tröôøng nhaõn. Tuy nhieân, tröôøng toaùn haïng phaûi ôû treân cuøng moät doøng vôùi tröôøng maõ gôïi nhôù. Coù theå vieát caùc doøng naøy baèng chöõ hoa hay chöõ thöôøng vaø chuùng seõ ñöôïc coi laø töông ñöông vì trình dòch hôïp ngöõ khoâng phaân bieät kieåu chöõ. a. Tröôøng teân Tröôøng naøy coù theå chöùa caùc nhaõn, teân bieán, hay teân chöông trình con (thuû tuïc). Caùc teân vaø nhaõn naøy seõ ñöôïc trình dòch hôïp ngöõ gaùn baèng caùc ñòa chæ cuï theå cuûa leänh (hoaëc döõ lieäu) theo sau. Teân vaø nhaõn coù theå coù ñoä daøi töø 1 ñeán 31 kyù töï, khoâng chöùa khoaûng traéng, phaûi baét ñaàu baèng kyù töï chöõ, daáu ‘?’ hay daáu ‘_’ vaø tieáp theo phaûi laø caùc kyù töï chöõ, caùc kyù soá, daáu ‘?’ hay daáu ‘_’. Caùc teân vaø nhaõn khoâng ñöôïc truøng vôùi caùc töø khoùa (caùc maõ gôïi nhôù, caùc chæ daãn, caùc toaùn töû hay caùc kyù hieäu ñònh nghóa tröôùc). Noùi chung, ta cöù ñaët caùc teân bình thöôøng vaø coù yù nghóa laø seõ ít bò loãi. Moät nhaõn ñöôïc keát thuùc baèng daáu ‘:’. b. Tröôøng maõ gôïi nhôù Tröôøng naøy chöùa maõ gôïi nhôù (mnemonic) cho bieát chöùc naêng cuûa leänh (ví duï nhö ADD, MOV, DIV, MUL, INC…) hay chæ daãn cuûa trình dòch hôïp ngöõ (ví duï nhö ORG, END, EQU, DB…). Caùc chæ daãn khoâng ñöôïc dòch ra maõ maùy. c. Tröôøng toaùn haïng (operand) Tröôøng naøy chöùa ñòa chæ hay döõ lieäu maø leänh seõ söû duïng. Tuøy theo töøng loaïi leänh maø coù theå coù 0, 1, 2 hay 3 toaùn haïng. Caùc toaùn haïng caùch nhau bôûi daáu phaåy. d. Tröôøng chuù thích (comment) Caùc chuù thích ñeå laøm roõ chöông trình ñöôïc ñaët trong tröôøng chuù thích ôû cuoái doøng leänh. Ñieàu naøy giuùp cho ngöôøi ñoïc chöông trình deã hieåu caùc thao taùc cuûa chöông trình hôn. Caùc chuù thích caàn phaûi ñöôïc baét ñaàu baèng daáu ‘;’. Caùc chuù thích coù theå chieám nhieàu doøng rieâng vaø cuõng phaûi baét ñaàu baèng daáu chaám ‘;’. http://www.ebook.edu.vn 2
  3. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 Khi ta vieát chöông trình baèng kí töï cuûa baûng chöõ caùi, ta goïi ñaây laø daïng mnemonic (maõ gôïi nhôù). Vi xöû lyù/vi ñieàu khieån khoâng hieåu ñöôïc caùc chöõ caùi naøy. Chuùng ñoøi hoûi caùc leänh phaûi ñöôïc vieát döôùi daïng ñaëc bieät goïi laø object code (maõ ñoái töôïng, maõ leänh). Mnemonic ñöôïc duøng trong chöông trình goác döôùi daïng source code (maõ nguoàn) do ngöôøi laäp trình vieát baèng hôïp ngöõ hoaëc (ngoân ngöõ laäp trình khaùc). Coøn object code laø ngoân ngöõ chæ bao goàm caùc soá 1 vaø 0, ñaây laø ngoân ngöõ maø vi xöû lyù/vi ñieàu khieån seõ laøm vieäc ñöôïc. Vi xöû lyù/vi ñieàu khieån ñoïc object code töø boä nhôù döôùi daïng caùc byte vaø bieân dòch caùc döõ lieäu thaønh leänh caàn thöïc thi. Moät soá chæ daãn cuûa trình dòch hôïp ngöõ thöôøng duøng: • ORG Daïng: ORG bieuthuc Chæ daãn ORG thay ñoåi noäi dung boä ñeám chöông trình theo giaù trò cuûa bieuthuc ñeå thieát laäp nôi baét ñaàu môùi cuûa chöông trình cho caùc phaùt bieåu theo sau noù. • END Daïng: END END laø phaùt bieåu cuoái cuøng cuûa chöông trình nguoàn. Nhaõn khoâng ñöôïc söû duïng treân doøng naøy. • EQU Daïng: kyhieu EQU bieuthuc Chæ daãn EQU gaùn giaù trò cuûa bieuthuc cho kyhieu. Kyhieu phaûi laø teân hôïp leä. • DB Daïng: nhan: DB bieuthuc{, bieuthuc][…] Chæ daãn DB thöôøng ñöôïc duøng ñeå ñònh nghóa caùc giaù trò byte töông öùng vôùi caùc bieuthuc trong boä nhôù chöông trình baét ñaàu töø ñòa chæ töông öùng vôùi nhan. 4. Bieân dòch chöông trình - Chöông trình phaûi ñöôïc chuyeån sang thaønh daïng object code tröôùc khi vi xöû lyù/vi ñieàu khieån coù theå thöïc hieän chöông trình. Quaù trình chuyeån töø chöông trình daïng source code sang object code goïi laø bieân dòch/hôïp dòch (assembling). - Sau ñoù ta naïp object code naøy vaøo boä nhôù vi xöû lyù/vi ñieàu khieån vaø vi xöû lyù/vi ñieàu khieån chaïy chöông trình. Vieäc chuyeån ñoåi mnemonic sang object code thöôøng thöïc hieän baèng maùy tính. Tröôùc heát ta duøng moät chöông trình goïi laø editor ñeå vieát vaø löu maõ nguoàn vaøo boä nhôù. Ta coù theå söû duïng editor quen thuoäc cuûa Window nhö Notepad hoaëc trong moâi tröôøng DOS ta söû duïng leänh edit trong Norton Commandor. Sau ñoù ta cho chaïy chöông trình bieân dòch goïi laø assembler, chöông trình naøy seõ laáy maõ leänh trong boä nhôù vaø bieân dòch sang taäp tin döôùi daïng object code. Cuoái cuøng, ta duøng moät chöông khaùc ñeå naïp object code töø boä nhôù cuûa maùy tính vaøo boä nhôù cuûa vi xöû lyù/vi ñieàu khieån. 5. Naïp chöông trình vaøo boä nhôù Khi vi xöû lyù/vi ñieàu khieån ñöôïc caáp nguoàn ñieän laàn ñaàu hay ñöôïc khôûi ñoäng laïi baèng caùch kích hoaït vaøo chaân RST thì vi xöû lyù/vi ñieàu khieån thöïc hieän moät soá leänh beân trong. Moät trong caùc leänh ñoù laø xuaát moät ñòa chæ ñaëc bieät leân bus ñòa chæ vaø ñoïc opcode ñaàu tieân taïi ñòa chæ ñoù. Ñoái vôùi Z80, 8080, 8085 vaø hoï MCS-51 thì ñoù laø ñòa chæ 0000H. Do ñoù, opcode ñaàu tieân cuûa chöông trình caàn thöïc hieän phaûi ñöôïc ñaët ôû vò trí 0000H trong boä nhôù chöông trình vaø khi vieát chöông trình neân söû duïng chæ daãn ORG 0000H ôû doøng ñaàu tieân cuûa chöông trình chính ñeå baùo cho trình dòch hôïp ngöõ bieát chöông trình ñöôïc baét ñaàu ôû ñòa chæ 0000H. Chöông trình ñöôïc naïp vaøo boä nhôù thöïc chaát chæ laø caùc soá nhò phaân hay hex. Trong caùc soá naøy, coù soá seõ laø opcode, coù soá seõ laø döõ lieäu ñöôïc söû duïng bôûi caùc leänh. Vieäc nhaàm laãn thöù töï http://www.ebook.edu.vn 3
  4. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 leänh seõ daãn ñeán caùc keát quaû khoâng löôøng tröôùc ñöôïc. Phöông phaùp duy nhaát ñeå phaân bieät giöõa opcode vaø döõ lieäu laø caàn phaûi bieát ñòa chæ chính xaùc cuûa opcode ñaàu tieân tring chöông trình vaø naïp chöông trình ñuùng vò trí vaø theo thöù töï. II. CAÙC KIEÅU ÑÒNH ÑÒA CHÆ Caùc kieåu ñònh ñòa chæ laø phaàn caàn thieát cho toaøn boä taäp leänh cuûa moãi moät boä vi xöû lyù hay vi ñieàu khieån. Caùc kieåu ñònh ñòa chæ cho pheùp xaùc ñònh roõ nguoàn vaø ñích cuûa döõ lieäu theo nhieàu caùch khaùc nhau maø vi xöû lyù hay vi ñieàu khieån söû duïng trong quaù trình thöïc thi leänh. Coù 8 kieåu ñònh ñòa chæ ñoái vôùi hoï MCS-51: - Thanh ghi (register) - Tröïc tieáp (direct) - Giaùn tieáp (indirect) - Töùc thôøi (immediate) - Töông ñoái (relative) - Tuyeät ñoái (absolute) - Daøi (long) - Chæ soá (index) 1. Ñònh ñòa chæ thanh ghi - Trong leänh truy xuaát ñeán caùc thanh ghi R0 ÷ R7 cuûa bank thanh ghi tích cöïc. Caùc leänh naøy ñöôïc maõ hoùa daøi 1 byte, trong ñoù duøng 3 bit thaáp nhaát ñeå chæ thanh ghi ñöôïc truy xuaát. Opcode n2 n1 n0 - Ngoaøi ra, trong leänh cuõng coù theå truy xuaát ñeán caùc thanh ghi ñaëc bieät nhö: thanh ghi tích luõy (kyù hieäu A), con troû döõ lieäu (kyù hieäu DPTR), boä ñeám chöông trình (kyù hieäu PC), côø nhôù (kyù hieäu C) vaø caëp thanh ghi AB (kyù hieäu AB). Caùc leänh naøy khoâng caàn caùc bit ñòa chæ, baûn thaân opcode cuûa leänh ñaõ chæ ra thanh ghi ñöôïc duøng. Ví duï: INC R1 ; taêng noäi dung thanh ghi R1 leân 1 INC A ; taêng noäi dung thanh ghi A leân 1 INC DPTR ; taêng noäi dung thanh ghi DPTR leân 1 2. Ñònh ñòa chæ tröïc tieáp - Duøng ñeå truy xuaát caùc oâ nhôù trong RAM noäi (ñòa chæ töø 00H ÷ 7FH) hay caùc thanh ghi chöùc naêng ñaëc bieät (ñòa chæ töø 80H ÷ FFH). Moät byte ñöôïc theâm vaøo tieáp theo opcode ñeå xaùc ñònh ñòa chæ. - Trình dòch hôïp ngöõ cho pheùp söû duïng teân caùc thanh ghi chöùc naêng ñaëc bieät (thay cho ñòa chæ). Opcode Ñòa chæ tröïc tieáp Ví duï: INC ACC ; taêng noäi dung thanh ghi A leân 1 … Leänh naøy cuøng chöùc naêng vôùi leänh INC A ôû treân nhöng khaùc kieåu ñònh ñòa chæ → caùc byte maõ leänh khaùc nhau. 06H 30H MOV P0,A ; chuyeån noäi dung cuûa thanh ghi A vaøo Port 0 … (≡ MOV 80H,A) INC 30H ; taêng noäi dung oâ nhôù 30H leân 1 Noäi dung 30H ban ñaàu laø 06H, sau leänh treân (30H) = 07H http://www.ebook.edu.vn 4
  5. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 3. Ñònh ñòa chæ giaùn tieáp - Trong leänh duøng caùc thanh ghi R0 vaø R1 laøm con troû ñeå chæ ra ñòa chæ oâ nhôù trong RAM noäi maø leänh taùc ñoäng ñeán. Bit thaáp nhaát trong maõ leänh seõ xaùc ñònh thanh ghi naøo ñöôïc duøng. Opcode i - Quy öôùc: duøng daáu @ tröôùc R0 vaø R1 cho kieåu ñònh ñòa chæ naøy. Ví duï: (R1) = 30H, (30H) = 52H INC @R1 ; taêng noäi dung oâ nhôù ñöôïc troû bôûi R1 → (R1) = 30H, (30H) = 53H … … 52H 30H 30H R1 → 53H 30H 30H R1 … … - Kieåu ñònh ñòa chæ naøy thöôøng duøng khi truy xuaát tôùi moät vuøng nhôù lieân tieáp. Ví duï: Caùc böôùc sau ñöôïc thöïc hieän ñeå xoùa 50 oâ nhôù trong RAM noäi baét ñaàu töø ñòa chæ 30H: (R0) = 30H - (@R0) = 0 - Taêng R0 N Ñuû 50 byte ? Y Tieáp tuïc 4. Ñònh ñòa chæ töùc thôøi - Caùc döõ lieäu töùc thôøi ñöôïc duøng tröïc tieáp trong leänh coù theå laø moät haèng soá, moät kyù soá, moät bieåu thöùc toaùn hoïc… Trình dòch hôïp ngöõ seõ töï ñoäng tính toaùn vaø thay theá döõ lieäu töùc thôøi vaøo maõ leänh. Opcode Döõ lieäu töùc thôøi - Quy öôùc: duøng daáu # tröôùc caùc toaùn haïng töùc thôøi. Ví duï: MOV A,#7 ; naïp giaù trò 7 vaøo thanh ghi A, (A) = 7H MOV A,#7+8 ; naïp giaù trò 15 vaøo thanh ghi A, (A) = 0FH MOV A,#‘B’ ; naïp giaù trò 66 (maõ ASCII cuûa kyù töï B) vaøo thanh ghi A, (A) = 42H 5. Ñònh ñòa chæ töông ñoái - Ñöôïc duøng trong caùc leänh nhaûy ngaén. http://www.ebook.edu.vn 5
  6. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 - Moät ñòa chæ töông ñoái (hay coøn goïi laø offset) laø moät giaù trò 8 bit coù daáu (töø –128 ñeán +127) cho bieát ñoä leäch töø vò trí leänh theo ngay sau leänh nhaûy ñeán ñích. Giaù trò naøy ñöôïc coäng theâm vaøo thanh ghi boä ñeám chöông trình (PC) ñeå taïo ra ñòa chæ cuûa leänh tieáp theo caàn ñöôïc thöïc thi. Opcode Ñòa chæ töông ñoái Ví duï: Tính offset cho kieåu ñònh ñòa chæ töông ñoái trong hai tröôøng hôïp nhaûy tôùi vaø nhaûy luøi. 010A 2043 0109 2042 0108 Offset töông 2041 F6 -1 SJMP 2038H 0107 5 ñoái töø ñòa chæ 2040 80 -2 0106 4 0102H laø “5” 203F -3 0105 3 203E -4 0104 2 203D -5 0103 1 203C -6 Offset töông 0102 203B -7 ñoái töø ñòa chæ 0101 05 203A -8 SJMP 0107H 2042H laø “-10” 0100 80 2039 -9 00FF 2038 -10 Code Code memory memory (a) Nhaûy ngaén tôùi (b) Nhaûy ngaén luøi Hình 3.1 - Thoâng thöôøng caùc ñích nhaûy ñöôïc xaùc ñònh baèng caùc nhaõn vaø trình dòch hôïp ngöõ seõ xaùc ñònh offset töông ñoái töông öùng. Ví duï: Neáu nhaõn THERE ñöôïc ñaët ôû ñòa chæ 1040H vaø leänh: SJMP THERE ôû trong boä nhôù chöông trình taïi ñòa chæ 1000H vaø 1001H → ñòa chæ cuûa leänh keá tieáp seõ laø 1000H + 02H = 1002H, neân offset töông ñoái seõ laø: offset = 1040H – 1002H = 3EH. Trình dòch hôïp ngöõ seõ gaùn offset töông ñoái laø 3EH cho byte 2 cuûa leänh SJMP THERE. - Coù öu ñieåm laø khoâng phuï thuoäc vaøo vò trí nhöng bò giôùi haïn veà taàm nhaûy. 6. Ñònh ñòa chæ tuyeät ñoái - Chæ duøng trong caùc leänh AJMP vaø ACALL. - Cho pheùp reõ nhaùnh chöông trình trong trang 2K hieän haønh cuûa boä nhôù chöông trình (töùc taàm nhaûy cuûa leänh laø trong trang 2K hieän haønh cuûa boä nhôù chöông trình). - 11 bit thaáp cuûa ñòa chæ ñích, trong ñoù 3 bit cao (A8 ÷ A10) ñöôïc ñöa vaøo cuøng vôùi opcode taïo thaønh byte thöù 1 cuûa leänh vaø 8 bit thaáp (A0 ÷ A7) taïo thaønh byte thöù 2 cuûa leänh. 5 bit cao cuûa ñòa chæ ñích laø 5 bit cao hieän haønh cuûa boä ñeám chöông trình (PC) → leänh theo ngay sau leänh reõ nhaùnh vaø ñích ñeán phaûi ôû trong cuøng 1 trang 2K. A10 A9 A8 Opcode A7 A0 - Kieåu ñònh ñòa chæ naøy coù taàm nhaûy bò haïn cheá vaø cung caáp maõ phuï thuoäc vò trí. http://www.ebook.edu.vn 6
  7. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 FFFF 2K trang 31 F800 ………. 1800 Trong moät trang 17FF 2K baát kyø, chæ coù 32 x 2K = 64K 2K trang 2 11 bit thaáp thay 1000 ñoåi 0FFF A15 A10 A0 2K trang 1 0800 07FF 5 bit xaùc ñònh 11 bit xaùc ñònh ñòa chæ 2K trang 0 trang 2K trong moät trang 2K 0000 (a) Boä nhôù ñöôïc chia thaønh nhieàu trang 2K (b) Beân trong moät trang 2K Hình 3.2 Ví duï: Neáu nhaõn THERE ñaët taïi ñòa chæ 0F46H vaø leänh: AJMP THERE ôû trong boä nhôù taïi ñòa chæ 0900H vaø 0901H → leänh theo ngay sau leänh nhaûy baét ñaàu ôû ñòa chæ 0902H seõ coù 5 bit cao ñòa chæ truøng vôùi ñòa chæ nhaõn THERE laø 00001 (trang 1). → Maõ hoaù leänh: 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 0 7. Ñònh ñòa chæ daøi - Chæ duøng trong caùc leänh LCALL vaø LJMP. - Ñaây laø caùc leänh reõ nhaùnh 3 byte, vôùi 2 byte sau (byte 2 vaø byte 3) laø ñòa chæ ñích cuûa leänh (16 bit). Opcode Ñòa chæ A15 ÷ A8 Ñòa chæ A7 ÷ A0 - Öu ñieåm laø coù theå söû duïng toaøn boä vuøng nhôù chöông trình 64K, nhöng leänh laïi daøi ñeán 3 byte vaø phuï thuoäc vaøo vò trí. 8. Ñònh ñòa chæ chæ soá - Duøng moät ñòa chæ neàn (chöùa trong thanh ghi PC hay DPTR) vaø moät offset (chöùa trong thanh ghi A) ñeå taïo ñòa chæ ñöôïc taùc ñoäng cho caùc leänh JMP hoaëc MOVC. (Ñòa chæ ñöôïc taùc ñoäng) = (PC) hoaëc (DPTR) + (A) - Thöôøng duøng khi truy xuaát döõ lieäu trong moät baûng döõ lieäu ñaõ ñöôïc ñònh nghóa tröôùc. Khi ñoù, thanh ghi PC hay DPTR seõ giöõ ñòa chæ ñaàu baûng vaø thanh ghi A giöõ ñòa chæ offset cuûa döõ lieäu caàn truy xuaát trong baûng. …… Ví duï: Baûng caùc giaù trò bình phöông cuûa soá nguyeân. Neáu DPTR chöùa ñòa chæ ñaàu baûng (töông öùng nhaõn TABLE) 10H vaø (A) = 3, thì sau khi thöïc hieän leänh: MOVC A, @A+DPTR 09H → (A) = 09H. 04H 3 01H TABLE 00H http://www.ebook.edu.vn 7
  8. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 III. TAÄP LEÄNH (tham khaûo theâm “Toùm taét taäp leänh” vaø “Moâ taû leänh”) Taäp leänh cuûa 8051 ñöôïc chia laøm 5 nhoùm: - Nhoùm leänh soá hoïc - Nhoùm leänh logic - Nhoùm leänh chuyeån döõ lieäu - Nhoùm leänh reõ nhaùnh (chuyeån ñieàu khieån) - Nhoùm leänh xöû lyù bit IV. CAÙC KYÕ THUAÄT LAÄP TRÌNH Laäp trình caáu truùc (structured programming) laø moät kyõ thuaät toå chöùc vaø maõ hoùa caùc chöông trình nhaèm giaûm söï phöùc taïp, deã daøng gôõ roái vaø hieäu chænh chöông trình. Laäp trình caáu truùc nhaán maïnh ñeán caùc nhieäm vuï laäp trình. Ngöôøi laäp trình phaân tích moät nhieäm vuï lôùn thaønh nhieàu coâng vieäc nhoû hôn, sau ñoù daàn daàn chi tieát, cuï theå hoùa ñeå ñöôïc caùc vaán ñeà ñôn giaûn. Qua ñoù, tìm ra caùch giaûi quyeát vaán ñeà döôùi daïng nhöõng thuaät giaûi cuï theå roõ raøng, ñeå coù theå minh hoïa baèng ngoân ngöõ giaûi thuaät. Trong laäp trình caáu truùc, caùc thuaät giaûi naøy ñöôïc goïi laø caùc chöông trình con. Caùch thöùc phaân tích vaø thieát keá nhö vaäy ta goïi laø nguyeân lyù laäp trình töø treân xuoáng (top- down), ñeå theå hieän quaù trình suy dieãn töø caùi chung nhaát cho ñeán caùi cuï theå nhaát. Taát caû caùc vaán ñeà laäp trình ñeàu coù theå ñöôïc giaûi quyeát chæ döïa treân 3 caáu truùc: * Caùc phaùt bieåu * Caùc voøng laëp * Caùc löïa choïn 1. Caùc phaùt bieåu - Caùc phaùt bieåu laø moät caùch thöùc cô baûn ñeå thöïc hieän moät coâng vieäc naøo ñoù. - Caùc phaùt bieåu coøn bao goàm caû vieäc gaùn giaù trò cho 1 bieán hoaëc goïi chöông trình con. 2. Caáu truùc voøng laëp - Ñöôïc söû duïng ñeå thöïc hieän moät hoaëc moät soá coâng vieäc laëp ñi laëp laïi nhieàu laàn. - Coù hai daïng voøng laëp cô baûn: a.WHILE/DO + Cuù phaùp: WHILE [ñieàu kieän] DO [caùc phaùt bieåu] + Löu ñoà: Enter Condition No true? Yes Exit Statement Ví duï: Vieát chöông trình con SUM tính toång cuûa moät chuoãi caùc soá. Caùc thoâng soá truyeàn vaøo chöông trình con laø chieàu daøi cuûa chuoãi soá (ñöôïc chöùa trong thanh ghi R7) vaø ñòa chæ baét ñaàu cuûa chuoãi soá ñoù trong RAM noäi (ñöôïc chöùa trong thanh ghi R0). Keát quaû traû veà ñöôïc chöùa trong thanh ghi A. http://www.ebook.edu.vn 8
  9. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 Giaûi Pseudo-code: [sum = 0] WHILE [length > 0] DO Begin [sum = sum + @pointer] [taêng pointer] [giaûm length] End Löu ñoà: Enter Sum = 0 Length > 0 ? No Yes Coäng giaù trò vôùi Exit sum Taêng pointer Giaûm length Maõ 8051: SUM: CLR A LOOP: CJNE R7, #0, STATEMENT JMP EXIT STATEMENT: ADD A, @R0 INC R0 DEC R7 JMP LOOP EXIT: RET Hoaëc: SUM: CLR A INC R7 MORE: DJNZ R7, SKIP RET SKIP: ADD A, @R0 INC R0 SJMP MORE b. REPEAT…UNTIL Cuù phaùp: REPEAT [caùc phaùt bieåu] UNTIL [ñieàu kieän] http://www.ebook.edu.vn 9
  10. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 Löu ñoà: Enter Statement No Condition true? Yes Exit Ví duï 1: Vieát chöông trình con ñeå tìm moät chuoãi ñöôïc keát thuùc bôûi kyù töï Null ñöôïc troû bôûi thanh ghi R0 vaø xaùc ñònh xem trong chuoãi coù kyù töï Z hay khoâng. Keát quaû traû veà ACC = Z neáu coù kyù töï Z ôû trong chuoãi, neáu khoâng thì ACC = 0. Giaûi: Pseudo-code: REPEAT [ACC = @pointer] [taêng pointer] Until [ACC == ‘Z’ or ACC == 0] Löu ñoà: Enter Nhaän moät kyù töï Taêng pointer No Kyù töï = “Z” ? No Kyù töï = 0 ? Yes Yes Exit Maõ 8051: STATEMENT: MOV A, @R0 INC R0 JZ EXIT CJNE A, #’Z’, STATEMENT EXIT: RET http://www.ebook.edu.vn 10
  11. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 Ví duï 2: Vieát chöông trình laáy 10 byte trong RAM noäi, ñòa chæ baét ñaàu laø 30H ghi ra RAM ngoaøi ôû ñòa chæ baét ñaàu laø 2000H. Giaûi: Caùch 1: Duøng voøng laëp CJNE ORG 0000H MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM noäi MOV DPTR,#2000H ; DPTR troû tôùi ñòa chæ ngoaøi 2000H LOOP:MOV A,@R0 ; ghi noäi dung oâ nhôù ñöôïc troû bôûi R0 vaøo A MOVX @DPTR, A ; ghi noäi dung trong A ra ñòa chæ ñöôïc troû bôûi DPTR INC R0 ; taêng chæ soá ñòa chæ trong R0 INC DPTR ; taêng chæ soá ñòa chæ trong DPTR CJNE R0,#3AH,LOOP ; ñuû 10 byte chöa? END Caùch 2: Duøng voøng laëp DJNZ ORG 0000H MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM noäi MOV DPTR,#2000H ; DPTR troû tôùi ñòa chæ ngoaøi 2000H MOV R7,#10 ; R7 chöùa soá laàn laëp laø 10 LOOP:MOV A,@R0 ; ghi noäi dung oâ nhôù ñöôïc troû bôûi R0 vaøo A MOVX @DPTR, A ; ghi noäi dung trong A ra ñòa chæ ñöôïc troû bôûi DPTR INC R0 ; taêng chæ soá ñòa chæ trong R0 INC DPTR ; taêng chæ soá ñòa chæ trong DPTR DJNZ R7,LOOP ; ñuû 10 byte chöa? END Ví duï 3: Vieát chöông trình coäng moät chuoãi soá BCD khoâng neùn (unpacked – BCD) ñöôïc caát trong RAM noäi baét ñaàu töø oâ nhôù 31H. Chieàu daøi chuoãi chöùa trong oâ nhôù 30H. Keát quaû (giaû söû laø 1 byte) caát vaøo oâ nhôù 2FH. Giaûi: ORG 0000H MOV R0,#31H ; R0 troû tôùi ñòa chæ 31H trong RAM noäi CLR A ; ban ñaàu cho (A) = 0 LOOP:ADD A,@R0 ; coäng noäi dung oâ nhôù ñöôïc troû bôûi R0 vaøo A INC R0 ; taêng chæ soá ñòa chæ trong R0 DJNZ 30H,LOOP ; heát chuoãi chöa? MOV 2FH,A ; caát keát quaû sau khi coäng vaøo oâ nhôù 2FH END Ví duï 4: Vieát chöông trình ñoåi caùc kyù töï chöõ thöôøng trong caùc oâ nhôù töø 30H → 39H trong RAM noäi sang chöõ hoa. Bieát: Kyù töï Maõ ASCII (Hex) Chöõ hoa (‘A’ ÷ ‘Z’) 41H ÷ 5AH Chöõ thöôøng (‘a’ ÷ ‘z’) 61H ÷ 7AH Giaûi: Nhaän xeùt: Ñeå ñoåi chöõ hoa sang chöõ thöôøng ta ñaët bit 5 (hay coäng theâm 32) trong maõ ASCII cuûa chöõ hoa. Ngöôïc laïi, ñeå ñoåi chöõ thöôøng sang chöõ hoa ta xoùa bit 5 (hay tröø ñi 32) trong maõ ASCII cuûa chöõ thöôøng. http://www.ebook.edu.vn 11
  12. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 ORG 0000H MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM noäi LOOP:XCH A,@R0 ; hoaùn ñoåi noäi dung A vaø oâ nhôù ñöôïc troû bôûi R0 ANL A,#11011111B ; xoùa bit 5 trong maõ ASCII, caùc bit khaùc giöõ nguyeân XCH A,@R0 ; caát keát quaû trôû laïi oâ nhôù ñöôïc troû bôûi R0 INC R0 ; taêng chæ soá ñòa chæ trong R0 CJNE R0,#3AH,LOOP ; xöû lyù xong oâ nhôù 39H chöa? END 3. Caáu truùc löïa choïn a. IF…THEN…ELSE Cuù phaùp: IF [ñieàu kieän] THEN [phaùt bieåu 1] ELSE [phaùt bieåu 2] Löu ñoà: Enter Condition Yes No true? Statement 1 Statement 2 Exit Ví duï 1: vieát moät ñoaïn chöông trình nhaäp moät kyù töï töø RAM ngoaøi coù ñòa chæ laø 2000H vaø kieåm tra kyù töï ñoù. Neáu kyù töï nhaän ñöôïc laø loaïi maõ ASCII hieån thò ñöôïc (coù giaù trò trong khoaûng 20H → 7EH) thì xuaát laïi noù, neáu khoâng thì xuaát laïi kyù töï ‘.’ ra RAM ngoaøi ôû ñòa chæ 2001H. Löu ñoà: Enter Nhaäp kyù töï töø RAM ngoaøi 2000H Kyù töï hieån Yes No thò ñöôïc ? Xuaát laïi kyù töï ñoù ra Xuaát kyù töï ‘.’ ra RAM ngoaøi 2001H RAM ngoaøi 2001H Exit http://www.ebook.edu.vn 12
  13. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 Pseudo-code: [nhaäp kyù töï] IF [kyù töï == graphic] THEN [xuaát laïi kyù töï] ELSE [xuaát kyù töï ‘.’] Maõ 8051: ENTER: ACALL INCH ACALL ISGRPH JNC STMENT2 STMENT1: ACALL OUTCH JMP EXIT STMENT2: MOV A, #’.’ ACALL OUTCH EXIT: (tieáp tuïc) Hay ACALL INCH ACALL ISGRPH JC SKIP MOV A, #’.’ SKIP: ACALL OUTCH (tieáp tuïc) Ví duï 2: Vieát chöông trình kieåm tra moät khoái döõ lieäu trong RAM ngoaøi coù chieàu daøi 100 byte baét ñaàu töø ñòa chæ 1000H xem coù bao nhieâu giaù trò chaün vaø leû. Soá giaù trò chaün vaø leû ñöôïc löu töông öùng trong 2 oâ nhôù 30H vaø 31H. Giaûi: Caùch 1: ORG 0000H MOV DPTR,#1000H ; DPTR troû tôùi ñòa chæ ngoaøi 1000H MOV R7,#100 ; R7 chöùa soá laàn laëp laø 100 LOOP: MOVX A,@DPTR ; ñoïc oâ nhôù ñöôïc troû bôûi DPTR vaøo A ñeå kieåm tra JB ACC.0,ODD ; (ACC.0) = 1 → soá leû INC 30H ; (ACC.0) = 0 → soá chaún SJMP CONT ; xeùt byte keá tieáp ODD: INC 31H CONT: INC DPTR ; taêng chæ soá ñòa chæ trong DPTR DJNZ R7,LOOP ; ñuû 100 byte chöa? END Caùch 2: Coù theå thay doøng leänh JB ACC.0, ODD baèng: ANL A,#01H JNZ ODD Ví duï 3: Vieát chöông trình con teân COMPARE_8 so saùnh soá nhò phaân 8 bit trong thanh ghi A vôùi giaù trò chuaån trong oâ nhôù RAM noäi coù ñòa chæ 30H. Keát quaû traû veà: + Neáu (A) > (30H) thì xoùa P1.0 + Neáu (A) = (30H) thì xoùa P1.1 + Neáu (A) < (30H) thì xoùa P1.2 Giaûi: http://www.ebook.edu.vn 13
  14. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 Höôùng daãn: Söû duïng leänh so saùnh CJNE: CJNE arg1, arg2, arg3 Neáu arg1 ≥ arg2 thì C = 0 Neáu arg1 < arg2 thì C = 1 Giaûi thuaät: COMPARE_8 N (A) = (30H) Y N (C) = 0 Y Xoùa P1.1 Xoùa P1.0 Xoùa P1.2 RET Chöông trình: COMPARE_8: CJNE A,30H,NOT_EQUAL ; (A) # (30H) CLR P1.1 ; (A) = (30H) SJMP EXIT NOT_EQUAL: JNC GREATER ; (C) = 0 → (A) > (30H) CLR P1.2 ; (C) = 1 → (A) < (30H) SJMP EXIT GREATER: CLR P1.0 EXIT: RET b. CASE Cuù phaùp: CASE [bieåu thöùc] OF 0: [phaùt bieåu 0] 1: [phaùt bieåu 1] 2: [phaùt bieåu 2] . . . n: [phaùt bieåu n] [phaùt bieåu maëc ñònh] END_CASE Löu ñoà: http://www.ebook.edu.vn 14
  15. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 Enter Bieåu thöùc 0 ? No Bieåu thöùc 1 ? No Bieåu thöùc 2 ? No Bieåu thöùc n ? No Yes Yes Yes Yes Phaùt bieåu 0 Phaùt bieåu 1 Phaùt bieåu 2 Phaùt bieåu n Phaùt bieåu maëc ñònh Exit Ví duï: Moät chöông trình yeâu caàu caùc ñaùp öùng 0, 1, 2, hoaëc 3 cuûa moät user ñeå choïn moät trong boán haønh ñoäng. Vieát ñoaïn chöông trình nhaäp moät kyù töï töø baøn phím vaø nhaûy ñeán ACT0, ACT1, ACT2 hoaëc ACT3, phuï thuoäc vaøo ñaùp öùng cuûa user. Boû qua vieäc kieåm tra loãi. Pseudo-code: [nhaäp moät kyù töï] CASE [kyù töï] OF ‘0’: [haønh ñoäng 0] ‘1’: [haønh ñoäng 1] ‘2’: [haønh ñoäng 2] ‘3’: [haønh ñoäng 3] END_CASE Löu ñoà: Enter Nhaäp kyù töï Kyù töï = ‘0’ ? No Kyù töï = ‘1’ ? No Kyù töï = ‘2’ ? No Kyù töï = ‘3’ ? No Yes Yes Yes Yes Haønh ñoäng 0 Haønh ñoäng 1 Haønh ñoäng 2 Haønh ñoäng 3 Exit Maõ 8051 CALL INCH CJNE A, #’0’, SKIP1 ACT0: . . . SKIP1: CJNE A, #’1’, SKIP2 http://www.ebook.edu.vn 15
  16. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 ACT1: . . . SKIP2: CJNE A, #’2’, SKIP3 ACT2: . . . SKIP3: CJNE A, #’3’, EXIT ACT2: . . . EXIT: (tieáp tuïc) Hay CALL INCH ANL A, #3 RL A MOV DPTR, #TABLE JMP @A+DPTR TABLE: AJMP ACT0 AJMP ACT1 AJMP ACT2 ACT3: . . . JMP EXIT ACT0: . . . JMP EXIT ACT1: . . . JMP EXIT ACT2: . . . EXIT: (tieáp tuïc) 4. Kyõ thuaät taïo treã Ví duï 1: Vieát chöông trình con teân DELAY_100 ñeå taïo treã (trì hoaõn) 100 μs. Giaû söû duøng thaïch anh 12 MHz (fOSC = 12 MHz). Giaûi: Höôùng daãn: Duøng thôøi gian thöïc thi leänh ñeå tính thôøi gian taïo treã caàn thieát. fOSC = 12 MHz → fM = fOSC / 12 = 1 MHz → TM = 1 μs Caùch 1: Duøng caùc leänh NOP DELAY_100: ; duøng 98 leänh NOP → 98 μs http://www.ebook.edu.vn 16
  17. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 NOP NOP … NOP RET ; 2 μs → 98 + 2 = 100 μs Caùch 2: Duøng voøng laëp ñeå chöông trình ngaén goïn hôn. DELAY_100: MOV R7,#49 ; 1 μs LOOP: DJNZ R7,LOOP ; 2 μs / 1 leänh → 2 x 49 = 98 μs RET ; 2 μs Toång quaùt: DELAY_T: MOV R7,#N ; 1 TM, N ≤ 255 LOOP: DJNZ R7,LOOP ; 2 TM / 1 leänh → (2 x N) TM RET ; 2 TM → toång thôøi gian taïo treã: T = [(1 + 2 x N + 2)TM] ≅ [(2 x N) TM] μs Chuù yù: Leänh LOOP: DJNZ R7, LOOP töông ñöông vôùi leänh DJNZ R7,$. Daáu $ laø moät kyù hieäu ñaëc bieät cuûa trình dòch hôïp ngöõ ASM51 ñeå tham chieáu vò trí cuûa leänh hieän haønh. Ví duï 2: Vieát chöông trình con teân DELAY_10ms ñeå taïo treã 10 ms. Giaû söû duøng thaïch anh 12 MHz (fOSC = 12 MHz). Giaûi: Thôøi gian caàn taïo treã: T = 10 ms = 10000 μs = 10000 TM. Neáu duøng voøng laëp nhö ví duï 8 thì thôøi gian taïo treã toái ña khoaûng ≅ 2 x 255 = 510μs < 10000μs. Nhö vaäy caàn duøng 2 voøng laëp loàng nhau. Chöông trình: DELAY_10ms: MOV R7,#20 ; 1 μs LOOP: MOV R6,#250 ; 1 μs DJNZ R6,$ ; 2 μs / 1 leänh DJNZ R7,LOOP ; 2 μs / 1 leänh RET ; 2 μs → toång thôøi gian taïo treã: T = 1 + 20(1 + 2 x 250 + 2) + 2 = 10063 μs ≅ 10000 μs Toång quaùt: DELAY_T: MOV R7,#M ; 1 TM LOOP: MOV R6,#N ; 1 TM DJNZ R6,$ ; 2 TM / 1 leänh DJNZ R7,LOOP ; 2 TM / 1 leänh RET ; 2 TM → toång thôøi gian taïo treã: T = [1 + M(1 + 2 x N + 2) + 2]TM ≅ [(2 x M x N)TM] μs Ví duï 3: Vieát chöông trình taïo soùng vuoâng tuaàn hoaøn ñoái xöùng taïi chaân P1.0 coù taàn soá laø f= 10 KHz. Giaû söû fOSC = 12 MHz. Giaûi: fOSC = 12 MHz → fM = fOSC / 12 = 1 MHz → TM = 1 μs http://www.ebook.edu.vn 17
  18. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 f = 10 KHz → T = 0,1 ms = 100 μs Soùng vuoâng ñoái xöùng → tH = tL = 50 μs = 50TM T tH tL Chöông trình: ORG 0000H LOOP: CPL P1.0 ; 1 μs MOV R7,#23 ; 1 μs DJNZ R7,$ ; 2 x 23 = 46 μs SJMP LOOP ; 2 μs END http://www.ebook.edu.vn 18
  19. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 CAÂU HOÛI VAØ BAØI TAÄP CHÖÔNG 3 3.1. Haõy cho bieát caùch ñònh ñòa chæ cuûa moãi leänh sau: a.MOV R1,A b.MOV A,#12H c.MOV A,@R1 d.PUSH B e.MOV A,12H f.SJMP LOOP g.ACALL SUB1 h.LJMP 0567H 3.2. Ñeå naïp vaøo R4 giaù trò 56H thì coù caàn daáu ‘#’ trong leänh: MOV R4,#56H khoâng? 3.3. Söï khaùc bieät giöõa 2 leänh sau laø gì? INC A INC ACC 3.4. Haõy xaùc ñònh offset töông ñoái cho leänh: SJMP AHEAD Bieát leänh ñaët taïi ñòa chæ 0400H vaø 0401H, nhaõn AHEAD ñaët taïi ñòa chæ 041FH. 3.5. Haõy xaùc ñònh offset töông ñoái cho leänh: SJMP BACK Bieát leänh ñaët taïi ñòa chæ A050H vaø A051H, nhaõn BACK ñaët taïi ñòa chæ 9FE0H. 3.6. Giaû söû leänh: AJMP THERE trong boä nhôù chöông trình ôû ñòa chæ 2FF0H vaø 2FF1H, nhaõn THERE ôû ñòa chæ 2F96H. Haõy xaùc ñònh caùc byte maõ maùy cuûa leänh treân? 3.7. Giaû söû thanh ghi A chöùa 5AH. Haõy cho bieát giaù trò trong thanh ghi A sau khi thöïc hieän leänh sau: XRL A,#0FFH Haõy tìm moät leänh khaùc töông ñöông vôùi leänh treân? 3.8. Giaû söû thanh ghi A chöùa 50H vaø thanh ghi PSW chöùa 0CH. Haõy cho bieát giaù trò trong thanh ghi A sau khi thöïc hieän leänh sau: RLC A 3.9. Haõy xaùc ñònh noäi dung cuûa thanh ghi A sau khi thöïc hieän caùc chuoãi leänh sau: a. MOV A,#25 b. MOV A,#7FH MOV R7,#18H MOV 50H,#29H ADD A,R7 MOV R0,#50H XCHD A,@R0 3.10. Cho bieát giaù trò cuûa côø CY sau khi thöïc hieän caùc ñoaïn maõ sau: a. CLR C b. MOV A,#54H c. MOV A,#250 CPL C ADD A,#0C4H ADD A,#05 3.11. Caùc leänh naøo sau ñaây laø khoâng hôïp leä: 1.MOV R7,#500 2.MOV A,50H 3.ADD A,R5 4.ADD R3,A 5.MOV R1,#50 6.MOV A,#F5H 7.ADD A,#50H 8.MOV @R1,R7 9.PUSH A 10.MOV A,@R3 11.MOV R7,#00 12.MOV R6,R7 3.12. Cho noäi dung cuûa caùc oâ nhôù vaø thanh ghi: (30H) = 12H; (B) = 34H; (A) = 05H. Haõy xaùc ñònh noäi dung cuûa oâ nhôù 30H, thanh ghi A vaø B sau khi thöïc thi ñoaïn chöông trình sau: MOV R1,#30H XCH A,B XCHD A,@R1 SWAP A XCHD A,@R1 SWAP A 3.13. Xeùt ñoaïn chöông trình sau: http://www.ebook.edu.vn 19
  20. Baøi giaûng VI XÖÛ LYÙ Chöông 3: Laäp trình hôïp ngöõ hoï MCS-51 MOV R0,#20H MOV R1,#30H MOV R2,#2 ; * CLR C NEXT: MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R2,NEXT a. Sau khi thöïc hieän leänh thöù 3 (coù chuù thích *), noäi dung cuûa R0, R1 vaø R2 laø bao nhieâu? b. Leänh coù nhaõn NEXT ñöôïc thöïc thi bao nhieâu laàn? c. Sau khi hoaøn taát chöông trình treân thì noäi dung cuûa R0, R1 vaø R2 laø bao nhieâu? d. Cho noäi dung cuûa caùc oâ nhôù ban ñaàu laø: (20H) = 23H, (21H) = 45H, (30H) = 67H, (31H) = 89H: • Cho bieát noäi dung cuûa caùc oâ nhôù treân sau khi thöïc thi xong chöông trình treân? • Chöùc naêng cuûa chöông trình treân? 3.14. Xeùt chöông trình sau: ORG 0000H MOV R0,#05H MOV R1,#40H MOV R2,#0 ; * MOV @R1,#0 AGAIN: MOV DPTR,#TABLE MOV A,R2 MOVC A,@A+DPTR ADD A,@R1 MOV @R1,A INC R2 DJNZ R0,AGAIN AJMP EXIT TABLE: DB 10H,11H,12H,13H,14H EXIT: NOP END a. Sau khi thöïc hieän leänh coù chuù thích *, noäi dung cuûa R0, R1 vaø R2 laø bao nhieâu? b. Leänh coù nhaõn AGAIN ñöôïc thöïc thi bao nhieâu laàn? c. Sau khi hoaøn taát chöông trình treân thì noäi dung cuûa R0, R1 vaø R2 laø bao nhieâu? d. Noäi dung cuûa oâ nhôù 40H sau khi thöïc thi xong chöông trình treân? e. Chöùc naêng cuûa chöông trình treân? f. Neáu keát quaû cuûa chöông trình treân ñöôïc caát vaøo oâ nhôù 50H thì leänh naøo caàn söûa ñoåi? 3.15. Vieát 1 ñoaïn chöông trình xoùa 20 byte oâ nhôù RAM noäi baét ñaàu töø ñòa chæ 30H. 3.16. Vieát 1 ñoaïn chöông trình xoùa 100 byte oâ nhôù RAM ngoaøi baét ñaàu töø ñòa chæ 1000H. 3.17. Vieát 1 ñoaïn chöông trình ñoïc 20 byte oâ nhôù RAM ngoaøi baét ñaàu töø ñòa chæ 2000H vaø ghi vaøo RAM noäi baét ñaàu töø ñòa chæ 30H. 3.18. Vieát chöông trình con TINHTB_3SO tính giaù trò trung bình cuûa 3 soá nguyeân döông chöùa trong 3 oâ nhôù 30H, 31H vaø 32H. Keát quaû (phaàn nguyeân) chöùa trong thanh ghi R7. Giaû söû toång cuûa 3 soá ñoù khoâng lôùn hôn 255. http://www.ebook.edu.vn 20
Đồng bộ tài khoản