Bài giảng Kiến trúc và tổ chức máy tính - Chương 6: Lập trình Hợp ngữ

pdf 31 trang ngocly 3160
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kiến trúc và tổ chức máy tính - Chương 6: Lập trình Hợp ngữ", để 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:

  • pdfbai_giang_kien_truc_va_to_chuc_may_tinh_chuong_6_lap_trinh_h.pdf

Nội dung text: Bài giảng Kiến trúc và tổ chức máy tính - Chương 6: Lập trình Hợp ngữ

  1. KIẾN TRÚC VÀ TỔ CHỨC MÁY TÍNH (Computer Organization and Architecture) Ch ươ ng 6 Lập trình H ợp ng ữ bangtqh@utc2.edu.vn Nội dung 1. Gi ới thi ệu c ấu trúc t ập l ệnh c ủa CPU 2. Tập thanh ghi c ủa 8086/8088 3. Các ki ểu thao tác c ủa t ập l ệnh 4. Tập l ệnh h ọ 8086/8088 bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 2
  2. 6.1. Gi ới thi ệu t ập l ệnh c ủa CPU Mỗi CPU có 1 t ập l ệnh xác đị nh Tập l ệnh có hàng ch ục ho ặc hàng tr ăm l ệnh. Intel 8086/8088 có t ập l ệnh kho ảng 115 l ệnh chia làm 5 nhóm Mỗi l ệnh là m ột chu ỗi s ố nh ị phân mà CPU hi ểu đượ c và th ực hi ện 1 thao tác xác đị nh Các l ệnh đượ c mô t ả b ằng ký hi ệu g ợi nh ớ Là các l ệnh c ủa h ợp ng ữ ( Assembly ) bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 3 Gi ản đồ tr ạng thái của Chu k ỳ l ệnh NhËn to¸n CÊt to¸n NhËn lÖnh h¹ng h¹ng NhiÒu NhiÒu to¸n kÕt h¹ng qu¶ Gi¶i m· TÝnh to¸n TÝnh to¸n TÝnh to¸n thao t¸c ®Þa chØ to¸n Xö lý d÷ liÖu ®Þa chØ to¸n ®Þa chØ lÖnh lÖnh h¹ng h¹ng KÕt thóc lªnh, DL d¹ng nhËn lÖnh x©u hoÆc tiÕp theo vect¬ Không ki ểm tra ng ắt bangtqh@utc2.edu.vn 4
  3. Gi ản đồ tr ạng thái c ủa chu k ỳ l ệnh NhËn to¸n CÊt to¸n NhËn lÖnh h¹ng h¹ng NhiÒu NhiÒu to¸n kÕt h¹ng qu¶ TÝnh to¸n Gi¶i m· TÝnh to¸n TÝnh to¸n Xö lý d÷ KiÓm tra ®Þa chØ thao t¸c ®Þa chØ ®Þa chØ Ng¾t liÖu ng¾t lÖnh lÖnh to¸n h¹ng to¸n h¹ng KÕt thóc lªnh, DL d¹ng Kh«ng nhËn lÖnh x©u hoÆc cã ng¾t tiÕp theo vect¬ Có ki ểm tra ng ắt cu ối m ỗi chu k ỳ l ệnh bangtqh@utc2.edu.vn 5 6.2. Tập thanh ghi c ủa 8086/8088 Nhóm thanh ghi đa Nhóm năng thanh ghi đoạn (segment) 8086/8088 có 14 thanh ghi 16 bit chia làm 4 nhóm nh ư hình v ẽ 8086/8088 có bus đị a ch ỉ 20 bit (1MB không gian đị a ch ỉ) sử d ụng ph ươ ng pháp đánh đị a ch ỉ phân đoạn (segment addressing ) Đị a ch ỉ v ật lý = đị a ch ỉ segment*16 + đị a ch ỉ offset bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 6
  4. Nhóm thanh ghi đa năng Còn g ọi là nhóm thanh ghi công d ụng chung (General purpose registers ) Có th ể dùng ½ mỗi thanh ghi nh ư nh ững thanh ghi độ c lập 8086/8088 tự độ ng sử dụng một số thanh ghi đa dụng vào một số mục đích cụ th ể bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 7 Nhóm thanh ghi đoạn CS : ch ứa đị a ch ỉ c ơ s ở đoạn mã l ệnh của ch ươ ng trình đang ch ạy DS : ch ứa đị a ch ỉ đoạn c ủa vùng d ữ li ệu ch ươ ng trình đang th ực hi ện ES: (Extra segment ) Ch ứa đị a ch ỉ đoạn d ữ li ệu b ổ sung ( vùng ch ứa bi ến c ủa ch ươ ng trình ) SS : Ch ứa đị a ch ỉ b ộ nh ớ stack c ủa ch ươ ng trình đang ch ạy bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 8
  5. Thanh ghi con tr ỏ và chỉ s ố IP : (instruction pointer ): luôn ch ỉ đế n đị a ch ỉ l ệnh s ắp đượ c thi hành trong b ộ do do CS đang tr ỏ t ới Cặp CS:IP ch ứa đị a ch ỉ v ật lý c ủa l ệnh trong b ộ nh ớ SP : luôn k ết h ợp v ới SS t ạo thành c ặp SS:SP để tr ỏ tới đị a ch ỉ vùng nh ớ stack c ủa ch ươ ng trình. SI và DI (Source index và Destination index ): đượ c thi ết k ế chuyên d ụng trong các thao tác v ận chuy ển số li ệu. C ặp DS:SI tr ỏ t ới d ữ li ệu ngu ồn, ES:DI tr ỏ t ới dữ li ệu đích bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 9 Thanh ghi c ờ c ủa 8086/8088 151413121110 9 8 7 6 5 4 3 2 1 0 XXXX OF DF IF TF SF ZF X AF X PF X CF bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 10
  6. Ngắt (nhắc l ại) Ng ắt là c ơ ch ế mà BXL d ừng ch ươ ng trình đang thi hành để th ực hi ện 1 công vi ệc khác – Ng ắt cứng: th ườ ng xu ất phát từ các thi ết bị ph ần cứng ngo ại vi, yêu cầu CPU gi ải quy ết 1 công vi ệc gì đó (vd: INT 2 báo sự cố ph ần cứng; INT 8: ng ắt tín hi ệu đồ ng hồ; INT 9 ng ắt bàn phím .v.) – Ng ắt mềm: là các ch ươ ng trình con đượ c gọi bằng lệnh INT của BXL. Số hi ệu ch ươ ng trình con là số hi ệu của vector ng ắt trong bảng vector ng ắt. Ch ươ ng trình con này thi hành 1 dịch vụ nào đó của DOS ho ặc BIOS. Khi gọi ng ắt mềm, ng ườ i lập trình th ườ ng ph ải truy ền các tham số thông qua các thanh ghi và kết qu ả thu đượ c sẽ có trong thanh ghi ho ặc bộ nh ớ. Bảng vector ng ắt chi ếm 1KB vùng nh ớ đị a ch ỉ th ấp từ 0:0000h đế n 0:0400h trong đó cứ 4 byte tạo thành 1 vector ch ứa đị a ch ỉ offset (word th ấp) và đị a ch ỉ segment (word cao) – Vd: INT 0 tại đị a ch ỉ 0:0004h, INT 1 tại đị a ch ỉ 0:0008h, INT 2 tại đị a ch ỉ 0:000Ch bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 11 Tập l ệnh 8086/8088 VXL 8086/8088 có kho ảng 115 l ệnh, chia làm 6 nhóm lệnh chính – Các l ệnh v ận chuy ển s ố li ệu ( POP, PUSH, MOV, . ) – Các l ệnh s ố h ọc ( ADD, SUB, MUL, IMUL, DIV, CMP ) – Các l ệnh thao tác ở m ức bit ( AND, NOT, ROR, ROL ) – Các l ệnh thao tác v ới dãy byte (REP, CMPSB, REPZ ) – Các l ệnh điều khi ển (CALL, INT, JE, JZ, LOOP, ) – Các l ệnh thao tác v ới c ờ (flag) và điều khi ển BXL (HLT,CLC, CLD, NOP, WAIT .) bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 12
  7. Phân bi ệt EXE và COM File *.COM –Nằm trên 1 segment size t ối đa ch ỉ 64KB –Nạp vào b ộ nh ớ và th ực thi hanh h ơn file EXE – Khi ch ạy file COM, DOS tạo vùng nh ớ Program Segment Prefix (PSP) dài 256 Byte ở 0000h ch ứa các thông tin cần thi ết, sau đó các mã lệnh sẽ đượ c load vào từ vị trí 0100h và nạp giá tr ị 0 vào stack (2 byte), thanh ghi SP tr ỏ tới 0FFFEh Size th ực t ế c ủa ch ươ ng trình COM ch ỉ là: 64KB – 256 Byte – 2 byte stack File *.EXE –Nằm trên nhi ều segment khác nhau – Size th ườ ng l ớn 64KB – Có th ể g ọi đượ c các ch ươ ng trình con d ạng near ho ặc far bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 13 Khung một ch ương trình assembly Xét c ụ th ể 1 ch ươ ng trình đơ n gi ản Đoạn khai báo d ữ li ệu Ch ươ ng trình chính Đoạn mã ch ứa lệnh c ủa ch ươ ng trình Ch ươ ng trình con bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 14
  8. Khung ch ương trình assembly (tt) Ch ỉ th ị .MODEL – TINY : Mã l ệnh và d ữ li ệu cùng n ằm trong 1 segment – SMALL : Mã l ệnh n ằm trên 1 segment; D ữ li ệu trên 1 segment khác – MEDIUM : Mã l ệnh n ằm trong nhi ều segment; D ữ li ệu nằm trên 1 segment – COMPACT : Mã l ệnh n ằm trên 1 segment; D ữ li ệu n ằm trên nhi ều segment – LARGE : Mã lệnh nằm trong nhi ều segment; D ữ li ệu nằm trên nhi ều segment nh ưng không ch ứa m ảng l ớn hơn 64KB – HUGE : Mã l ệnh và d ữ li ệu n ằm trên nhi ều segment; d ữ li ệu có th ể ch ứa các m ảng l ớn h ơn 64KB bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 15 Khung ch ương trình assembly (tt) Ch ỉ th ị .STACK – Cú pháp: .STACK n – Khai báo dùng để dành ra m ột vùng nh ớ dùng làm stack (ch ủ y ếu ph ục vụ cho ch ươ ng trình con), thông th ườ ng ta ch ọn kho ảng 256 byte là đủ để s ử d ụng –Nếu không khai báo thì ch ươ ng trình d ịch t ự độ ng cho kích th ướ c stack là 1 KB: Ch ỉ th ị .DATA –Bắt đầ u khai báo đoạn d ữ li ệu ch ứa các bi ến và h ằng trong ch ươ ng trình – Xem công th ức khai báo d ữ li ệu Ch ỉ th ị .CODE – Đoạn mã b ắt đầ u b ằng một ch ươ ng trình chính và có th ể có các lệnh g ọi ch ươ ng trình con ( CALL ) –Một ch ươ ng trình chính hay ch ươ ng trình con b ắt đầ u b ằng l ệnh PROC và k ết thúc bằng l ệnh ENDP (đây là các l ệnh gi ả c ủa ch ươ ng trình d ịch). Trong ch ươ ng trình con, ta s ử d ụng thêm l ệnh RET để tr ả v ề đị a ch ỉ l ệnh tr ướ c khi g ọi ch ươ ng trình con. bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 16
  9. Khung ch ương trình assembly (tt) Ch ỉ th ị ENDP – Báo cho Assembler bi ết điểm k ết thúc 1 th ủ t ục có tên là MAIN Ch ỉ th ị END – Báo cho Assembler bi ết điểm k ết thúc ch ươ ng trình chính v ới nhãn l ệnh đâu tiên trong modul ch ươ ng trình chính là MAIN bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 17 Khung ch ương trình assembly (tt) Tr ườ ng h ợp đoạn mã, đoạn d ữ li ệu, stack g ộp chung vào 1 segment duy nh ất Đoạn khai báo dữ li ệu Ch ươ ng trình chính Đị nh ngh ĩa ch ươ ng trình con n ếu có ở đây bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 18
  10. Cấu trúc 1 dòng l ệnh Assembly Nhãn Mã lệnh Toán hạng Chúthích START: MOV AH, 10h ; Đư a giá tr ị 10h vào AH Nhãn: Dài t ối đa 31 ký t ự, không đượ c b ắt đầ u b ằng ký tự s ố, không ch ứa d ấu cách tr ống Mã l ệnh ( Op-code ): Là các ch ữ vi ết t ắt g ợi nh ớ ch ỉ các lệnh c ủa BXL Các toán h ạng ( Operands ): Báo cho BXL bi ết tìm toán h ạng ở đâu Chú thích: Ph ải đứ ng sau d ấu ch ấm ph ẩy (;) và k ết thúc bởi d ấu xu ống dòng bangtqh@utc2.edu.vn 19 Khai báo bi ến Khai báo bi ến để assembler cung cấp m ột đị a ch ỉ xác đị nh trong bộ nh ớ. – DB (define byte) – DW (define word) – DD (define double word) Ví d ụ A1 DB 1 ;khai báo 1 bi ến A1 dài 1 byte, giá tr ị =1 A2 DB ? ;khai báo 1 bi ến A2 dài 1 byte A3 DB ‘P’ ;khai báo 1 bi ến A3 ki ểu ký t ự A4 DW 1 ;khai bao 1 bi ến dài 2 byte, giá tr ị =1 A5 DB 1,2,3 ;khai báo m ảng 3 ph ần t ử giá tr ị = 1,2,3 A6 DB 10 DUP (0) ;m ảng 10 ph ẩn t ử giá tr ị 0 bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 20
  11. Khai báo bi ến Lưu ý: Đố i với các bi ến có độ lớn nhi ều hơn 1 byte, byte th ấp sẽ ch ứa ở ô nh ớ có đị a ch ỉ th ấp và byte cao sẽ ch ứa ở ô nh ớ có đị a ch ỉ cao . – Ví d ụ: VarA DW 1234h –Nếu VarA đượ c c ấp ở đị a ch ỉ 1000h thì • Địa ch ỉ 1001h ch ứa byte 34h • Đị a ch ỉ 1002h ch ứa byte 12h bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 21 Khai báo hằng Các h ằng khai báo trong ch ươ ng trình h ợp ng ữ b ằng lệnh gi ả. Hằng có th ể ở d ạng s ố, ký t ự hay chu ỗi. VD : A12 EQU 10 A13 EQU 'AAA' ;Sau khi s ử d ụng khai báo trên, nếu ta dùng l ệnh: MOV AH, A12 ;thì AH = 10h ;N ếu khai báo ti ếp A14 DB ‘B’, A13 ;thì chu ỗi A14 có giá tr ị gán ban đầ u là 'BAAA'. bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 22
  12. Các toán t ử trong Assembly Toán t ử s ố h ọc Toán t ử logic Toán t ử quan h ệ Toán t ử cung c ấp thông tin Toán t ử thu ộc tính bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 23 Toán t ử s ố học VD: MOV AH, (5+1)*7/2 ;AH ← 21 MOV AH, 00010110b shl 2 ;AH ← 01011000b MOV AH, 00010110b shr 2 ;AH ← 00000101b MOV AH, 100 mod 3 ;AH ←1 bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 24
  13. Các toán t ử trong Assembly (tt) Toán t ử logic –Gồm các toán t ử AND, OR, NOT, XOR Toán t ử quan h ệ – So sánh 2 bi ểu th ức và tr ả v ề giá tr ị True (-1) nếu th ỏa mãn; False (0) nếu không th ỏa mãn bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 25 Toán t ử cung c ấp thông tin SEG – Cú pháp: SEG bt trong đó: bt có th ể là bi ến, nhãn hay các toán h ạng b ộ nh ớ – Công d ụng: tr ả v ề đị a ch ỉ segment c ủa bt OFFSET – Cú pháp: OFFSET bt trong đó: bt có th ể là bi ến, nhãn hay các toán h ạng b ộ nh ớ – Công d ụng: tr ả v ề đị a ch ỉ offset c ủa bt Toán t ử ch ỉ s ố [ ] – Dùng l ấy ph ần t ử ch ỉ s ố i đố i v ới bi ến d ạng m ảng ví d ụ: Tenmang[i] – Dùng để xác đị nh giá tr ị t ại m ột ô nh ớ có đị a ch ỉ l ưu trong thanh ghi (vd: [BX] Toán t ử (:) – segment override operator – Quy đị nh tính đị a ch ỉa đố i v ới segment đượ c ch ỉ đị nh (các thanh ghi đoạn ES, SS, DS, CS bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 26
  14. Toán t ử cung c ấp thông tin (tt) Toán t ử TYPE – Cú pháp TYPE bt – Cho phép xác đị nh ki ểu c ủa bi ểu th ức bt. •Nếu bt là bi ến tr ả v ề s ố byte (1, 2, ho ặc 4) •Nếu bt là nhãn tr ả v ề 0FFFh n ếu nhãn NEAR, 0FFFEh n ếu là nhãn FAR •Nếu bt là h ằng tr ả v ề 0 Toán t ử LENGTH – Cú pháp LENGTH bt – Tr ả v ề s ố ph ần t ử c ủa bt (tính theo byte, word, ho ặc dword) Toán t ử SIZE – Tr ả v ề t ổng s ố byte đã c ấp cho m ột đố i t ượ ng bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 27 Toán t ử thuộc tính PTR – Cú pháp: PTR bt – có d ạng BYTE ho ặc WORD n ếu bt là toán hạng b ộ nh ớ – có d ạng NEAR ho ặc FAR n ếu bt là nhãn – Ví d ụ: A DW 100 DUP(?) B DD ? ; Đư a byte đầ u tiên trong m ảng A vào thanh ghi AH MOV AH, BYTE PTR A ; Đư a 2 byte th ấp trong bi ến B vào thanh ghi AX MOV AX, WORD PTR B bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 28
  15. Các mode đị a chỉ toán hạng Toán h ạng có th ể là: –Một giá tr ị c ụ th ể –Nội dung c ủa thanh ghi –Nội dung c ủa ng ăn nh ớ –Nội dung c ủa c ổng vào ra Mode đị a ch ỉ là cách th ức đị a ch ỉ hóa trong l ệnh để xác đị nh toán h ạng bangtqh@utc2.edu.vn 29 Các mode đị a chỉ toán hạng Mode đị a ch ỉ t ức thì Mode đị a ch ỉ tr ực ti ếp Mode đị a ch ỉ gián ti ếp Mode đị a ch ỉ thanh ghi Mode đị a ch ỉ gián ti ếp qua thanh ghi Mode đị a ch ỉ d ịch chuy ển Mode đị a ch ỉ stack bangtqh@utc2.edu.vn 30
  16. Mode đị a chỉ t ức thì Toán h ạng là một ph ần của l ệnh Toán h ạng n ằm ngay trong tr ườ ng đị a ch ỉ Ch ỉ có th ể là toán h ạng ngu ồn Truy nh ập toán h ạng r ất nhanh Ví d ụ: ADD AX, 10 bangtqh@utc2.edu.vn 31 Mode đị a chỉ gián ti ếp Toán hạng là nội dung của ng ăn nh ớ có đị a ch ỉ nằm trong một ng ăn nh ớ khác, ng ăn nh ớ khác đó đượ c th ể hi ện trong lệnh Vùng nh ớ có th ể đượ c tham chi ếu là lớn Có th ể gián ti ếp nhi ều lần CPU ph ải th ực hi ện tham chi ếu bộ nh ớ nhi ều lần để tìm toán hạng → ch ậm Ví d ụ: ADD AH, [a] bangtqh@utc2.edu.vn 32
  17. Sơ đồ mode đị a chỉ gián ti ếp LÖnh M· lÖnh §Þa chØ Bé nhí §Þa chØ cña t/h¹ng To¸n h¹ng bangtqh@utc2.edu.vn 33 Mode đị a chỉ thanh ghi Toán h ạng là n ội dung c ủa một thanh ghi Số l ượ ng thanh ghi có h ạn Tr ườ ng đị a ch ỉ nh ỏ (ch ỉ c ần ít bit) – Độ dài l ệnh ng ắn h ơn – Nh ận l ệnh nhanh h ơn Không tham chi ếu b ộ nh ớ Truy nh ập toán h ạng nhanh Tăng s ố l ượ ng thanh ghi → tăng t ốc độ Ví dụ: ADD AL, AH bangtqh@utc2.edu.vn 34
  18. Sơ đồ mode đị a chỉ thanh ghi Vị trí c ủa toán h ạng chính là các thanh ghi c ủa BXL – VD: MOV DS, AX LÖnh M· lÖnh Tªn thanh ghi TËp thanh ghi To¸n h¹ng bangtqh@utc2.edu.vn 35 Mode đị a ch ỉ gián ti ếp qua thanh ghi Toán h ạng là ng ăn nh ớ có đị a ch ỉ n ằm trong m ột thanh ghi Thanh ghi này đượ c g ọi là thanh ghi con tr ỏ Vùng nh ớ có th ể đượ c tham chi ếu là l ớn: 2n, trong đó n là độ dài (bit) c ủa thanh ghi Ví d ụ: SUB AL, [BX] bangtqh@utc2.edu.vn 36
  19. Sơ đồ mode gián ti ếp qua thanh ghi LÖnh M· lÖnh Tªn thanh ghi Bé nhí TËp thanh ghi §Þa chØ cña t/h¹ng To¸n h¹ng bangtqh@utc2.edu.vn 37 Mode đị a chỉ dịch chuy ển Kết h ợp hai mode: – Mode gián ti ếp qua thanh ghi – Mode tr ực ti ếp Tr ườ ng đị a ch ứa hai thành ph ần: – Tên m ột thanh ghi –Một h ằng s ố Đị a ch ỉ toán h ạng = ND thanh ghi = h ằng s ố Ví dụ: ADD AL, [SI + 50] bangtqh@utc2.edu.vn 38
  20. Sơ đồ mode đị a chỉ dịch chuy ển LÖnh M· lÖnh Register R Address A Bé nhí TËp thanh ghi + §Þa chØ cña t/h¹ng To¸n h¹ng bangtqh@utc2.edu.vn 39 Mode đị a chỉ stack Toán h ạng đượ c ng ầm hi ểu là ng ăn nh ớ đỉ nh ng ăn xếp Ví d ụ: PUSH AX LÖnh M· lÖnh NgÇm hiÓu Ng¨n nhí ®Ønh stack bangtqh@utc2.edu.vn 40
  21. Minh h ọa l ệnh g ọi ch ương trình con bangtqh@utc2.edu.vn 41 Thể hi ện ở Stack Khëi t¹o Sau lÖnh Sau lÖnh Sau lÖnh Sau lÖnh Sau lÖnh Sau lÖnh néi dung CALL Proc1 CALL Proc2 RETURN CALL Proc2 RETURN RETURN stack bangtqh@utc2.edu.vn 42
  22. Một s ố l ệnh c ơ b ản c ủa assembly Lệnh MOV – Cú pháp: MOV đích , ngu ồn – Không đượ c dùng l ệnh MOV chuy ển tr ực ti ếp d ữ li ệu gi ữa 2 ô nh ớ mà ph ải thông qua m ột thanh ghi – Không đượ c chuy ển tr ực ti ếp d ữ li ệu vào thanh ghi đoạn (DS, CS, SS, ES) – Không đượ c chuy ển tr ực ti ếp gi ữa 2 thanh ghi đoạn Lệnh XCHG : Hoán chuy ển n ội dung gi ữa 2 toán hạng – Cú pháp: XCHG dst , src – Không đượ c phép dùng l ệnh XCHG v ới thanh ghi đoạn (DS, CS, SS, ES) bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 43 Một s ố l ệnh c ơ b ản c ủa assembly (tt) Lệnh c ộng không nh ớ ADD – Cú pháp: ADD dst , src – Công d ụng: dst ←dst + src – Không đượ c phép c ộng 2 thanh ghi đoạn – Toán h ạng src có th ể là thanh ghi ho ặc ô nh ớ ho ặc giá tr ị c ụ th ể; Toán h ạng dst là thanh ghi ho ặc ô nh ớ Lệnh c ộng có nh ớ ADC – Cú pháp: ADC dst , src – Công d ụng: dst ← dst + src + CF – Th ườ ng đượ c d ụng khi c ộng các s ố l ớn h ơn 16 bit Lệnh t ăng INC – Cú pháp: INC dst ;dsc có th ể là reg ho ặc mem – Công d ụng: dst ←dst +1 bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 44
  23. Một s ố l ệnh c ơ b ản c ủa assembly (tt) Lệnh gi ảm DEC – Cú pháp: DEC dst ;dsc có th ể là reg ho ặc mem – Công d ụng: dst  dst – 1 Lệnh tr ừ SUB – Cú pháp: SUB dsc , src ;dsc ← dsc - src – src có th ể là reg, mem ho ặc immed; dsc ch ỉ có th ể là reg ho ặc mem – Không đượ c phép tr ừ trên thanh ghi đoạn Lệnh tr ừ có m ượ n SBB – Cú pháp SBB dsc, src ;dsc  dsc – src - CF Lệnh đả o d ấu NEG – Cú pháp NEG dsc ;dsc  -dsc bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 45 Một s ố l ệnh c ơ b ản c ủa assembly (tt) Lệnh n ạp đị a ch ỉ th ực LEA – Cú pháp: LEA dst, src – Công d ụng là chuy ển đị a ch ỉ offset c ủa src vào dst – Đích dst th ườ ng là BX, CX, DX, BP, SI, DI; scr th ườ ng là tên c ủa bi ến. –Tươ ng đươ ng v ới l ệnh: MOV reg16, OFFSET mem16 Lệnh g ọi ng ắt INT – Cú pháp: INT, – Các ng ắt thông d ụng: • 09h ng ắt bàn phím • 20h thoát kh ỏi ch ươ ng trình • 21h DOS bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 46
  24. Các l ệnh vào/ra trong assembly Một s ố hàm c ủa ng ắt 21h (DOS) – Hàm 01h nh ập 1 ký t ự t ừ bàn phím – Hàm 02h in 1 ký t ự ra màn hình – Hàm 09h in 1 chu ỗi ký t ự (k ết thúc $) ra màn hình – Hàm 0Ah nh ận m ột chu ỗi ký t ự t ừ bàn phím – . Ví d ụ: Vi ết ch ươ ng trình nh ập 1 ký t ự t ừ bàn phím hi ện ký t ự v ừa nh ập – Đư a s ố hi ệu hàm vào AH – Mã ASCII c ủa ký t ự nh ập t ừ bàn phím s ẽ l ưu trong AL – Khi in ký t ự ra màn hình thì AH ch ứa s ố hi ệu hàm, DL ch ứa ký mã ký t ự c ần in bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 47 Các l ệnh vào/ra trong assembly Gi ải: Bài t ập: Vi ết ch ươ ng trình nh ập 2 s ố A, B trong kho ảng 0 9, in ra màn hình t ổng c ủa 2 s ố đó bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 48
  25. Các l ệnh vào/ra trong assembly Chu trình hi ển th ị 1 chu ỗi ký t ự lên màn hình –Bướ c 1: Kh ởi t ạo đoạn d ữ li ệu trong thanh ghi DS MOV AX, @DATA MOV DS, AX –Bướ c 2: Đư a đị a ch ỉ chu ỗi c ần in vào thanh ghi DX LEA DX, Msg ; ho ặc l ệnh MOV DX, OFFSET Msg –Bướ c 3: Đặ t tr ị s ố hàm 09h vào AH MOV AH, 09h –Bướ c 4: G ọi ng ắt 21h INT 21h bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 49 Các l ệnh vào/ra trong assembly Bài t ập 1: Vi ết ch ươ ng trình hi ển th ị lên màn hình Bài t ập 2 : Vi ết ch ươ ng trình nh ận vào t ừ bàn phím 1 ký tự, hãy in ra màn hình ký t ự đó ở d ạng ch ữ in hoa. (ch ươ ng trình có hi ển câu thông báo m ời nh ập và câu thông báo k ết qu ả). bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 50
  26. Các l ệnh vào/ra trong assembly (tt) Chu trình nh ập 1 ch ỗi ký t ự t ừ bàn phím –Bướ c 1: Khai báo buffer ch ứa chu ỗi s ẽ nh ập strBuffer DB 40, ?, 40 DUP (?) –Bướ c 2: Đư a đị a ch ỉ buffer vào DX LEA DX, strBuffer ; ho ặc l ệnh MOV DX, OFFSET Msg –Bướ c 3: Đặ t tr ị s ố hàm 0Ah vào AH MOV AH, 0Ah –Bướ c 4: G ọi ng ắt 21h INT 21h + Thao tác nh ập k ết thúc b ằng phím Enter (mã 0Dh) + strBuffer[1] ch ứa độ dài chu ỗi v ừa nh ập bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 51 Ví dụ: Nh ập h ọ tên và in l ời chào ra màn hình bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 52
  27. Các l ệnh vào/ra trong assembly (tt) Bài t ập 3: Hãy vi ết ch ươ ng trình nh ập vào t ừ bàn phím 2 s ố nguyên n ằm trong kho ảng 0 255. Tính và in ra màn hình Tổng và Tích của 2 s ố nguyên đó Gợi ý: + Nh ập 2 xâu strA và strB + Ti ến hành đổ i 2 xâu v ừa nh ập v ề d ạng s ố + Tính t ổng và tích 2 s ố đó + Đổ i các ch ữ s ố hàng đv, ch ục, tr ăm sang d ạng ký t ự r ồi lần l ượ t in các ký t ự đó ra màn hình bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 53 Cấu trúc điều khi ển trong assembly Lệnh nh ảy không điều ki ện JMP – Cú pháp: JMP – Công d ụng: Chuy ển t ới v ị trí l ệnh đượ c xác đị nh b ởi CS:IP Các l ệnh nh ảy có điều ki ện – Các l ệnh nh ảy không d ấu – Các l ệnh nh ảy có d ấu (khi k ết qu ả tr ả v ề là s ố có d ấu) – Các l ệnh nh ảy điều ki ện đơ n: ĐK nh ảy ph ụ thu ộc vào 1 cờ riêng bi ệt bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 54
  28. Ví dụ l ệnh nhảy JMP bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 55 Cấu trúc điều khi ển trong assembly (tt) Lệnh nh ảy có điều ki ện – Ch ỉ đượ c phép nh ảy t ới các label trong kho ảng [-127, 128] byte t ại c ủa IP –Lệnh JA (Jump if above) –Lệnh JAE (Jump if above or equal) –Lệnh JB (Jump if below) –Lệnh JBE (Jump if below or equal) –Lệnh JE (Jump if Equal) –Lệnh JNE (Jump if not Equal) –Lệnh JNA (Jump if not Above) – ( đọ c help) Các l ệnh nh ảy có điều ki ện th ườ ng dùng sau l ệnh so sánh CMP bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 56
  29. Cấu trúc điều khi ển trong assembly (tt) Cấu trúc r ẽ nhánh If Then CMP Lablel_B ỏ_qua_vi ệc_A . Label_B ỏ_qua_vi ệc_A: Ví d ụ: Vi ết ch ươ ng trình nh ập vào s ố n ăm d ươ ng l ịch Ki ểm tra xem n ăm đó có ph ải n ăm nhu ận không? bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 57 Cấu trúc điều khi ển trong assembly (tt) Cấu trúc r ẽ nhánh If Then Else CMP JNE Lablel_vi ệc_B JMP Label_next Label_vi ệc_B: Label_next: Ví d ụ: Vi ết ch ươ ng trình nh ập vào 2 s ố A và B, hãy tìm min c ủa 2 s ố v ừa nh ập bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 58
  30. Cấu trúc điều khi ển trong assembly (tt) Cấu trúc l ặp v ới l ệnh LOOP – Thanh ghi CX ch ứa s ố l ần l ặp – Sau m ỗi l ần l ặp CX t ự độ ng gi ảm đi 1 – Cú pháp th ườ ng dùng: MOV CX, Label_loop: LOOP label_loop Ví d ụ: Vi ết ch ươ ng trình in ra màn hình 255 ký t ự c ủa bảng mã ASCII bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 59 Thắc mắc? bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 60
  31. Bài t ập 1. Vi ết ch ươ ng trình nh ập vào từ bàn phím một số nguyên dươ ng N trong trong mi ền 0 255. Hãy xác đị nh xem N có ph ải là số nguyên tố hay không? 2. Vi ết ch ươ ng trình nh ập vào từ bàn phím 1 số nguyên dươ ng N. Hãy in ra màn hình giá tr ị các số trong mi ền 0 N ở dạng: Th ập phân, Nh ị phân, Hecxa. Màn hình đượ c chia làm 3 cột, mỗi dòng in các con số đó theo cả 2 hệ đế m trên 3. Hãy vi ết ch ươ ng trình nh ập vào từ bàn phím 1 xâu ký tự (h ọ tên của 1 ng ườ i). Hãy chu ẩn hóa xâu theo quy tắc: Mỗi từ thì ch ữ cái đầ u tiên vi ết hoa, các ch ữ khác vi ết th ườ ng. Gi ữa các từ ch ỉ có 1 dấu cách (20h). Sau khi chu ẩn hóa xong in xâu kết qu ả ra màn hình. bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 61 Bài tập (ti ếp) 1. Vi ết ch ươ ng trình nh ập vào s ố N, sau đó nh ập ti ếp N xâu ký t ự. H ỏi ng ườ i dùng mu ốn in xâu th ứ bao nhiêu ra màn hình? Ng ườ i dùng điền s ố th ứ t ự k thì xâu th ứ k đượ c in ra 2. Vi ết ch ươ ng trình nh ập độ cao h c ủa tam giác. Hãy in ra màn hình tam giác có d ạng sau: h = s ố hàng bangtqh@utc2.edu.vn Ch ươ ng 6 - Lập trình h ợp ng ữ 62