Bài giảng Lập trình Hợp ngữ - Chương 8: Cấu trúc và Vòng lặp

* Nội dung

 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.

 

ppt52 trang | Chia sẻ: hienduc166 | Lượt xem: 496 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình Hợp ngữ - Chương 8: Cấu trúc và Vòng lặp, để xem tài liệu hoàn chỉnh bạn click vào nút TẢI VỀ ở trên
 sát cờ ZF. (nếu bit kiểm là 1 thì ZF sẽ xoá, ngược lại ZF được lập.Công dụng : dùng để khảo sát trị của từng bit hay nhóm bit.Test thực hiện giống lệnh AND nhưng không làm thay đổi toán hạng đích.14Chuong 8 : Cau truc DK va Vong lapMINH HỌA LỆNH TESTMOV AH, 2INT 17hTEST AL , 00100000b ; Test bit 5, nếu bit 5 = 1 máy in hết giấy.Ex : kiểm tra trạng thái máy in. Interrupt 17H trong BIOS sẽ kiểm tra trạng thái máy in, sau khi kiểm tra AL sẽ chứa trạng thái máy in. Khi bit 5 của AL là 1 thì máy in hết giấy.Lệnh TEST cho phép test nhiều bit 1 lượt.15Chuong 8 : Cau truc DK va Vong lapMINH HỌA LỆNH TEST(tt)TEST AL, 1 ; AL chứa số chẳn ?JZ A1 ; nếu đúng nhảy đến A1.Ex :viết đoạn lệnh thực hiện lệnh nhảy đến nhãn A1 nếu AL chứa số chẵn.16Chuong 8 : Cau truc DK va Vong lapLệnh CMPCú pháp : CMP destination , sourceCông dụng : so sánh toán hạng đích với toán hạng nguồn bằng cách lấy toán hạng đích – toán hạng nguồn.Hoạt động : dùng phép trừ nhưng không có toán hạng đích nào bị thay đổi.Các toán hạng của lệnh CMP không thể cùng là các ô nhớ.lệnh CMP giống hệt lệnh SUB trừ việc toán hạng đích không thay đổi.17Chuong 8 : Cau truc DK va Vong lapLỆNH NHẢY CÓ ĐIỀU KIỆN Cú pháp : Jconditional destinationCông dụng : nhờ các lệnh nhảy có điều kiện, ta mới mô phỏng được các phát biểu có cấu trúc của ngôn ngữ cấp cao bằng Assembly. Phạm vi Chỉ nhảy đến nhãn có khoảng cách từ -128 đến +127 byte so với vị trí hiện hành. Dùng các trạng thái cờ để quyết định có nhảy hay không?18Chuong 8 : Cau truc DK va Vong lapLỆNH NHẢY CÓ ĐIỀU KIỆN Hoạt động để thực hiện 1 lệnh nhảy CPU nhìn vào các thanh ghi cờ. nếu điều kiện của lệnh nhảy thỏa, CPU sẽ điều chỉnh IP trỏ đến nhãn đích các lệnh sau nhãn này sẽ được thực hiện.MOV AH, 2MOV CX, 26MOV DL, 41HPRINT_LOOP : INT 21H INC DL DEC CXJNZ PRINT_LOOPMOV AX, 4C00HINT 21H19Chuong 8 : Cau truc DK va Vong lapLỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁN HẠNG KHÔNG DẤU.Thường dùng lệnh CMP Opt1 , Opt2 để xét điều kiện nhảy hoặc dựa trên các cờ.JZNhảy nếu kết quả so sánh = 0JENhảy nếu 2 toán hạng bằng nhauJNZNhảy nếu kết quả so sánh là khác nhau. JNENhảy nếu 2 toán hạng khác nhau.JANhảy nếu Opt1 > Opt2JNBENhảy nếu Opt1 = Opt2JNBNhảy nếu Not (Opt1= Opt2)JCNhảy nếu có CarryJBENhảy nếu Opt1 Opt2)21Chuong 8 : Cau truc DK va Vong lapLỆNH NHẢY DỰA TRÊN KẾT QUẢ SO SÁNH CÁC TOÁN HẠNG CÓ DẤU .JGNhảy nếu Opt1>Opt2JNLENhảy nếu Not(Opt1 =Opt2JNLNhảy nếu Not (Opt1 = Opt2)JLENhảy nếu Opt1 Opt2)22Chuong 8 : Cau truc DK va Vong lapLỆNH NHẢY DỰA TRÊN CÁC CỜ .JCXZNhảy nếu CX=0JSNhảy nếu SF=1JNSNhảy nếu SF =0JONhảy nếu đã tràn trịJLNhảy nếu Opt1 = Opt2)JLENhảy nếu Opt1 =BX then ; nhảy đến QUIT ; ngược lại chép BX vào DX MOV DX, AXCMP DX, BXJAE QUITMOV DX, BXQUIT : MOV AH,4CH INT 21H 24Chuong 8 : Cau truc DK va Vong lapCÁC VÍ DỤ MINH HỌA LỆNH NHẢY CÓ ĐKEx1 : tìm số nhỏ nhất trong 3 số chứa trong thanh ghi ALø BL và CL . Kết quả để trong biến SMALLMOV SMALL, ALCMP SMALL, BLJBE L1MOV SMALL, BLL1 : CMP SMALL, CL JBE L2MOV SMALL, CLL2 : . . .; giả sử AL nhỏ nhất; nếu SMALL ENDIF HIỆN THỰC BẰNG ASMCMP OP1,OP2JNE CONTINUE CONTINUE : .35Chuong 8 : Cau truc DK va Vong lapCấu trúc IFvới ORPhát biểu IF có kèm toán tử ORCấu trúc logicIF (A1>OP1) OR(A1>=OP2) OR(A1=OP3) OR(A1ENDIF HIỆN THỰC BẰNG ASMCMP A1,OP1JG EXCUTECMP A1,OP2JGE EXCUTECMP A1,OP3JE EXCUTECMP A1,OP4JL EXCUTEJMP CONTINUEEXCUTE : CONTINUE : ..36Chuong 8 : Cau truc DK va Vong lapCấu trúc IFvới ANDPhát biểu IF có kèm toán tử ANDCấu trúc logicIF (A1>OP1) AND(A1>=OP2) AND(A1=OP3) AND(A1ENDIF HIỆN THỰC BẰNG ASMCMP A1,OP1JNG CONTINUECMP A1,OP2JL CONTINUECMP A1,OP3JNE CONTINUECMP A1,OP4JNL CONTINUEJMP CONTINUECONTINUE : ..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. 37Chuong 8 : Cau truc DK va Vong lapCấu trúc WHILEVÒNG LẶP WHILECấu trúc logicDO WHILE (OP1ENDDO HIỆN THỰC BẰNG ASMDO_WHILE : CMP OP1, OP2 JNL ENDDO JMP DO_WHILE ENDDO : ..38Chuong 8 : Cau truc DK va Vong lapCấu trúc WHILE có lồng IFVÒNG LẶP WHILE CÓ LỒNG IFCấu trúc logicDO WHILE (OP1IF (OP2=OP3) THENENDIFENDDO 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 ElseELSE : ENDIF : JMP _WHILE WHILE_EXIT : ..39Chuong 8 : Cau truc DK va Vong lapCấu trúc REPEAT UNTILVÒNG LẶP REPEAT UNTILCấu trúc logicREPEAT UNTIL (OP1=OP2) OR(OP1>OP3) HIỆN THỰC BẰNG ASMREPEAT : TESTOP12:CMP OP1, OP2JE ENDREPEATTESTOP13 :CMP OP1, OP3JNG REPEATENDREPEAT : ..Bằng nhauthoát Repeat40Chuong 8 : Cau truc DK va Vong lapCấu trúc CASECấu trúc logic CASE INPUT OF ‘A’ : Proc_A ‘B’ : Proc_B ‘C’ : Proc_C ‘D’ : Proc_DEnd ; HIỆN THỰC BẰNG ASMCASE : MOV AL, INPUTCMP AL, ‘A’JNE TESTBCALL PROC_AJMP ENDCASETESTB : CMP AL, ‘B’ JNE TESTCCALL PROC_BJMP ENDCASETESTC : CMP AL, ‘C’JNE TESTDCALL PROC_CJMP ENDCASETESTD : CMP AL, ‘D’JNE ENDCASECALL PROC_DENDCASE : . 41Chuong 8 : Cau truc DK va Vong lapLooKup TableRấ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. 42Chuong 8 : Cau truc DK va Vong lapLooKup Table; giá trị tìm kiếmĐịa chỉ các procedure giả sử ở địa chỉ 0120giả sử ở địa chỉ 0130giả sử ở địa chỉ 0140giả sử ở địa chỉ 0150Case_table db ‘A’Dw Proc_ADb ‘B’Dw Proc_BDb ‘C’Dw Proc_CDb ‘D’Dw Proc_D‘A’0120‘B’0130‘C’0140‘D’0150Cấu trúc lưu trữ của CaseTable như sau 43Chuong 8 : Cau truc DK va Vong lapLooKup TableCase :MOV AL, INPUTMOV BX, OFFSET CASE_TABLEMOV CX, 4 ; lặp 4 lần số entry của tableTEST : CMP AL, [BX] ; kiểm tra Input JNE TESTAGAIN ; không thỏa kiểm tra tiếpCALL WORD PTR [BX+1] ; gọi thủ tục tương ứngJMP ENDCASETESTAGAIN : ADD BX , 3 ; sang entry sau của CaseTableLOOP TESTENDCASE : ..44Chuong 8 : Cau truc DK va Vong lapChương trình conCấu trúc CTC :TênCTC PROC ; các lệnh RETTênCTC ENDPCTC 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ó.45Chuong 8 : Cau truc DK va Vong lapKỹ 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.46Chuong 8 : Cau truc DK va Vong lapKỹ 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ẽ.47Chuong 8 : Cau truc DK va Vong lapSUMMARY 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.48Chuong 8 : Cau truc DK va Vong lapCâu hỏiGiả 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.49Chuong 8 : Cau truc DK va Vong lapBà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ÌNH50Chuong 8 : Cau truc DK va Vong lapBà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 : 28Tổng là : 40Tích là : 336Bà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 fBài tập LẬP TRÌNH51Chuong 8 : Cau truc DK va Vong lapBài tập LẬP TRÌNHBà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 : fedcbaBà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 52Chuong 8 : Cau truc DK va Vong lap

File đính kèm:

  • pptChuong_08_Cau_truc_DK_&_Loops.ppt