Bài giảng Cấu trúc máy tính - Chương 8: Cấu trúc điều khiển và Vòng lặp
Sự cần thiết của lệnh nhảy trong lập trình ASM.
Lệnh JMP (Jump) : nhảy không điều kiện.
Lệnh LOOP : cho phép lặp 1 công việc với 1 số lần nào đó.
Các lệnh so sánh và luận lý.
Lệnh lặp có điều kiện.
Lệnh nhảy có điều kiện.
Biểu diễn mô phỏng cấu trúc luận lý mức cao.
Chương trình con.
Một số chương trình minh họa.
dụng : dịch các bit của toán hạng đích sang bên phải. Cú pháp : SHR toán hạng đích , 1 MT thực hiện phép chia bằngdịch phải Hoạt động : 1 giá trị 0 sẽ được đưa vào bit msb của toán hạng đích, còn bit bên phải nhất sẽ được đưa vào cờ CF. SHR toán hạng đích , CL ; dịch phải n bit trong đó CL chứa n 28 Chuong 8 : Cau truc DK va Vong lap lệnh dịch phải SHR Ex : shr 0100b, 1 ; 0010b = 2 Đối với các số lẻ, dịch phải sẽ chia đôi nó và làm tròn xuống số nguyên gần nhất. Ex : shr 0101b, 1 ; 0010b = 2 29 Chuong 8 : Cau truc DK va Vong lap Các phép nhân và chia tổng quát Việc nhân và chia cho các số lũy thừa của 2 có thể thực hiện bằng lệnh dịch trái và dịch phải. Để nhân và chia cho các số bất kỳ ta có thể kết hợp lệnh dịch và cộng. Ex : nhân 2 số nguyên dương A và B bằng lệnh cộng và dịch bit. Giả sử A = 111b và B = 1101b. Tính A*B 30 Chuong 8 : Cau truc DK va Vong lap Các phép nhân và chia tổng quát Thuật toán : Tích = 0 Repeat If bit Lsb của B bằng 1 Then tích = tích + A End If Dịch trái A Dịch phải B Until B =0 31 Chuong 8 : Cau truc DK va Vong lap Các phép nhân và chia tổng quát Vì bit lsb của B = 1 tích = tích +A = 111b Dịch trái A : 1110b Dịch phải B : 110b Vì bit lsb của B = 0 Dịch trái A : 11100b Dịch phải B : 11b Vì bit lsb của B = 1 Tích =tích + A = 100011b Dịch trái A : 111000b Dịch phải B : 1b Vì bit lsb của B =1 Tích = 100011b+111000b= 1011011b Dịch trái A : 1110000b Dịch phải B : 0b Vì bit lsb của B = 0 Tích = 1011011b = 91d Giả sử A = 111b và B = 1101b. Tính A*B 32 Chuong 8 : Cau truc DK va Vong lap Chương trình con Có vai trò giống như chương trình con ở ngôn ngữ cấp cao. ASM có 2 dạng chương trình con : dạng FAR và dạng NEAR. Lệnh gọi CTC nằm khác đoạn bộ nhớ với CTC được gọi Lệnh gọi CTC nằm cùng đoạn bộ nhớ với CTC được gọi 33 Chuong 8 : Cau truc DK va Vong lap BIỂU DIỄN CẤU TRÚC LOGIC MỨC CAO Dù Assembly không có phát biểu IF, ELSE, WHILE, REPEAT, UNTIL,FOR,CASE nhưng ta vẫn có thể tổ hợp các lệnh của Assembly để hiện thực cấu trúc logic của ngôn ngữ cấp cao. 34 Chuong 8 : Cau truc DK va Vong lap Cấu trúc IF Đơn giản Phát biểu IF sẽ kiểm tra 1 điều kiện và theo sau đó là 1 số các phát biểu được thực thi khi điều kiện kiểm tra có giá trị true. Cấu trúc logic IF (OP1=OP2) ENDIF HIỆN THỰC BẰNG ASM CMP OP1,OP2 JNE CONTINUE CONTINUE : . 35 Chuong 8 : Cau truc DK va Vong lap Cấu trúc IF với OR Phát biểu IF có kèm toán tử OR Cấu trúc logic IF (A1>OP1) OR (A1>=OP2) OR (A1=OP3) OR (A1<OP4) ENDIF HIỆN THỰC BẰNG ASM CMP A1,OP1 JG EXCUTE CMP A1,OP2 JGE EXCUTE CMP A1,OP3 JE EXCUTE CMP A1,OP4 JL EXCUTE JMP CONTINUE EXCUTE : CONTINUE : .. 36 Chuong 8 : Cau truc DK va Vong lap Cấu trúc IF với AND Phát biểu IF có kèm toán tử AND Cấu trúc logic IF (A1>OP1) AND (A1>=OP2) AND (A1=OP3) AND (A1<OP4) ENDIF HIỆN THỰC BẰNG ASM CMP A1,OP1 JNG CONTINUE CMP A1,OP2 JL CONTINUE CMP A1,OP3 JNE CONTINUE CMP A1,OP4 JNL CONTINUE JMP CONTINUE CONTINUE : .. CHÚ Ý : khi điều kiện có toán tử AND, cách hay nhất là dùng nhảy với điều kiện ngược lại đến nhãn, bỏ qua phát biểu trong cấu trúc Logic. 37 Chuong 8 : Cau truc DK va Vong lap Cấu trúc WHILE VÒNG LẶP WHILE Cấu trúc logic DO WHILE (OP1<OP2) ENDDO HIỆN THỰC BẰNG ASM DO_WHILE : CMP OP1, OP2 JNL ENDDO JMP DO_WHILE ENDDO : .. 38 Chuong 8 : Cau truc DK va Vong lap Cấu trúc WHILE c o ù l o à n g I F VÒNG LẶP WHILE CÓ LỒNG IF Cấu trúc logic DO WHILE (OP1<OP2) IF (OP2=OP3) THEN ENDIF ENDDO HIỆN THỰC BẰNG ASM _WHILE : CMP OP1, OP2 JNL WHILE_EXIT CMP OP2,OP3 ; phần If JNE ELSE ; không thỏa If ; thỏa If JMP ENDIF; thỏa If nên bỏ qua Else ELSE : ENDIF : JMP _WHILE WHILE_EXIT : .. 39 Chuong 8 : Cau truc DK va Vong lap Cấu trúc REPEAT U N TIL VÒNG LẶP REPEAT UNTIL Cấu trúc logic REPEAT UNTIL (OP1=OP2) OR (OP1>OP3) HIỆN THỰC BẰNG ASM REPEAT : TESTOP12: CMP OP1, OP2 JE ENDREPEAT TESTOP13 : CMP OP1, OP3 JNG REPEAT ENDREPEAT : .. Bằng nhau thoát Repeat 40 Chuong 8 : Cau truc DK va Vong lap Cấu trúc CASE Cấu trúc logic CASE INPUT OF ‘A’ : Proc_A ‘B’ : Proc_B ‘C’ : Proc_C ‘D’ : Proc_D End ; HIỆN THỰC BẰNG ASM CASE : MOV AL, INPUT CMP AL, ‘A’ JNE TESTB CALL PROC_A JMP ENDCASE TESTB : CMP AL, ‘B’ JNE TESTC CALL PROC_B JMP ENDCASE TESTC : CMP AL, ‘C’ JNE TESTD CALL PROC_C JMP ENDCASE TESTD : CMP AL, ‘D’ JNE ENDCASE CALL PROC_D ENDCASE : . 41 Chuong 8 : Cau truc DK va Vong lap LooKup Table Rất hiệu quả khi xử lý phát biểu CASE là dùng bảng OFFSET chứa địa chỉ của nhãn hoặc của hàm sẽ nhảy đến tuỳ vào điều kiện. Bảng Offset này được gọi Lookup Table rất hiệu quả khi dùng phát biểu Case có nhiều trị lựa chọn. 42 Chuong 8 : Cau truc DK va Vong lap LooKup Table ; giá trị tìm kiếm Địa chỉ các procedure giả sử ở địa chỉ 0120 giả sử ở địa chỉ 0130 giả sử ở địa chỉ 0140 giả sử ở địa chỉ 0150 Case_table db ‘A’ Dw Proc_A Db ‘B’ Dw Proc_B Db ‘C’ Dw Proc_C Db ‘D’ Dw Proc_D ‘A’ 0120 ‘B’ 0130 ‘C’ 0140 ‘D’ 0150 Cấu trúc lưu trữ của CaseTable như sau 43 Chuong 8 : Cau truc DK va Vong lap LooKup Table Case : MOV AL, INPUT MOV BX, OFFSET CASE_TABLE MOV CX, 4 ; lặp 4 lần số entry của table TEST : CMP AL, [BX] ; kiểm tra Input JNE TESTAGAIN ; không thỏa kiểm tra tiếp CALL WORD PTR [BX+1] ; gọi thủ tục tương ứng JMP ENDCASE TESTAGAIN : ADD BX , 3 ; sang entry sau của CaseTable LOOP TEST ENDCASE : .. 44 Chuong 8 : Cau truc DK va Vong lap Chương trình con Cấu trúc CTC : TênCTC PROC ; các lệnh RET TênCTC ENDP CTC có thể gọi 1 CTC khác hoặc gọi chính nó. CTC được gọi bằng lệnh CALL . CTC gần (near) là chương trình con nằm chung segment với nơi gọi nó. CTC xa (far) là chương trình con không nằm chung segment với nơi gọi nó. 45 Chuong 8 : Cau truc DK va Vong lap Kỹ thuật lập trình Hãy tổ chức chương trình các chương trình con đơn giản hoá cấu trúc luận lý của CT làm cho CT dễ đọc, dễ hiểu , dễ kiểm tra sai sót.. Đầu CTC hãy cất trị thanh ghi vào Stack bằng lệnh PUSH để lưu trạng thái hiện hành. Sau khi hoàn tất công việc của CTC nên phục hồi lại trị các thanh ghi lúc trước đã Push bằng lệnh POP . Nhớ trình tự là ngược nhau để trị của thanh ghi nào trả cho thanh ghi nấy. Đừng tối ưu quá CT vì có thể làm cho CT kém thông minh, khó đọc. 46 Chuong 8 : Cau truc DK va Vong lap Kỹ thuật lập trình (tt) Cố gắng tổ chức chương trình cho tốt phải thiết kế được các bước chương trình sẽ phải thực hiện. Bằng sự tổ hợp của lệnh nhảy ta hoàn toàn có thể mô phỏng cấu trúc điều khiển và vòng lặp. Kinh nghiệm : khi vấn đề càng lớn thì càng phải tổ chức logic chương trình càng chặt chẽ. 47 Chuong 8 : Cau truc DK va Vong lap SUMMARY Có thể mô phỏng cấu trúc logic như ngôn ngữ cấp cao trong Assembly bằng lệnh JMP và LOOP. các lệnh nhảy : có điều kiện và vô điều kiện. Khi gặp lệnh nhảy, CPU sẽ quyết định nhảy hay không bằng cách dựa vào giá trị thanh ghi cờ. các lệnh luận lý dùng để làm điều kiện nhảy là AND, OR, XOR, CMP . . . Bất cứ khi nào có thể, hãy tổ chức chương trình thành các chương trình con đơn giản được cấu trúc luận lý của chương trình. 48 Chuong 8 : Cau truc DK va Vong lap Câu hỏi Giả sử DI = 2000H, [DS:2000] = 0200H. Cho biết địa chỉ ô nhớ toán hạng nguồn và kết quả lưu trong toán hạng đích khi thực hiện lệnh MOV DI, [DI] Giả sử SI = 1500H, DI=2000H, [DS:2000]=0150H . Cho biết địa chỉ ô nhớ toán hạng nguồn và kết quả lưu trong toán hạng đích sau khi thực hiện lệnh ADD AX, [DI] Có khai báo A DB 1,2,3Cho biết trị của toán hạng đích sau khi thi hành lệnh MOV AH, BYTE PTR A. Có khai báo B DB 4,5,6Cho biết trị của toán hạng đích sau khi thi hành lệnh MOV AX, WORD PTR B. 49 Chuong 8 : Cau truc DK va Vong lap Bài 1 : Có vùng nhớ VAR1 dài 200 bytes trong đoạn được chỉ bởi DS. Viết chương trình đếm số chữ ‘S’ trong vùng nhớ này. Bài 2 : Có vùng nhớ VAR2 dài 1000 bytes. Viết chương trình chuyển đổi các chữ thường trong vùng nhớ này thành các ký tự hoa, các ký tự còn lại không đổi. Bài 3 : Viết chương trình nhập 2 số nhỏ hơn 10. In ra tổng của 2 số đó. Bài tập LẬP TRÌNH 50 Chuong 8 : Cau truc DK va Vong lap Bài 4 : Viết chương trình nhập 2 số bất kỳ. In ra tổng và tích của 2 số đó. Chương trình có dạng sau : Nhập số 1 : 12 Nhập số 2 : 28 Tổng là : 40 Tích là : 336 Bài 5 : Viết chương trình nhập 1 ký tự. Hiển thị 5 ký tự kế tiếp trong bộ mã ASCII. Ex : nhập ký tự : a 5 ký tự kế tiếp : b c d e f Bài tập LẬP TRÌNH 51 Chuong 8 : Cau truc DK va Vong lap Bài tập LẬP TRÌNH Bài 7 : Viết chương trình nhập 1 chuổi ký tự. In chuổi đã nhập theo thứ tự ngược. Ex : nhập ký tự : abcdef 5 ký tự kế tiếp : fedcba Bài 6 : Viết chương trình nhập 1 ký tự. Hiển thị 5 ký tự đứng trước trong bộ mã ASCII. Ex : nhập ký tự : f 5 ký tự kế tiếp : a b c d e 52 Chuong 8 : Cau truc DK va Vong lap
File đính kèm:
- bai_giang_cau_truc_may_tinh_chuong_8_cau_truc_dieu_khien_va.ppt