Bài giảng Cấu trúc máy tính - Chương 4: Lập trình hợp ngữ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Cấu trúc máy tính - Chương 4: 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:
- bai_giang_cau_truc_may_tinh_chuong_4_lap_trinh_hop_ngu.ppt
Nội dung text: Bài giảng Cấu trúc máy tính - Chương 4: Lập trình hợp ngữ
- Cấu trúc máy tính Chương 4 LẬP TRÌNH HỢP NGỮ 6/12/2021 Chương 4: Lập trình hợp ngữ 1
- Nội dung 4.1. Giới thiệu về ngơn ngữ Assembly 4.2. Cách viết chương trình Assembler 4.3. Cấu trúc chương trình Assembler 4.4. Tập lệnh 6/12/2021 Chương 4: Lập trình hợp ngữ 2
- Giới thiệu ngơn ngữ Assembly ◼ Là ngơn ngữ bậc thấp, dùng chính các câu lệnh trong tập lệnh của bộ xử lý ◼ Ưu điểm chương trình chạy nhanh và chiếm dung lượng bộ nhớ nhỏ ◼ Nhược điểm chương trình dài, khĩ kiểm sốt lỗi, khĩ bảo trì, chương trình hợp ngữ chỉ chạy trên hệ thống máy cĩ kiến trúc và tập lệnh tương ứng 6/12/2021 Chương 4: Lập trình hợp ngữ 3
- Lý do nghiên cứu Assembly ▪ Đĩ là cách tốt nhất để học phần cứng MT và hệ điều hành. ▪ Vì các tiện ích của nĩ. ▪ Cĩ thể nhúng các chương trình con viết bằng ASM vào trong các chương trình viết bằng ngơn ngữ cấp cao. 6/12/2021 Chương 4: Lập trình hợp ngữ 4
- Assembler ▪ Một chương trình viết bằng ngơn ngữ Assembly muốn MT thực hiện được ta phải chuyển thành ngơn ngữ máy. ▪ Chương trình dùng để dịch 1 file viết bằng Assembly ➔ ngơn ngữ máy , gọi là Assembler. ▪ Cĩ 2 chương trình dịch: MASM và TASM 6/12/2021 Chương 4: Lập trình hợp ngữ 5
- Lệnh máy ▪ Là 1 chuỗi nhị phân cĩ ý nghĩa đặc biệt – nĩ ra lệnh cho CPU thực hiện tác vụ. ▪ Tác vụ đĩ cĩ thể là : di chuyển 1 số từ vị trí nhớ này sang vị trí nhớ khác. Cộng 2 số hay so sánh 2 số. 0 0 0 0 0 1 0 0 Add a number to the AL register 1 0 0 0 0 1 0 1 Add a number to a variable 1 0 1 0 0 0 1 1 Move the AX reg to another reg 6/12/2021 Chương 4: Lập trình hợp ngữ 6
- Lệnh máy ▪ Tập lệnh máy được định nghĩa trước, khi CPU được sản xuất và nĩ đặc trưng cho kiểu CPU . ▪ Ex : B5 05 là 1 lệnh máy viết dạng số hex, dài 2 byte. ▪ Byte đầu B5 gọi là Opcode ▪ Byte sau 05 gọi là tốn hạng Operand ▪ Ý nghĩa của lệnh B5 05 : chép giá trị 5 vào reg AL 6/12/2021 Chương 4: Lập trình hợp ngữ 7
- Cách dịch chương trình Assembly Soạn CT Dùng 1 phần mềm soạn thảo VB bất kỳ để TenCT.ASM soan CT Assembly như : NotePad, NC, màn hình C, Pascal lưu CT cĩ phần mở rộng là .ASM Dịch CT dùng MASM để dịch chương trình nguồn .ASM ➔ File Object. Liên kết CT Dùng LINK để liên kết Object tạo tập tin thực hiện .EXE Gõ tên tập tin thực hiện .EXE từ dấu nhắc Chạy CT DOS để chạy 6/12/2021 Chương 4: Lập trình hợp ngữ 8
- Dịch và nối kết chương trình MASM.EXE TenCT .ASM TenCT .OBJ LINK.EXE TenCT .MAP TenCT .LIB TenCT .CRF TenCT .EXE 6/12/2021 Chương 4: Lập trình hợp ngữ 9
- Khung chương trình hợp ngữ .MODEL Small ;kiểu bộ nhớ .STACK 100 ; kích thước .DATA ; khai báo biến và hằng .CODE MAIN PROC ; khởi đầu cho DOS MOV AX, @DATA MOV DS,AX các lệnh chương trình chính MOV AH,4CH ; thốt khỏi chương trình INT 21H MAIN ENDP các chương trình con (nếu cĩ) để ở tại đây END MAIN 6/12/2021 Chương 4: Lập trình hợp ngữ 10
- Khai báo quy mơ sử dụng bộ nhớ Kiểu Mơ tả TINY Mã lệnh và dữ liệu gĩi gọn trong một đoạn SMALL Mã lệnh trong 1 đoạn. Dữ liệu trong 1 đoạn MEDIUM Mã lệnh nhiều hơn 1 đoạn. Dữ liệu trong 1 đoạn COMPACT Mã lệnh trong 1 đoạn. Dữ liệu trong nhiều hơn 1 đoạn LARGE Mã lệnh nhiều hơn 1 đoạn. Dữ liệu nhiều hơn 1 đoạn, khơng cĩ mảng nào lớn hơn 64K HUGE Mã lệnh nhiều hơn 1 đoạn. Dữ liệu nhiều hơn 1 đoạn, các mảng cĩ thể lớn hơn 64K 6/12/2021 Chương 4: Lập trình hợp ngữ 11
- Khai báo đoạn ngăn xếp ◼ Khai báo vùng nhớ dùng làm ngăn xếp phục vụ cho chương trình ◼ Stack kích thước ◼ Nếu khơng khai báo thì mặc định là 1KB 6/12/2021 Chương 4: Lập trình hợp ngữ 12
- Khai báo đoạn dữ liệu ◼ Dùng định nghĩa các biến và hằng ◼ Ví dụ .DATA MSG DB ‘Hello!$’ CR DB 13 LF EQU 10 6/12/2021 Chương 4: Lập trình hợp ngữ 13
- Khai báo đoạn mã .Code Main Proc ; Các lệnh thân chương trình chính Call ten_chuong_trinh_con ;goi ctc Main Endp Ten_chuong_trinh_con Proc ; Các lệnh thân chương trình con RET Ten_chuong_trinh_con Endp END MAIN 6/12/2021 Chương 4: Lập trình hợp ngữ 14
- Dạng lệnh ◼ [name] [operator] [ operand] [comment] Mã lệnh dạng Nhãn, tên biến Register, ơ nhớ gợi nhớ Tên thủ tục Trị, hằng Ví dụ: Mỗi dịng chỉ chứa 1 lệnh và mỗi MOV CX , 0 ;gan zero lệnh phải nằm trên 1 dịng LAP : MOV CX, 4 LIST DB 1,2,3,4 6/12/2021 Chương 4: Lập trình hợp ngữ 15
- INT 21H ▪ Lệnh INT số hiệu ngắt được dùng để gọi chương trình ngắt của DOS và BIOS. ▪ Muốn sử dụng hàm nào của INT 21h ta đặt function_number vào thanh ghi AH, sau đĩ gọi INT 21h AH=1: nhập 1 ký tự từ bàn phím AH=2: xuất 1 ký tự ra mà hình. AH=9: xuất 1 chuổi ký tự ra màn hình AH=4CH: kết thúc chương trình .EXE 6/12/2021 Chương 4: Lập trình hợp ngữ 16
- INT 21h ▪ Hàm 1 : Nhập 1 ký tự Input : AH =1 Output : AL = mã ASCCI của phím ấn = 0 nếu 1 phím điều khiển được ấn ▪ Hàm 2 : Hiển thị 1 ký tự ra màn hình Input : AH =2 DL = Mã ASCII của ký tự hiển thị hay ký tự điều khiển 6/12/2021 Chương 4: Lập trình hợp ngữ 17
- Khai báo biến ▪ Cú pháp : [tên biến] DB | DW | [trị khởi tạo] ▪ Là một tên ký hiệu dành riêng cho 1 vị trí trong bộ nhớ nơi lưu trữ dữ liệu. ▪ Offset của biến là khoảng cách từ đầu phân đoạn đến biến đĩ. ▪ VD : khai báo 1 danh sách aList ở địa chỉ 100 với nội dung sau : .data aList db “ABCD” 6/12/2021 Chương 4: Lập trình hợp ngữ 18
- Khai báo biến Từ gợi nhớ Mơ tả Số byte Thuộc tính DB Định nghĩa byte 1 Byte DW Từ 2 Word DD Từ kép 4 Doubleword DQ Từ tứ 8 Quardword DT 10 bytes 10 tenbyte 6/12/2021 Chương 4: Lập trình hợp ngữ 19
- Minh họa khai báo biến ◼ Char db ‘A’ ◼ Num db 41h ◼ Mes db “Hello Word”,’$’ ◼ Array_1 db 10, 32, 41h, 00100101b ◼ Array_2 db 2,3,4,6,9 ◼ Myvar db ? ; biến không khởi tạo ◼ Btable db 1,2,3,4,5 db 6,7,8,9,10 6/12/2021 Chương 4: Lập trình hợp ngữ 20
- Tốn tử DUP Lặp lại 1 hay nhiều giá trị khởi tạo. ▪ VD : Bmem DB 50 Dup(?) ; khai báo vùng nhớ gồm 50 bytes. db 4 dup (“ABC”) ;12 bytes “ABCABCABCABC” db 4096 dup (0) ; Vùng đệm 4096 bytes tất cả bằng 0 6/12/2021 Chương 4: Lập trình hợp ngữ 21
- Khởi tạo biến ▪ Lưu ý : Khi khởi tạo trị là 1 số hex thì giá trị số luơn luơn bắt đầu bằng 1 ký số từ 0 đến 9. Nếu ký số bắt đầu là A F thì phải thêm số 0 ở đầu. ▪ VD : Db A6H ; sai Db 0A6h ; đúng 6/12/2021 Chương 4: Lập trình hợp ngữ 22
- Tập lệnh Tham khảo PDF File 6/12/2021 Chương 4: Lập trình hợp ngữ 23
- Chuyển ngơn ngữ cấp cao thành ngơn ngữ ASM Giả sử A và B là 2 biến từ . Chúng ta sẽ chuyển các mệnh đề sau trong ngơn ngữ cấp cao ra ngơn ngữ ASM . Mệnh đề B=A MOV AX,A ; đưa A vào AX MOV B,AX ; đưa AX vào B Mệnh đề A=5-A MOV AX,5 ; đưa 5 vào AX SUB AX,A ; AX=5-A MOV A,AX ; A=5-A cách khác : NEG A ;A=-A ADD A,5 ;A=5-A Mệnh đề A=B-2*A MOV AX,B ;Ax=B SUB AX,A ;AX=B-A SUB AX,A ;AX=B-2*A MOV A,AX ;A=B-2*A 6/12/2021 Chương 4: Lập trình hợp ngữ 24
- Cấu trúc rẽ nhánh IF condition is true THEN execute true branch statements END IF Hoặc IF condition is true THEN execute true branch statements ELSE execute false branch statements END_IF 6/12/2021 Chương 4: Lập trình hợp ngữ 25
- Ví dụ 1: Thay thế giá trị trên AX bằng giá trị tuyệt đối của nĩ ◼ Thuật tốn: IF AX<0 THEN replace AX by - AX END-IF ◼ Mã hố: ;if AX<0 CMP AX,0 JNL END_IF ; no , exit ;then NEG AX ; yes , change sign END_IF : 6/12/2021 Chương 4: Lập trình hợp ngữ 26
- Ví dụ 2 : giả sử AL và BL chứa ASCII code của 1 ký tự .Hãy xuất ra màn hình ký tự trước ( theo thứ tự ký tự ) ◼ Thuật tốn IF AL<= BL THEN display AL ELSE display character in BL END_IF ◼ Mã hố : MOV AH,2 ; chuẩn bị xuất ký tự ;if AL<=BL CMP AL,BL ; AL<=BL? JNBE ELSE_ ; no, display character in BL ;then MOV DL,AL JMP DISPLAY ELSE_: MOV DL,BL DISPLAY: INT 21H END_IF : 6/12/2021 Chương 4: Lập trình hợp ngữ 27
- Rẽ nhánh nhiều hướng ◼ Case là một cấu trúc rẽ nhánh nhiều hướng . Cĩ thể dùng để test một thanh ghi hay , biến nào đĩ hay một biểu thức mà giá trị cụ thể nằm trong 1 vùng các giá trị. ◼ Cấu trúc của CASE như sau : CASE expression value_1 : Statements_1 value_2 : Statements_2 . . value_n : Statements_n 6/12/2021 Chương 4: Lập trình hợp ngữ 28
- Ví dụ ◼ Nếu AX âm thì đặt -1 vào BX ◼ Nếu AX bằng 0 thì đặt 0 vào BX ◼ Nếu AX dương thì đặt 1 vào BX ◼ Thuật tốn : CASE AX 0 put 1 in BX 6/12/2021 Chương 4: Lập trình hợp ngữ 29
- Cài đặt ; case AX CMP AX,0 ; test AX JL NEGATIVE ; AX 0 NEGATIVE: MOV BX,-1 JMP END_CASE ZERO: MOV BX,0 JMP END_CASE POSITIVE: MOV BX,1 JMP END_CASE END_CASE : 6/12/2021 Chương 4: Lập trình hợp ngữ 30
- Rẽ nhánh với một tổ hợp các điều kiện ◼ Đơi khi tình trạng rẽ nhánh trong các lệnh IF , CASE cần một tổ hợp các điều kiện dưới dạng : Condition_1 AND Condition_2 Condition_1 OR Condition_2 6/12/2021 Chương 4: Lập trình hợp ngữ 31
- Ví dụ 1: Đọc một ký tự và nếu nĩ là ký tự hoa thì in nĩ ra màn hình ◼ Thuật tốn : Read a character ( into AL) IF ( ‘A’<= character ) AND ( charater <= ‘Z’) THEN display character END_IF 6/12/2021 Chương 4: Lập trình hợp ngữ 32
- Cài đặt ; read a character MOV AH,2 INT 21H ; character in AL ; IF ( ‘A’ =‘A’? JNGE END_IF ; no, exit CMP AL,’Z ; char <=‘Z’? JNLE END_IF ; no exit ; then display it MOV DL,AL MOV AH,2 INT 21H END_IF : 6/12/2021 Chương 4: Lập trình hợp ngữ 33
- Ví dụ 2: Đọc một ký tự , nếu ký tự đĩ là ‘Y’ hoặc ‘y’ thì in nĩ lên màn hình , ngược lại thì kết thúc chương trình . ◼ Thuật tốn Read a charcter ( into AL) IF ( character =‘Y’) OR ( character=‘y’) THEN dispplay it ELSE terminate the program END_IF 6/12/2021 Chương 4: Lập trình hợp ngữ 34
- Cài đặt ; read a character MOV AH,2 INT 21H ; character in AL ; IF ( character =‘y’ ) OR ( charater = ‘Y’) CMP AL,’y’ ; char =‘y’? JE THEN ;yes , goto display it CMP AL,’Y’ ; char =‘Y’? JE THEN ; yes , goto display it JMP ELSE_ ;no , terminate THEN : MOV DL,AL MOV AH,2 INT 21H JMP END_IF ELSE_: MOV AH,4CH INT 21h END_IF : 6/12/2021 Chương 4: Lập trình hợp ngữ 35
- Cấu trúc lặp ◼ Một vịng lặp gồm nhiều lệnh được lặp lại , số lần lặp phụ thuộc điều kiện 6/12/2021 Chương 4: Lập trình hợp ngữ 36
- Vịng FOR ◼ Lệnh LOOP cĩ thể dùng để thực hiện vịng FOR . LOOP destination_label ◼ Số đếm cho vịng lặp là thanh ghi CX mà ban đầu nĩ được gán 1 giá trị nào đĩ . Khi lệnh LOOP được thực hiện CX sẽ tự động giảm đi 1 . Nếu CX chưa bằng 0 thì vịng lặp được thực hiện tiếp tục . Nếu CX=0 lệnh sau lệnh LOOP được thực hiện ◼ Lưu ý rằng vịng FOR cũng như lệnh LOOP thực hiện ít nhất là 1 lần. Do đĩ nếu ban đầu CX=0 thì vịng lặp sẽ làm cho CX=FFFH, tức là thực hiện lặp đến 65535 lần 6/12/2021 Chương 4: Lập trình hợp ngữ 37
- Ví dụ : Dùng vịng lặp in ra 1 hàng 80 dấu ‘*’ MOV CX,80 ; CX chứa số lần lặp MOV AH,2 ; hàm xuất ký tự MOV DL,’*’ ; DL chưá ký tự ‘*’ TOP: INT 21h ; in dấu ‘*’ LOOP TOP ; lặp 80 lần 6/12/2021 Chương 4: Lập trình hợp ngữ 38
- Vịng WHILE ◼ Vịng WHILE phụ thuộc vào 1 điều kiện .Nếu điều kiện đúng thì thực hiện vịng WHILE . Vì vậy nếu điều kiện sai thì vịng WHILE khơng thực hiện gì cả 6/12/2021 Chương 4: Lập trình hợp ngữ 39
- Ví dụ : Viết đoạn mã để đếm số ký tự được nhập vào trên cùng một hàng . MOV DX,0 ; DX để đếm số ký tự MOV AH,1 ; hàm đọc 1 ký tự INT 21h ; đọc ký tự vào AL WHILE_: CMP AL,0DH ; cĩ phải là ký tự CR? JE END_WHILE ; đúng , thốt INC DX ; tăng DX lên 1 INT 21h ; đọc ký tự JMP WHILE_ ; lặp END_WHILE : 6/12/2021 Chương 4: Lập trình hợp ngữ 40