Bài giảng Cấu trúc máy tính - Chương 5: Lập trình hợp ngữ với 8088

Nội dung chương 5
5.1. Mở đầu về lập trình hợp ngữ
5.2. Các cấu trúc lập trình hợp ngữ
5.3. Các lệnh logic, lệnh dịch và lệnh quay
5.4. Ngăn xếp và thủ tục
5.5. Các lệnh nhân, chia
5.6. Các lệnh thao tác chuỗi
5.7. Bài tập
5.1. Mở đầu về lập trình hợp ngữ
1. Các loại ngôn ngữ lập trình
2. Cú pháp của hợp ngữ
3. Dữ liệu của chương trình
4. Khai báo biến
5. Khai báo hằng
6. Cấu trúc chương trình
7. Dịch và chạy chương trình
8. Một số lệnh cơ bản
9. Vào-ra đơn giản
10. Các ví dụ 
pdf 154 trang thiennv 08/11/2022 4520
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 5: Lập trình hợp ngữ với 8088", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_giang_cau_truc_may_tinh_chuong_5_lap_trinh_hop_ngu_voi_8.pdf

Nội dung text: Bài giảng Cấu trúc máy tính - Chương 5: Lập trình hợp ngữ với 8088

  1. 3. Dữ liệu của chương trình . Hợp ngữ cho phép biểu diễn dữ liệu dưới dạng:  Số nhị phân: 1011b, 1011B,  Số thập phân: 35, 35d, 35D,  Số Hexa: 4Ah, 0ABCDh, 0FFFFH,  Kí tự: "A", 'HELLO', "Bach Khoa", . Tất cả các kiểu dữ liệu trên sau đó đều được trình dịch Assembler dịch ra mã nhị phân. . Mỗi kí tự được dịch thành mã ASCII tương ứng  Chương trình không phân biệt 'A' với 41h hay 65 11
  2. Các chỉ thị định nghĩa dữ liệu Chỉ thị Biểu diễn DB Định nghĩa byte DW Định nghĩa word (2 byte) DD Định nghĩa double word (4 byte) DQ Định nghĩa quadword (8 byte liên tiếp) DT Định nghĩa tenbyte (10 byte liên tiếp) 12
  3. 4. Khai báo biến . Biến Byte:  Khai báo: Ten_bien DB Gia_tri_khoi_dau Ten_bien DB ?  Ví dụ: Age DB 25 ; Khởi tạo giá trị ban đầu Age = 25 Alpha DB ? ; Ban đầu Alpha không xác định  Khoảng xác định của biến Byte: . Số không dấu: [0, 255] . Số có dấu: [-128, 127] 13
  4. Khai báo biến (tiếp) . Biến Word:  Khai báo: Ten_bien DW Gia_tri_khoi_dau Test 1111 1011 Ten_bien DW ? 1111 1111 Đ ị a  Ví dụ: c Beta h 34h ỉ t ă Test DW -5 ; -5 = 1111111111111011b n g 12h d ầ Beta DW 1234h ; 1234h = 0001001000110100b n XYZ XYZ DW ? ?  Khoảng xác định của biến Word: . Số không dấu: [0, 65535] . Số có dấu: [-32768, 32767] 14
  5. Khai báo biến (tiếp) . Biến mảng: MangB 10h  Mảng Byte: 20h MangB DB 10h, 20h, 30h, 40h 30h Buffer DB 100 dup (?) 40h  Mảng Word: MangW DW -12, 127, 0A48Bh MangW 1111 0100  Mảng kí tự: 1111 1111 . Thực chất là mảng Byte 0111 1111 . Ví dụ: 2 cách viết sau là tương đương 0000 0000 M DB 'ABC' 1000 1011 M DB 41h, 42h, 43h 1010 0100 15
  6. 5. Khai báo hằng . Cú pháp: Ten_hang EQU Gia_tri . Ví dụ: TenTruong EQU 'BACH KHOA' CR EQU 13 LF EQU 10 ThongBao DB 'DAI HOC', CR, LF, TenTruong DoDaiChuoi EQU $ - offset ThongBao . Hằng không được cấp phát ngăn nhớ 16
  7. 6. Cấu trúc chương trình hợp ngữ . Chương trình mã máy khi được thực thi sẽ chiếm 3 vùng nhớ cơ bản trong bộ nhớ chính:  Vùng nhớ lệnh (Code)  Vùng dữ liệu (Data)  Vùng ngăn xếp (Stack) . Chương trình hợp ngữ cũng được tổ chức tương tự như vậy. . Mã lệnh, dữ liệu và ngăn xếp được cấu trúc như các đoạn chương trình. 17
  8. Các chế độ bộ nhớ . Kích thước của đoạn mã và dữ liệu trong chương trình được chỉ định bằng cách chỉ ra chế độ bộ nhớ nhờ chỉ thị biên dịch .MODEL . Cú pháp: .Model Kieu_bo_nho . Chế độ bộ nhớ thường dùng khi lập trình hợp ngữ là SMALL. 18
  9. Các chế độ bộ nhớ (tiếp) Kiểu Mô tả TINY Mã lệnh và dữ liệu gói gọn trong một đoạn Mã lệnh trong một đoạn SMALL Dữ liệu trong một đoạn Mã lệnh chiếm nhiều hơn một đoạn MEDIUM Dữ liệu trong một đoạn Mã lệnh trong một đoạn COMPACT Dữ liệu chiếm nhiều hơn một đoạn Mã lệnh chiếm nhiều hơn một đoạn LARGE Dữ liệu chiếm nhiều hơn một đoạn Không có mảng nào lớn hơn 64 KB Mã lệnh chiếm nhiều hơn một đoạn HUGE Dữ liệu chiếm nhiều hơn một đoạn Các mảng có thể lớn hơn 64 KB 19
  10. Đoạn dữ liệu (Data Segment) . Đoạn dữ liệu chứa tất cả các khai báo biến. . Các khai báo hằng cũng thường để ở đây. . Để khai báo đoạn dữ liệu ta dùng chỉ thị .DATA . Ví dụ: .Data Bien_1 db 10 Bien_2 dw 0FEDCh TBao db 'Xin chao ban', '$' Nam equ 2006 20
  11. Đoạn ngăn xếp (Stack Segment) . Cú pháp: .STACK Kich_thuoc . Kich_thuoc: là số Byte của Stack (nếu không chỉ định Kich_thuoc thì ngầm định là 1KB) . Ví dụ: .Stack 100h 21
  12. Đoạn mã lệnh (Code Segment) . Đoạn mã lệnh được khai báo với chỉ thị .CODE . Bên trong đoạn mã, các dòng lệnh được tổ chức dưới dạng 1 chương trình chính và các chương trình con (nếu cần). . Ví dụ: .Code Main Proc ; các lệnh của CT chính Main EndP 22
  13. Cấu trúc chương trình thông dụng .Model Small .Stack 100h .Data ; khai báo biến, hằng ở đây .Code Main Proc ; các lệnh của chương trình chính ở đây Main EndP ; các chương trình con khác ở đây End Main 23
  14. 7. Dịch và chạy chương trình . Nếu dùng MASM:  Viết chương trình nguồn, ghi ra file .ASM (chẳng hạn là BAITAP.ASM)  Dịch mã nguồn: MASM BAITAP.ASM . Nếu không có lỗi thì ta có file BAITAP.OBJ . Nếu có lỗi thì xem thông báo lỗi và đến dòng xuất hiện lỗi để sửa  Liên kết: LINK BAITAP.OBJ . Nếu không có lỗi thì ta có file BAITAP.EXE  Nếu mã nguồn viết theo dạng .COM thì cần chuyển từ file .EXE sang dạng COM bằng lệnh: EXE2BIN BAITAP.EXE BAITAP.COM  Thực hiện file BAITAP.EXE (hoặc BAITAP.COM) 24
  15. Dịch và chạy chương trình (tiếp) . Nếu dùng TASM:  Viết chương trình nguồn, ghi ra file .ASM (chẳng hạn là BAITAP.ASM)  Dịch mã nguồn: TASM BAITAP.ASM . Nếu không có lỗi thì ta có file BAITAP.OBJ . Nếu có lỗi thì xem thông báo lỗi và đến dòng xuất hiện lỗi để sửa  Liên kết: . File EXE: TLINK BAITAP.OBJ /X . File COM: TLINK BAITAP.OBJ /T /X  Thực hiện file BAITAP.EXE (hoặc BAITAP.COM) 25
  16. Sử dụng Emulator 8086 . Cho phép:  Viết mã hợp ngữ  Mô phỏng/Debug 26
  17. Khung chương trình EXE .Model Small .Stack 100h .Data ; khai báo biến và hằng ở đây .Code Main Proc mov ax, @Data mov ds, ax ; khởi tạo DS trỏ đến đoạn Data ; mov es, ax ; bỏ dấu ; để khởi tạo ES = DS ; thân chương trình mov ah, 4Ch ; hàm thoát về DOS int 21h Main EndP End Main 27
  18. 8. Một số lệnh cơ bản . Lệnh MOV (Move): MOV đích, nguồn  Copy dữ liệu từ toán hạng nguồn sang toán hạng đích  Kích thước của 2 toán hạng phải giống nhau Ví dụ: Thanh ghi Thanh ghi MOV AX, BX Đích Ngăn nhớ Nguồn chung đoạn MOV AL, 'A' Thanh ghi Có Có Có MOV BH, 120 chung ; MOV DS, 0A000h ; SAI Thanh ghi đoạn Có Có Có MOV AX, 0A000h Ngăn nhớ Có Có Không MOV DS, AX Hằng Có Không Có ; MOV Bien_2, Bien_1; SAI MOV AL, Bien_1 MOV Bien_2, AL 28
  19. Một số lệnh cơ bản (tiếp) . Lệnh XCHG (Exchange): XCHG đích, nguồn  Hoán đổi nội dung 2 toán hạng cho nhau  Kích thước của 2 toán hạng phải giống nhau Ví dụ: Thanh ghi Đích Ngăn nhớ XCHG AX, BX Nguồn chung XCHG AH, Byte_1 Thanh ghi Có Có XCHG Word_1, BX chung Ngăn nhớ Có Không ; XCHG Word_1, Word_2 ; SAI MOV AX, Word_1 MOV BX, Word_2 MOV Word_1, BX MOV Word_2, AX 29
  20. Các lệnh ADD và SUB . Cú pháp: ADD đích, nguồn ; đích  đích + nguồn SUB đích, nguồn ; đích  đích - nguồn Ví dụ: Thanh ghi MOV AX, 50 Đích Ngăn nhớ Nguồn chung MOV BX, 30 Thanh ghi ADD BX, 10 ; BX = 40 Có Có chung SUB AX, BX ; AX = 10 Ngăn nhớ Có Không ; ADD Byte_1, Byte_2 ; SAI MOV AL, Byte_1 Hằng Có Có ADD AL, Byte_2 MOV Byte_1, AL 30
  21. Các lệnh INC, DEC và NEG . Cú pháp: INC đích ; đích  đích + 1 DEC đích ; đích  đích – 1 NEG đích ; đích  - đích (lấy bù 2 của đích) Toán hạng đích là thanh ghi hoặc ngăn nhớ . Ví dụ: MOV AX, 20 ; AX = 20 INC AX ; AX = 21 = 0000000000010101b NEG AX ; AX = 1111111111101011b DEC AX ; AX = FFEAh 31
  22. Bài tập Giả sử A và B là các biến kiểu Word, hãy thực hiện các phép gán sau đây bằng hợp ngữ: 1. A := B 2. A := 10 – A; 3. A := B – A * 2; 32
  23. 9. Vào-ra đơn giản . CPU có thể trao đổi dữ liệu với các thiết bị ngoại qua các cổng vào-ra nhờ các lệnh IN và OUT. . Cách vào-ra đơn giản hơn là dùng các dịch vụ ngắt có sẵn của BIOS hoặc DOS. . Ta thường cần thực hiện các thao tác trao đổi dữ liệu với bàn phím và màn hình dùng hàm DOS. . Lệnh INT (Interrupt): INT N  Là lệnh gọi CTC phục vụ ngắt số hiệu N (N từ 0 ÷ 255)  Dịch vụ ngắt số 21h chứa nhiều hàm tiện ích của DOS. 33
  24. Một số hàm vào-ra của DOS . Khi gọi dịch vụ ngắt của DOS bằng lệnh Int 21h thì AH chứa số hiệu dịch vụ hàm. . Hàm 01h (chờ người sử dụng vào 1 phím)  Vào: . AH = 01h  Ra: . AL = mã ASCII nếu 1 phím kí tự được nhấn = 0 nếu 1 phím điều khiển hay chức năng được nhấn  Ví dụ: MOV AH, 1 INT 21h 34
  25. Một số hàm vào-ra của DOS (tiếp) . Hàm 02h (hiện 1 kí tự hay điều khiển)  Vào: . AH = 02h . DL = mã ASCII của kí tự hiển thị hay điều khiển  Ra: . AL = mã ASCII của kí tự hiển thị hay điều khiển  Ví dụ: MOV AH, 2 MOV DL, 'A' ; viết ra kí tự 'A' INT 21h MOV DL, 10 ; điều khiển con trỏ xuống dòng INT 21h MOV DL, 13 ; điều khiển con trỏ về đầu dòng INT 21h 35
  26. Một số hàm vào-ra của DOS (tiếp) . Hàm 09h (hiện 1 chuỗi kí tự)  Vào: . AH = 09h . DS:DX = địa chỉ của chuỗi kí tự có kí tự kết thúc là '$'  Ra: không  Ví dụ: ThongBao DB 'Chao cac ban$' ; giả sử DS = địa chỉ đoạn của ThongBao MOV AH, 9 LEA DX, ThongBao ; hoặc MOV DX, OFFSET ThongBao INT 21h 36
  27. Lệnh nạp địa chỉ hiệu dụng . Lệnh LEA (Load Effective Address): LEA thanh_ghi_chung, ngan_nho  Lấy địa chỉ offset của ngăn nhớ nạp vào thanh ghi  Ví dụ: LEA DX, Thong_Bao MOV DX, offset Thong_Bao ; lệnh cùng chức năng 37
  28. 10. Các ví dụ . Ví dụ 1: Chương trình "Hello World" bằng hợp ngữ. . Ví dụ 2: Lập trình thực hiện các công việc sau:  Hiển thị thông báo : 'Hãy gõ vào một chữ cái thường: '  Vào chữ cái thường  Xuống dòng, về đầu dòng  Hiển thị thông báo : 'Chữ cái hoa tương ứng là: '  Hiển thị chữ cái hoa tương ứng  Thoát về DOS. 38
  29. Ví dụ 1 .Model Small .Stack 100h .Data TBao db 'Hello World$' ; kết thúc bằng '$' .Code Main Proc mov ax, @Data mov ds, ax ; DS trỏ đến đoạn Data HienTB: mov ah, 9 ; hàm hiện chuỗi lea dx, TBao ; DS:DX chuỗi TBao int 21h ; gọi hàm Thoat: mov ah,4Ch ; hàm thoát về DOS int 21h Main EndP End Main 39
  30. Ví dụ 2 .Model Small mov ah, 2 ; hiện kí tự .Stack 100 mov dl, 10 ; LF .Data int 21h TB1 db 'Hay go vao mot chu cai thuong: $' mov dl, 13 ; CR TB2 db 'Chu cai hoa tuong ung la: $' int 21h .Code mov ah, 9 ; hiện chuỗi Main Proc lea dx, TB2 ; TB2 mov ax, @Data int 21h mov ds, ax ; DS trỏ đến đoạn Data mov ah, 2 ; hiện kí tự mov ah, 9 ; hàm hiển thị chuỗi mov dl, bl lea dx, TB1 ; DS:DX chuỗi TB1 sub dl, 20h ; chữ HOA int 21h int 21h mov ah, 1 ; hàm nhập kí tự mov ah,4Ch ; về DOS int 21h int 21h mov bl, al ; lưu kí tự vào BL Main EndP End Main 40
  31. Bài tập 1 . Dữ liệu của 1 chương trình hợp ngữ được khai báo dưới dạng: DATA SEGMENT mem1 dw 500 mem2 dw -50 vec2 db 10, 20, -10, -20, -30, -40 DATA ENDS . Hãy xác định nội dung của AX (Hexa) sau khi thực hiện đoạn lệnh sau: mov bx, 1 mov ax, SEG vec2 mov es, ax mov ax, es:[bx] a) 01F4 b) 0A14 c) F4FF d) 14F6 e) CE01 41
  32. Bài tập 1 (tiếp) Offset mem1 F4h 0 01h 1 mem2 CEh 2 FFh 3 vec2 0Ah 4 14h 5 F6h 6 ECh 7 E2h 8 D8h 9 42
  33. Bài tập 2 . Dữ liệu của 1 chương trình hợp ngữ được khai báo dưới dạng: DATA SEGMENT mem1 dw 500 mem2 dw -50 vec1 db 1, 2, 3, 4, 8, 7 vec2 db 10, 20, -10, -20, -30, -40 DATA ENDS . Hãy xác định nội dung của CX (Hexa) sau khi thực hiện đoạn lệnh sau: mov bx, OFFSET vec1 mov cx, 3[bx] a) 0304 b) 0408 c) F3F4 d) 0203 e) 0804 43
  34. Bài tập 2 (tiếp) Offset mem1 F4h 0 01h 1 mem2 CEh 2 FFh 3 vec1 01h 4 02h 5 03h 6 04h 7 08h 8 07h 9 vec2 14h A F6h B ECh C E2h D D8h E 44
  35. Bài tập 3 . Lập trình thực hiện các công việc sau:  Hiển thị thông báo : 'Hãy gõ vào một chữ số: '  Vào một chữ số  Xuống dòng, về đầu dòng  Hiển thị thông báo : 'Chữ số bù 9 là: '  Hiển thị chữ số bù 9 tương ứng  Thoát về DOS. 45
  36. Nội dung chương 5 5.1. Mở đầu về lập trình hợp ngữ 5.2. Các cấu trúc lập trình hợp ngữ 5.3. Các lệnh logic, lệnh dịch và lệnh quay 5.4. Ngăn xếp và thủ tục 5.5. Các lệnh nhân, chia 5.6. Các lệnh thao tác chuỗi 5.7. Bài tập 46
  37. 5.2. Các cấu trúc lập trình hợp ngữ 1. Các lệnh liên quan 2. Cấu trúc rẽ nhánh 3. Cấu trúc lặp 47
  38. 1. Các lệnh liên quan . Các cấu trúc lập trình:  Tuần tự  Rẽ nhánh (điều kiện)  Lặp . Các cấu trúc rẽ nhánh và lặp trong hợp ngữ được tạo bằng cách sử dụng các lệnh sau:  Lệnh so sánh CMP  Lệnh nhảy không điều kiện JMP  Các lệnh nhảy có điều kiện  Các câu lệnh lặp 48
  39. Lệnh so sánh CMP . Cú pháp: CMP đích, gốc . Đích và gốc không đồng thời là ngăn nhớ, ngoài ra đích không được là hằng số. . Lệnh CMP sẽ thực hiện trừ thử đích cho gốc (hơi giống lệnh SUB) nhưng không thay đổi giá trị của đích mà chỉ cập nhật thanh ghi cờ. . Theo sau lệnh CMP thường là các lệnh nhảy có điều kiện. 49
  40. Lệnh nhảy không điều kiện JMP . Cú pháp: JMP Target . Chuyển điều khiển không điều kiện đến Target . Target có thể là nhãn lệnh, tên thanh ghi hoặc nội dung ngăn nhớ. . Các dạng của lệnh nhảy:  Nhảy ngắn (short): IP  IP + (giá trị có dấu 8 bit thay cho Target) . JMP SHORT NhanLenh  Nhảy gần (near): IP  IP + (giá trị có dấu 16 bit thay cho Target) . JMP NEAR NhanLenh  Nhảy xa (far): IP  Target_Ofs; CS  Target_Seg . JMP NhanLenh FAR . JMP FAR NhanLenh  Gián tiếp: IP  thanh ghi / bộ nhớ (và CS  thanh ghi / bộ nhớ) . JMP NEAR PTR BX ; IP  BX . JMP WORD PTR [BX] ; IP  [BX] . JMP DWORD PTR [BX] ; IP  [BX] và CS  [BX+2] 50
  41. Các lệnh nhảy có điều kiện . Có nhiều lệnh nhảy có điều kiện với cú pháp chung là: JMPđk NhanLenh . Nhảy trong phạm vi khoảng cách từ -128 ÷ 127 byte. . Các kí hiệu cần nhớ:  J : Jump (nhảy)  N : Not (không )  Z : cờ ZF; C : cờ CF; O : cờ OF; S : cờ SF; P : cờ PF  A : Above (lớn hơn – so sánh số không dấu)  B : Below (nhỏ hơn – so sánh số không dấu)  G : Greater (lớn hơn – so sánh số có dấu)  L : Less (nhỏ hơn – so sánh số có dấu)  E : Equal (bằng) 51
  42. Nhảy hai bước . Các lệnh nhảy có điều kiện có bước nhảy rất ngắn (khoảng cách từ -128 đến 127 byte) . Muốn nhảy đến nhãn lệnh ở xa thì cần thực hiện qua 2 bước:  Bước 1: nhảy đến một nhãn lệnh trung gian ở gần đó.  Bước 2: từ nhãn lệnh trung gian này sử dụng lệnh JMP để nhảy đến nhãn lệnh ở xa. 52
  43. Các lệnh nhảy so sánh số có dấu Ký hiệu Chức năng Điều kiện nhảy Nhảy nếu lớn hơn JG / JNLE ZF=0 và SF=OF Nhảy nếu không nhỏ hơn hoặc bằng Nhảy nếu lớn hơn hoặc bằng JGE / JNL SF=OF Nhảy nếu không nhỏ hơn Nhảy nếu nhỏ hơn JL / JNGE SF OF Nhảy nếu không lớn hơn 53
  44. Các lệnh nhảy so sánh số không dấu Ký hiệu Chức năng Điều kiện nhảy Nhảy nếu lớn hơn JA / JNBE ZF=0 và CF=0 Nhảy nếu không nhỏ hơn hoặc bằng Nhảy nếu lớn hơn hoặc bằng JAE / JNB CF=0 Nhảy nếu không nhỏ hơn Nhảy nếu nhỏ hơn JB / JNAE CF=1 Nhảy nếu không lớn hơn hoặc bằng Nhảy nếu nhỏ hơn hoặc bằng JBE / JNA ZF=1 hoặc CF=1 Nhảy nếu không lớn hơn 54
  45. Các lệnh nhảy điều kiện đơn Ký hiệu Chức năng Điều kiện nhảy Nhảy nếu bằng JE / JZ ZF=1 Nhảy nếu bằng 0 Nhảy nếu không bằng JNE / JNZ ZF=0 Nhảy nếu khác 0 JC Nhảy nếu có nhớ CF=1 JNC Nhảy nếu không có nhớ CF=0 JO Nhảy nếu tràn OF=1 JNO Nhảy nếu không tràn OF=0 JS Nhảy nếu kết quả âm SF=1 JNS Nhảy nếu kết quả không SF=0 JP / JPE Nhảy nếu cờ chẵn PF=1 JNP / JPO Nhảy nếu cờ lẻ PF=0 JCXZ Nhảy nếu thanh ghi CX = 0 CX=0 55
  46. Các câu lệnh lặp . Lệnh LOOP:  Cú pháp: LOOP NhanLenh  Lặp lại các lệnh từ NhanLenh đến hết lệnh LOOP cho đến khi CX = 0  Sau mỗi lần lặp CX tự động giảm 1  NhanLenh cách xa lệnh LOOP không quá -128 byte  Thông thường CX được gán bằng số lần lặp trước khi vào vòng lặp.  Ví dụ: MOV AL, 0 ; gán AL = 0 MOV CX, 16 ; số lần lặp LAP: INC AL ; tăng AL thêm 1 LOOP LAP ; lặp 16 lần, AL = 16 56
  47. Các câu lệnh lặp (tiếp) . Lệnh LOOPE / LOOPZ:  Cú pháp: LOOPE NhanLenh LOOPZ NhanLenh  Lặp lại các lệnh từ NhanLenh đến hết lệnh LOOPE / LOOPZ cho đến khi CX = 0 hoặc ZF = 0  Phạm vi tác dụng và điều kiện CX: giống lệnh LOOP . Lệnh LOOPNE / LOOPNZ:  Cú pháp: LOOPNE NhanLenh LOOPNZ NhanLenh  Lặp lại các lệnh từ NhanLenh đến hết lệnh LOOPNE / LOOPNZ cho đến khi CX = 0 hoặc ZF = 1  Phạm vi tác dụng và điều kiện CX: giống lệnh LOOP 57
  48. Ví dụ 1 . Nhận các kí tự '0' từ bàn phím cho đến khi nhận đủ 20 lần hoặc kí tự nhập vào khác '0'. . Mã lệnh: MOV AH, 1 ; hàm nhập kí tự MOV CX, 20 ; lặp tối đa 20 lần DocKiTu: INT 21h ; nhận 1 kí tự CMP AL, '0' ; so sánh với '0' LOOPZ DocKiTu ; lặp lại DocKiTu 58
  49. Ví dụ 2 . Nhận các kí tự từ bàn phím cho đến khi nhận đủ 20 kí tự hoặc kí tự nhập vào là ENTER. . Mã lệnh: MOV AH, 1 ; hàm nhập kí tự MOV CX, 20 ; lặp tối đa 20 lần DocKiTu: INT 21h ; nhận 1 kí tự CMP AL, 13 ; so sánh với ENTER LOOPNZ DocKiTu ; lặp lại DocKiTu 59
  50. 2. Tạo cấu trúc rẽ nhánh . Các cấu trúc rẽ nhánh thông dụng (giả mã):  IF THEN  IF THEN ELSE  CASE OF : : : Else END 60
  51. a. Cấu trúc IF THEN . IF THEN . Triển khai trong hợp ngữ: CMP ; suy ra từ JMPđksai BoQua ; các lệnh thực hiện BoQua: 61
  52. Ví dụ lệnh IF THEN . Gán BX = giá trị tuyệt đối của AX . Thuật giải: BX := AX If BX < 0 Then BX := -BX EndIf . Mã lệnh: MOV BX, AX CMP BX, 0 JNL BoQua NEG BX BoQua: 62
  53. b. Cấu trúc IF THEN ELSE . IF THEN ELSE . Triển khai trong hợp ngữ: CMP ; suy ra từ JMPđksai Viec2 ; các lệnh thực hiện JMP TiepTuc Viec2: ; các lệnh thực hiện TiepTuc: 63
  54. Ví dụ lệnh IF THEN ELSE . AL và BL đang chứa mã ASCII của 2 kí tự. Hãy hiển thị ra màn hình kí tự có mã ASCII nhỏ hơn. Thuật giải: If AL tới Viec2 Viec 1: MOV DL, AL ; chuyển kí tự trong AL vào DL JMP TiepTuc ; tới TiepTuc Viec2: MOV DL, BL ; chuyển kí tự trong BL vào DL TiepTuc: INT 21h ; hiện kí tự trong DL 64
  55. c. Cấu trúc CASE OF CMP ; suy ra từ = JMPđkđúng Viec_1 CMP ; suy ra từ = JMPđkđúng Viec_2 CMP ; suy ra từ = JMPđkđúng Viec_N ; trường hợp còn lại => thực hiện việc N+1 JMP TiepTuc Viec_1: ; thực hiện việc 1 JMP TiepTuc Viec_2: ; thực hiện việc 2 JMP TiepTuc Viec_N: ; thực hiện việc N TiepTuc: 65
  56. Ví dụ lệnh CASE OF . Kiểm tra nếu AX 0 thì gán BX = 1 Thuậ t giải: Mã lệnh chương trình: Case AX Of CMP AX, 0 ; so sánh AX với 0 tới SoAM =0: BX := 0 JE BangKhong ; AX = 0 => tới BangKhong Else MOV BX, 1 ; TH còn lại, gán BX = 1 BX := 1 JMP TiepTuc ; kết thúc xử lý End SoAm: MOV BX, -1 ; gán BX = -1 JMP TiepTuc ; kết thúc xử lý BangKhong: MOV BX, 0 ; gán BX = 0 TiepTuc: 66
  57. d. Điều kiện chứa AND . If AND Then . Dạng lệnh: CMP ; suy ra từ JMPđksai BoQua CMP ; suy ra từ JMPđksai BoQua ; thực hiện BoQua: 67
  58. Ví dụ . Đọc 1 kí tự, nếu là chữ cái hoa thì hiển thị. Thuật giải: Đọc 1 kí tự (vào AL) If (AL >= ‘A’) AND (AL BoQua CMP AL, ‘Z’ ; so sánh kí tự với ‘Z’ JA BoQua ; kí tự > ‘Z’ => BoQua MOV AH, 2 ; hàm hiện kí tự MOV DL, AL ; DL chứa kí tự cần hiện INT 21h ; hiện kí tự trong DL BoQua: 68
  59. e. Điều kiện chứa OR . If OR Then . Dạng lệnh: CMP ; suy ra từ JMPđkđúng ThucHien CMP ; suy ra từ JMPđkđúng ThucHien JMP BoQua ThucHien: ; thực hiện BoQua: 69