Bài giảng Kỹ thuật vi xử lý - Chương 4: Lập trình hợp ngữ với 8088 - Dư Thanh Bình

ppt 147 trang huongle 6860
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật vi xử lý - Chương 4: Lập trình hợp ngữ với 8088 - Dư Thanh Bình", để 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:

  • pptbai_giang_ky_thuat_vi_xu_ly_chuong_4_lap_trinh_hop_ngu_voi_8.ppt

Nội dung text: Bài giảng Kỹ thuật vi xử lý - Chương 4: Lập trình hợp ngữ với 8088 - Dư Thanh Bình

  1. KỸ THUẬT VI XỬ LÝ Microprocessors Dư Thanh Bình Bộ môn KTMT - Khoa CNTT Trường ĐH Bách Khoa Hà Nội
  2. Lưu ý của tác giả § Không được tự ý sao chép hay quảng bá bài giảng này nếu chưa được sự đồng ý của tác giả. § Địa chỉ liên hệ của tác giả: Dư Thanh Bình Bộ môn Kỹ thuật Máy tính Viện Công nghệ Thông tin và Truyền thông Trường Đại học Bách Khoa Hà Nội Tel: 8696125 – Mobile: 0979859568 Email: binhdt@it-hut.edu.vn Copyright (c) 1/2007 by DTB 2
  3. Nội dung của môn học § Chương 1: Máy tính và hệ vi xử lý § Chương 2: Biểu diễn thông tin trong máy tính § Chương 3: Bộ vi xử lý Intel 8088 § Chương 4: Lập trình hợp ngữ với 8088 § Chương 5: Nối ghép 8088 với bộ nhớ § Chương 6: Nối ghép 8088 với hệ thống vào-ra Copyright (c) 1/2007 by DTB 3
  4. Kỹ thuật Vi xử lý Chương 4 LẬP TRÌNH HỢP NGỮ VỚI 8088 Dư Thanh Bình Bộ môn Kỹ thuật Máy tính Viện Công nghệ Thông tin và Truyền thông Trường Đại học Bách Khoa Hà Nội Copyright (c) 1/2007 by DTB 4
  5. Nội dung chương 4 4.1. Mở đầu về lập trình hợp ngữ 4.2. Các cấu trúc lập trình với hợp ngữ 4.3. Các lệnh logic, lệnh dịch và lệnh quay 4.4. Ngăn xếp và thủ tục 4.5. Các lệnh nhân, chia 4.6. Các lệnh thao tác chuỗi 4.7. Một số ví dụ Copyright (c) 1/2007 by DTB 5
  6. 4.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. Một số lệnh cơ bản 7. Cấu trúc chương trình 8. Chương trình EXE và COM 9. Vào-ra đơn giản 10. Các ví dụ 11. Dịch và chạy chương trình Copyright (c) 1/2007 by DTB 6
  7. 1. Các loại ngôn ngữ lập trình § Ngôn ngữ máy: › Chỉ được biểu diễn bằng số nhị phân. › Bộ vi xử lý chỉ hiểu được các chương trình mã máy. › Con người rất khó khăn để tạo lập hay đọc hiểu chương trình ngôn ngữ máy. § Hợp ngữ (Assembly Language): › Là ngôn ngữ lập trình bậc thấp (gần ngôn ngữ máy nhất). › Được xây dựng trên cơ sở ký hiệu tập lệnh của bộ vi xử lý tương ứng. › Phụ thuộc hoàn toàn vào bộ vi xử lý cụ thể. § Ngôn ngữ lập trình bậc cao: › Gần với ngôn ngữ tự nhiên hơn. › Được xây dựng độc lập với cấu trúc của máy tính. Copyright (c) 1/2007 by DTB 7
  8. Lập trình với hợp ngữ § Ưu điểm: › Can thiệp sâu vào cấu trúc hệ thống. › Hiểu sâu hơn về hệ thống. › Chương trình mã máy tương ứng sẽ ngắn hơn, thường nhanh hơn và tốn ít bộ nhớ hơn. § Nhược điểm: › Khó học vì gần với mã máy. › Chương trình nguồn dài, không thích hợp để xây dựng những chương trình lớn. Kết hợp ngôn ngữ lập trình bậc cao với hợp ngữ. Copyright (c) 1/2007 by DTB 8
  9. Chương trình dịch hợp ngữ § Được gọi là ASSEMBLER § Một số chương trình dịch hợp ngữ cho IBM-PC: › MASM – Microsoft Marco Assembler: § Các tệp: MASM.EXE, LINK.EXE, EXE2BIN.EXE › TASM – Turbo Assembler: § Các tệp: TASM.EXE, TLINK.EXE Copyright (c) 1/2007 by DTB 9
  10. Các bước lập trình § Bước 1: Phát biểu bài toán § Bước 2: Xây dựng thuật giải § Bước 3: Viết mã chương trình § Bước 4: Dịch và sửa lỗi cú pháp § Bước 5: Chạy thử và hiệu chỉnh chương trình Copyright (c) 1/2007 by DTB 10
  11. Các cấu trúc lập trình cơ bản § Cấu trúc tuần tự § Cấu trúc rẽ nhánh § Cấu trúc lặp Copyright (c) 1/2007 by DTB 11
  12. 2. Cú pháp của hợp ngữ § Chương trình hợp ngữ gồm các dòng lệnh, mỗi lệnh viết trên một dòng, mỗi dòng có thể là: › Lệnh của bộ vi xử lý (instruction) › Chỉ dẫn của chương trình dịch ASSEMBLER § Các lệnh hợp ngữ không phân biệt chữ hoa, chữ thường. § Khi dịch thành mã máy thì chỉ có các lệnh của bộ vi xử lý mới được dịch. § Cấu trúc của một dòng lệnh : Tên Thao tác Toán hạng Chú thích ( Name Operation Operand Comment ) § Giữa các trường phải có ít nhất một dấu cách (hoặc TAB) § Ví dụ: MAIN PROC BAT_DAU:MOV CX, 50 ; khoi tao bo dem Copyright (c) 1/2007 by DTB 12
  13. Ý nghĩa các trường trong lệnh § Trường tên: › Sử dụng cho: nhãn lệnh, tên thủ tục, tên biến › Quy ước đặt tên: dài từ 1 đến 31 ký tự, cho phép sử dụng: § Chữ cái (không phân biệt chữ hoa và chữ thường) § Chữ số (không được dùng làm ký tự đầu tiên) § Các ký tự khác: ?, @, $, %, . (dấu . chỉ được dùng khi nó là ký tự đầu tiên). Copyright (c) 1/2007 by DTB 13
  14. Ý nghĩa các trường trong lệnh (tiếp) § Trường thao tác: › Nếu là lệnh của vi xử lý thì đó chính là mã lệnh (MOV, CALL, ADD, ). › Nếu là chỉ dẫn thì đó là lệnh giả của chương trình dịch (Pseudo-op). Copyright (c) 1/2007 by DTB 14
  15. Ý nghĩa các trường trong lệnh (tiếp) § Trường toán hạng: › Đối với lệnh thì toán hạng xác định dữ liệu bị tác động bởi mã lệnh. › Một lệnh có thể có 0, 1, 2 toán hạng. › Ví dụ: § MOV CX,5 ; 2 toán hạng § INC AX ; 1 toán hạng § NOP ; 0 toán hạng › Đối với lệnh giả thì toán hạng cho thêm thông tin cho lệnh giả đó. § Trường chú thích: › Bắt đầu bằng dấu ";" theo sau đó là lời giải thích. Copyright (c) 1/2007 by DTB 15
  16. 3. Dữ liệu của chương trình § Hợp ngữ cho phép biểu diễn 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 Copyright (c) 1/2007 by DTB 16
  17. Các chỉ thị giả định số liệu Chỉ thị giả 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) Copyright (c) 1/2007 by DTB 17
  18. 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] Copyright (c) 1/2007 by DTB 18
  19. Khai báo biến (tiếp) § Biến Word: › Khai báo: Ten_bien DW Gia_tri_khoi_dau Ten_bien DW ? › Ví dụ: Test DW -5 ; -5 = 1111111111111011b Beta DW 1234h ; 1234h = 0001001000110100b 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] Copyright (c) 1/2007 by DTB 19
  20. Khai báo biến (tiếp) § Biến mảng: › Mảng Byte: MangB DB 10h, 20h, 30h, 40h Buffer DB 100 dup (?) › Mảng Word: MangW DW -12, 127, 0A48Bh › Mảng kí tự: § Thực chất là mảng Byte § Ví dụ: 2 cách viết sau là tương đương M DB 'ABC' M DB 41h, 42h, 43h Copyright (c) 1/2007 by DTB 20
  21. 5. Khai báo hằng § Cú pháp: Ten_hangEQU 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ớ Copyright (c) 1/2007 by DTB 21
  22. 6. 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ụ: MOV AX, BX MOV AL, 'A' MOV BH, 120 ; MOV DS, 0A000h ; SAI MOV AX, 0A000h MOV DS, AX ; MOV Bien_2, Bien_1; SAI MOV AL, Bien_1 MOV Bien_2, AL Copyright (c) 1/2007 by DTB 22
  23. 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ụ: XCHG AX, BX XCHG AH, Byte_1 XCHG Word_1, BX ; XCHG Word_1, Word_2 ; SAI MOV AX, Word_1 MOV BX, Word_2 ; xchg ax,word_2 ;word2=word1, ax=word2 MOV Word_1, BX ; mov word_1,ax ;word1=word2, ax MOV Word_2, AX Copyright (c) 1/2007 by DTB 23
  24. 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ụ: MOV AX, 50 ;AX:=50 MOV BX, 30 ; BX:=30 ADD BX, 10 ; BX = 40 SUB AX, BX ; AX = 10 ; ADD Byte_1, Byte_2 ; SAI ;MOV AL, Byte_1 MOV AL, Byte_2 ADD Byte_1, AL Copyright (c) 1/2007 by DTB 24
  25. 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 Copyright (c) 1/2007 by DTB 25
  26. 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; Copyright (c) 1/2007 by DTB 26
  27. 7. Cấu trúc chương trình § 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. Copyright (c) 1/2007 by DTB 27
  28. 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. Copyright (c) 1/2007 by DTB 28
  29. Các chế độ bộ nhớ (tiếp) Copyright (c) 1/2007 by DTB 29
  30. Đ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 Copyright (c) 1/2007 by DTB 30
  31. Đ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 Copyright (c) 1/2007 by DTB 31
  32. Đ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 Copyright (c) 1/2007 by DTB 32
  33. 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 Copyright (c) 1/2007 by DTB 33
  34. Cách định nghĩa đoạn khác § Chỉ thị định nghĩa đoạn: Name SEGMENT [align] [combine] ['class'] Name ENDS › Name : tên đoạn › align: chỉ ra biên của đoạn bắt đầu từ địa chỉ nào (byte : bất kỳ, word : chẵn, para : chia hết cho 16 – ngầm định, page : chia hết cho 256) › combine: chỉ ra đoạn này được kết hợp với đoạn khác có cùng tên như thế nào (public: nối với nhau, common: đè lên nhau, stack: dành cho đoạn Stack) › 'class': là 1 tên được đặt trong cặp dấu ' ' => ảnh hưởng đến thứ tự sắp xếp các đoạn trong bộ nhớ. Các segment cùng tên 'class' được sắp xếp liên tiếp nhau, các segment khác tên 'class được sắp theo thứ tự trình LINK gặp khi liên kết. Copyright (c) 1/2007 by DTB 34
  35. Cách định nghĩa đoạn khác (tiếp) § Chỉ thị chỉ định các thanh ghi đoạn: ASSUME SegReg : SegName [, SegReg : SegName] › SegReg : tên thanh ghi đoạn (CS, DS, SS, ES) › SegName: tên của đoạn (được đ/n bởi SEGMENT) › VD: ASSUME CS:Code, DS:Data § Chỉ thị thiết lập bộ đếm định vị: ORG expression › expression là số 2 Byte Copyright (c) 1/2007 by DTB 35
  36. Ví dụ về định nghĩa đoạn Data Segment para public Mang1 DW 100 dup (?) ORG 0 Mang2 DW 50 dup (?) Mang3 DW 50 dup (?) Data EndS Code Segment byte public Assume CS:Code, DS:Data Code EndS Copyright (c) 1/2007 by DTB 36
  37. 8. Chương trình EXE và COM § Có 2 loại chương trình mã máy có thể thực thi được trong DOS, đó là chương trình .EXE và .COM › Chương trình EXE: § Ở đầu file chương trình có 1 vùng thông tin gọi là Header § Khi thực thi, CS, DS và SS trỏ đến 3 phân đoạn khác nhau › Chương trình COM: § File chương trình có kích thước nhỏ gọn (< 64KB), chứa cả mã lệnh và dữ liệu § Khi thực thi, CS, DS và SS trỏ đến cùng 1 phân đoạn § DOS sẽ chọn 1 địa chỉ phân đoạn gọi là PSP (Program Segment Prefix) làm địa chỉ cơ sở để tải chương trình. § PSP thường có kích thước là 256 Byte (=100h), chứa các thông tin liên quan đến chương trình được thực thi. Copyright (c) 1/2007 by DTB 37
  38. Thực thi chương trình EXE § Nội dung file EXE được tải vào bộ nhớ bắt đầu từ địa chỉ PSP:0100h. § Sau đó các địa chỉ phân đoạn được tái định vị nhờ các thông tin được đọc từ Header nằm ở đầu file EXE. § Sau khi chương trình EXE lấy quyền điều khiển: › DS và ES trỏ đến PSP (chứ không phải đoạn dữ liệu) => Trong chương trình hợp ngữ ta cần thay đổi DS (và ES) để trỏ đến đúng đoạn dữ liệu. › CS, IP, SS và SP được đặt theo những giá trị chỉ ra trong EXE Header. Copyright (c) 1/2007 by DTB 38
  39. Khung chương trình EXE .ModelSmall .Stack100h .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 Copyright (c) 1/2007 by DTB 39
  40. Thực thi chương trình COM § Nội dung file COM được tải vào bộ nhớ bắt đầu từ địa chỉ PSP:0100h. § Sau khi file .COM được nạp vào bộ nhớ: › CS, DS, ES và SS được đặt cùng giá trị với PSP › SP trỏ đến cuối đoạn PSP (thường thì SP = 0FFFEh) › IP được đặt là 100h Copyright (c) 1/2007 by DTB 40
  41. Khung chương trình COM .ModelTiny .Code Org 100h Start: jmp Continue ; khai báo dữ liệu ở đây Continue: Main Proc ; thân chương trình int 20h ; Về DOS Main EndP End Start Copyright (c) 1/2007 by DTB 41
  42. 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. Copyright (c) 1/2007 by DTB 42
  43. 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 Copyright (c) 1/2007 by DTB 43
  44. 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 Copyright (c) 1/2007 by DTB 44
  45. 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 Copyright (c) 1/2007 by DTB 45
  46. 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 Copyright (c) 1/2007 by DTB 46
  47. 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. Copyright (c) 1/2007 by DTB 47
  48. 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 Copyright (c) 1/2007 by DTB 48
  49. Ví dụ 2 Copyright (c) 1/2007 by DTB 49
  50. 11. 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) Copyright (c) 1/2007 by DTB 50
  51. 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) Copyright (c) 1/2007 by DTB 51
  52. Nội dung file TEXE.BAT @echo off if not "A%1"=="A" goto ok echo Syntax: TEXE Filename goto End :OK if not exist %1.asm goto End echo NPB's Assembly Compiler echo Compiling : %1.asm tasm %1.asm if not exist %1.obj goto End tlink %1.obj /x if not ErrorLevel 0 goto End del %1.obj :End Copyright (c) 1/2007 by DTB 52
  53. Sử dụng file TEXE.BAT § File TEXE.BAT chứa các lệnh gọi 2 file TASM.EXE và TLINK.EXE để dịch 1 chương trình .ASM ra dạng file .EXE § Giả sử ta có file chương trình BAITAP.ASM § Gõ lệnh sau: TEXE BAITAP (Chú ý: không gõ "BAITAP.ASM") § Nếu chương trình viết không có lỗi thì ta sẽ có file BAITAP.EXE Copyright (c) 1/2007 by DTB 53
  54. 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 Copyright (c) 1/2007 by DTB 54
  55. Bài tập 1 (tiếp) Copyright (c) 1/2007 by DTB 55
  56. 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 Copyright (c) 1/2007 by DTB 56
  57. Bài tập 2 (tiếp) Copyright (c) 1/2007 by DTB 57
  58. Nội dung chương 4 4.1. Mở đầu về lập trình hợp ngữ 4.2. Các cấu trúc lập trình với hợp ngữ 4.3. Các lệnh logic, lệnh dịch và lệnh quay 4.4. Ngăn xếp và thủ tục 4.5. Các lệnh nhân, chia 4.6. Các lệnh thao tác chuỗi 4.7. Một số ví dụ Copyright (c) 1/2007 by DTB 58
  59. 4.2. Các cấu trúc lập trình với hợp ngữ 1. Các lệnh liên quan 2. Cấu trúc điều kiện 3. Cấu trúc lặp Copyright (c) 1/2007 by DTB 59
  60. 1. Các lệnh liên quan § Các cấu trúc lập trình: › Tuần tự › Điều kiện › Lặp § Các cấu trúc điều kiện và lặp trong hợp ngữ được tạo bởi phần lớn là 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 Copyright (c) 1/2007 by DTB 60
  61. 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. Copyright (c) 1/2007 by DTB 61
  62. 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 § NhanLenh LABEL 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] Copyright (c) 1/2007 by DTB 62
  63. 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 (lớn hơn – so sánh số có dấu) › E : Equal (bằng) Copyright (c) 1/2007 by DTB 63
  64. 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. Copyright (c) 1/2007 by DTB 64
  65. Các lệnh nhảy so sánh số có dấu Copyright (c) 1/2007 by DTB 65
  66. Các lệnh nhảy so sánh số không dấu Copyright (c) 1/2007 by DTB 66
  67. Các lệnh nhảy điều kiện đơn Copyright (c) 1/2007 by DTB 67
  68. 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 Copyright (c) 1/2007 by DTB 68
  69. 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 Copyright (c) 1/2007 by DTB 69
  70. 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 Copyright (c) 1/2007 by DTB 70
  71. 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 Copyright (c) 1/2007 by DTB 71
  72. 2. Cấu trúc điều kiện § Các cấu trúc điều kiện thông dụng: › IF THEN › IF THEN ELSE › CASE OF : : : Else END Copyright (c) 1/2007 by DTB 72
  73. a. Cấu trúc IF THEN § IF THEN § Dạng lệnh: CMP Des,Source ; đúng? Jđksai BoQua ; các lệnh thực hiện BoQua: Copyright (c) 1/2007 by DTB 73
  74. 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 ; bx<0? JNL BoQua NEG BX BoQua: Copyright (c) 1/2007 by DTB 74
  75. b. Cấu trúc IF THEN ELSE § IF THEN ELSE § Dạng lệnh: CMP Des,Source ; đúng? JMPđksai Viec2 ; các lệnh thực hiện JMP TiepTuc Viec2: ; các lệnh thực hiện TiepTuc: Copyright (c) 1/2007 by DTB 75
  76. 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. Copyright (c) 1/2007 by DTB 76
  77. c. Cấu trúc CASE OF CMP ; d/k1 dung? JMPđkđúng Viec_1 CMP ; d/k2 dung? 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: Copyright (c) 1/2007 by DTB 77
  78. Ví dụ lệnh CASE OF § Kiểm tra nếu AX 0 thì gán BX = 1 Copyright (c) 1/2007 by DTB 78
  79. 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: Copyright (c) 1/2007 by DTB 79
  80. Ví dụ § Đọc 1 kí tự, nếu là chữ cái hoa thì hiển thị. Copyright (c) 1/2007 by DTB 80
  81. e. Điều kiện chứa OR § If OR Then BoQua: 81 Copyright (c) 1/2007 by DTB
  82. Ví dụ § Đọc 1 kí tự, nếu là 'y' hoặc 'Y' thì hiển thị lại, nếu không phải thì thoát chương trình. Copyright (c) 1/2007 by DTB 82
  83. Ví dụ (tiếp) Copyright (c) 1/2007 by DTB 83
  84. 3. Cấu trúc lặp § Các cấu trúc lặp thông dụng: › FOR DO › REPEAT UNTIL › WHILE DO Copyright (c) 1/2007 by DTB 84
  85. a. Lệnh lặp FOR § FOR DO § Dạng lệnh: MOV DEM,0 ; khoi tao bo dem NHAN: ; cong viec INC DEM CMP dem,N JNE NHAN Copyright (c) 1/2007 by DTB 85
  86. MOV DEM,N NHAN: ;cong viec DEC DEM JNZ NHAN . MOV CX,N NHAN: ;cong viec LOOP NHANCopyright (c) 1/2007 by DTB 86
  87. Ví dụ § Hiển thị ra màn hình 80 dấu '*' § Mã lệnh: MOV CX, 80 ; số kí tự cần hiện MOV AH, 2 ; hàm hiện kí tự MOV DL, '*' ; kí tự cần hiện là * HienSao: INT 21h ; hiện kí tự LOOP HienSao ; lặp lại 80 lần Copyright (c) 1/2007 by DTB 87
  88. b. Lệnh lặp REPEAT UNTIL § REPEAT UNTIL § Dạng lệnh: VongLap: ; thân vòng lặp CMP des,source ; đ/k đúng? JMPđksai VongLap Copyright (c) 1/2007 by DTB 88
  89. Ví dụ 1 § Đọc vào các kí tự, cất vào xâu X1 cho đến khi gặp ENTER ( xâu X1 có 80 phần tử) § Mã lệnh: xor di,di ; X1[di] la phan tu dau xau xor cx,cx ; cx bien dem MOV AH, 1 ; hàm đọc kí tự int 21h DocKiTu: mov X1[di],al ; cat ky tu vao X1 inc di inc cx INT 21hCopyright (c) 1/2007; byđọc DTB 1 kí tự vào AL 89 CMP AL, 13 ; kí tự là ENTER ? JNE DocKiTu ; sai => lặp tiếp
  90. Ví dụ 2 – FOR lồng với FOR § Hiển thị ra 5 dòng, mỗi dòng gồm 50 dấu '*' § Mã lệnh: MOV BL, 5 ; số dòng cần hiện HienDong: MOV CX, 50 ; hiện 50 dấu * trên 1 dòng MOV AH, 2 ; hàm hiện kí tự MOV DL, '*' ; DL = kí tự cần hiện VietSao: INT 21h ; gọi hàm hiện kí tự trong DL LOOP VietSao ; lặp lại cho đến khi đủ 50 '*' MOV DL, 10 ; xuống dòng INT 21h MOV DL, 13 ; về đầu dòng INT 21h DEC BL ; giảm số dòng cần phải hiện tiếp JNZ HienDong ; chưa hết 5 dòng => quay lại Copyright (c) 1/2007 by DTB 90
  91. c. Lệnh lặp WHILE DO § WHILE DO § Dạng lệnh: VongLapw: CMP ; đúng? JMPđksai DungLap ; sai thì dừng ; thực hiện JMP VongLapw ; lặp lại DungLap: Copyright (c) 1/2007 by DTB 91
  92. Ví dụ § Nhập 1 dòng kết thúc bằng ENTER. Đếm số kí tự đã được nhập. § Mã lệnh: xor di,di xor CX,CX ; khởi tạo bộ đếm = 0 MOV AH,1 ; hàm đọc kí tự INT 21h ; đọc 1 kí tự vào AL DocKiTu: CMP AL,13 ; kí tự đó khác ENTER ? JE DungLap ; đúng => DungLap mov X1[di],al INC CX ; sai => tăng bộ đếm lên 1 INT 21h ; đọc 1 kí tự vào AL JMP DocKiTu ; lặp lại DungLap: Copyright (c) 1/2007 by DTB 92
  93. Nội dung chương 4 4.1. Mở đầu về lập trình hợp ngữ 4.2. Các cấu trúc lập trình với hợp ngữ 4.3. Các lệnh logic, lệnh dịch và lệnh quay 4.4. Ngăn xếp và thủ tục 4.5. Các lệnh nhân, chia 4.6. Các lệnh thao tác chuỗi 4.7. Một số ví dụ Copyright (c) 1/2007 by DTB 93
  94. 4.3. Các lệnh logic, dịch và quay 1. Các lệnh logic 2. Các lệnh dịch 3. Các lệnh quay 4. Vào-ra số nhị phân và Hexa Copyright (c) 1/2007 by DTB 94
  95. 1. Các lệnh logic § Các phép toán logic: § Các lệnh logic: AND, OR, XOR, NOT, TEST Copyright (c) 1/2007 by DTB 95
  96. Các lệnh AND, OR và XOR § Cú pháp: › AND đích, nguồn ; đích  đích AND nguồn › OR đích, nguồn ; đích  đích OR nguồn › XOR đích, nguồn ; đích  đích XOR nguồn › TEST đích, nguồn ; Phép AND nhưng không thay đổi đích § Chú ý: › Toán hạng nguồn: hằng số, thanh ghi hay ngăn nhớ › Toán hạng đích: thanh ghi hay ngăn nhớ › Hai toán hạng không được đồng thời là ngăn nhớ § Ảnh hưởng tới các cờ: › SF, ZF, PF phản ánh kết quả của lệnh › AF không xác định › CF = OF = 0 Copyright (c) 1/2007 by DTB 96
  97. Các ví dụ § VD 1: Đổi mã ASCII của 1 chữ số thành số tương ứng. › Giả sử AL chứa kí tự (chẳng hạn '5' – mã ASCII là 35h) › Cần chuyển AL về giá trị chữ số (là 5) › Thực hiện: SUB AL, 30h hoặc AND AL, 0Fh § VD 2: Đổi chữ thường thành chữ hoa. › Giả sử DL chứa kí tự chữ thường, cần chuyển về chữ hoa. › Thực hiện: SUB DL, 20h hoặc AND DL, 0DFh § VD 3: Xóa thanh ghi AX về 0. › Thực hiện: XOR AX, AX § VD 4: Kiểm tra xem AX có bằng 0 hay không? › Thực hiện: OR AX, AX ; AX = 0 ZF = 1 Copyright (c) 1/2007 by DTB 97
  98. Lệnh NOT § Cú pháp: NOT đích § Lệnh này không ảnh hưởng đến cờ Copyright (c) 1/2007 by DTB 98
  99. Lệnh TEST § Cú pháp: TEST đích, nguồn § Thực hiện phép toán AND nhưng không thay đổi đích mà chỉ cập nhật các cờ. § Các cờ bị tác động: › SF, ZF, PF phản ánh kết quả của lệnh › AF không xác định › CF = OF = 0 § Ví dụ: Kiểm tra tính chẵn lẻ của AL › AL chẵn bit LSB của = 0 › Thực hiện: TEST AL, 1 ; AL chẵn ZF = 1 Copyright (c) 1/2007 by DTB 99
  100. 2. Các lệnh dịch § Các lệnh dịch và quay có 2 dạng: › Dịch (hoặc quay) 1 vị trí: Lệnh đích, 1 › Dịch (hoặc quay) N vị trí: Lệnh đích, CL ; với CL = N Copyright (c) 1/2007 by DTB 100
  101. Các lệnh dịch trái § Dịch trái số học (SAL – Shift Arithmetically Left) và dịch trái logic (SHL – Shift (Logically) Left): › SAL đích, 1 hoặc SAL đích, CL › SHL đích, 1 hoặc SHL đích, CL § Lệnh SAL và SHL là tương đương § Tác động vào các cờ: › SF, PF, ZF phản ánh kết quả › AF không xác định › CF chứa bit cuối cùng được dịch ra khỏi đích › OF = 1 nếu kết quả bị thay đổi dấu trong phép dịch cuối cùng Copyright (c) 1/2007 by DTB 101
  102. Các lệnh dịch phải § Dịch phải logic: SHR – Shift (Logically) Right › Cú pháp: SHR đích, 1 SHR đích, CL › Các cờ bị tác động như là lệnh dịch trái › Minh họa: Copyright (c) 1/2007 by DTB 102
  103. Các lệnh dịch phải (tiếp) § Dịch phải số học: SAR – Shift Arithmetically Right › Cú pháp: SAR đích, 1 SAR đích, CL › Các cờ bị tác động như là lệnh SHR › Minh họa: Copyright (c) 1/2007 by DTB 103
  104. 3. Các lệnh quay § Các dạng lệnh quay: › ROL : quay trái › ROR : quay phải › RCL : quay trái qua cờ nhớ › RCR : quay phải qua cờ nhớ § Tác động vào các cờ: › SF, PF, ZF phản ánh kết quả › AF không xác định › CF chứa bit cuối cùng bị dịch ra khỏi toán hạng › OF = 1 nếu kết quả bị thay đổi dấu trong lần quay cuối cùng Copyright (c) 1/2007 by DTB 104
  105. Minh họa các lệnh quay Copyright (c) 1/2007 by DTB 105
  106. Ví dụ § Xác định giá trị của AX và BX dưới dạng Hexa sau khi thực hiện đoạn chương trình sau: MOV CX,16 MOV AX,5A6Bh LAP: ROL AX,1 RCR BX,1 LOOP LAP Copyright (c) 1/2007 by DTB 106
  107. 4. Vào-ra số nhị phân và Hexa § Các thao tác: › Nhập số nhị phân › In số nhị phân › Nhập số Hexa › In số Hexa Copyright (c) 1/2007 by DTB 107
  108. a. Nhập số nhị phân § Đọc các bit nhị phân từ bàn phím (kết thúc nhập bằng ENTER), chuyển thành số nhị phân rồi lưu vào BX. § Thuật giải: Xóa BX (là thanh ghi chứa kết quả) Nhập 1 kí tự ('0' hoặc '1') WHILE kí tự <> Enter DO Đổi kí tự ra giá trị nhị phân Dịch trái BX Chèn giá trị nhận được vào bit LSB của BX Nhập kí tự END WHILE Copyright (c) 1/2007 by DTB 108
  109. Đoạn lệnh nhập số nhị phân XOR BX, BX ; Xóa BX MOV AH, 1 ; Hàm nhập ký tự INT 21h ; Nhập ký tự NhapKyTu: CMP AL, 13 ; Kt<>ENTER? JE DungNhap ; La enter kết thúc nhập AND AL, 0Fh ; Sai đổi ra giá trị nhị phân SHL BX, 1 ; Dành chỗ cho bit mới tìm được OR BL, AL ; Chèn bit này vào cuối BX INT 21h ; Nhập tiếp ký tự khác JMP NhapKyTu ; Lặp lại DungNhap: Copyright (c) 1/2007 by DTB 109
  110. b. In số nhị phân § In giá trị ở BX ra màn hình dưới dạng số nhị phân. § Thuật giải: FOR 16 lần DO Quay trái BX (bit MSB của BX được đưa ra CF) IF CF = 1 THEN Đưa ra '1' ELSE Đưa ra '0' END IF END FOR § Có thể dùng lệnh ADC: ADC đích, nguồn đích  đích + nguồn + CF Copyright (c) 1/2007 by DTB 110
  111. Mã lệnh MOV CX, 16 ; số bit cần hiện MOV AH, 2 ; hàm hiện kí tự Print: ROL BX, 1 ; quay trái BX CF = MSB jnc in0 ;MOV DL, 0 ; CF=1? mov DL,’1’ ;ADC DL,30H jmp HT ; DL  30h + CF in0: mov DL,’0’ ; in kí tự trong DL HT: int 21h LOOP Print ; lặp lại 16 lần Copyright (c) 1/2007 by DTB 111
  112. c. Nhập số Hexa § Đọc các kí tự Hexa từ bàn phím (tối đa 4 chữ số, chỉ nhập các chữ số và các chữ cái hoa, kết thúc nhập bằng ENTER). Chuyển thành số Hexa tương ứng rồi lưu vào BX. § Thuật giải: Xóa BX (là thanh ghi chứa kết quả) Nhập kí tự Hexa WHILE kí tự <> Enter DO Đổi kí tự ra nhị phân(IF kt<=‘9’ then đổi ra số else đổi chữ ra số) Dịch trái BX 4 bit Chèn giá trị mới vào 4 bit thấp nhất của BX Nhập kí tự tiếp END WHILE Copyright (c) 1/2007 by DTB 112
  113. Đoạn lệnh nhập số Hexa XOR BX, BX ; Xóa BX MOV CL, 4 ; Số lần dịch trái BX MOV AH, 1 ; Hàm nhập kí tự INT 21h ; Nhập 1 kí tự AL = mã ASCII VongLap: CMP AL, 13 ; Kí tự vừa nhập là Enter? JE KetThucLap ; Đúng Kết thúc CMP AL, '9' ; So sánh với '9' JG ChuCai ; Lớn hơn là chữ cái hoa AND AL, 0Fh ; Không lớn hơn đổi chữ số ra nhị phân JMP ChenBit ; Rồi chèn vào cuối BX ChuCai: SUB AL, 37h ; Đổi chữ cái ra giá trị nhị phân ChenBit: SHL BX, CL ; Dịch trái BX để dành chỗ cho c/s mới OR BL, AL ; Chèn chữ số mới vào 4 bit thấp của BX INT 21h ; Nhận tiếp kí tự từ bàn phím JMP VongLap ; Lặp lại KetThucLap: Copyright (c) 1/2007 by DTB 113
  114. d. In số Hexa § Đưa giá trị Hexa 4 chữ số trong BX ra màn hình. § Thuật giải: FOR 4 lần DO Chuyển BH vào DL (giá trị cần in nằm trong BX) Dịch phải DL 4 vị trí IF DL < 10 THEN Đổi thành kí tự '0' '9' ELSE Đổi thành kí tự 'A' 'F' END IF Đưa kí tự ra Quay trái BX 4 vị trí END FOR Copyright (c) 1/2007 by DTB 114
  115. Mã lệnh MOV CX, 404H MOV AH, 2 InHexa: MOV DL, BH SHR DL,CL ; 1 ;SHR DL, 1 ;SHR DL, 1 ;SHR DL, 1 CMP DL, 9 JA ChuCai ADD DL, 30h JMP TiepTuc ChuCai: ADD DL, 37h TiepTuc: INT 21h ROL BX,CL ; 1 ;ROL BX, 1 ;ROL BX, 1 ;ROL BX, 1 dec ch jnz Inhexa ;LOOP InHexa Copyright (c) 1/2007 by DTB 115
  116. Nội dung chương 4 4.1. Mở đầu về lập trình hợp ngữ 4.2. Các cấu trúc lập trình với hợp ngữ 4.3. Các lệnh logic, lệnh dịch và lệnh quay 4.4. Ngăn xếp và thủ tục 4.5. Các lệnh nhân, chia 4.6. Các lệnh thao tác chuỗi 4.7. Một số ví dụ Copyright (c) 1/2007 by DTB 116
  117. Ngăn xếp và thủ tục 1. Ngăn xếp 2. Thủ tục 3. Các ví dụ Copyright (c) 1/2007 by DTB 117
  118. 1. Ngăn xếp § Ngăn xếp (Stack): › Vùng nhớ tổ chức theo cấu trúc LIFO dùng để cất giữ thông tin. › Chiều của Stack từ đáy lên đỉnh ngược với chiều tăng của địa chỉ. § Khai báo ngăn xếp: .STACK kich_thuoc § Ví dụ: .Stack 100h › Khi chương trình được thực thi thì: § SS : chứa địa chỉ đoạn ngăn xếp § SP : chứa địa chỉ offset của đỉnh ngăn xếp. Ban đầu ngăn xếp rỗng nên 0100h cũng là địa chỉ của đáy ngăn xếp (=0100h). Copyright (c) 1/2007 by DTB 118
  119. Lệnh PUSH và PUSHF § Lệnh PUSH dùng để cất 1 dữ liệu 16 bit vào trong ngăn xếp. § Cú pháp: PUSH nguồn › nguồn là 1 thanh ghi 16 bit hoặc 1 từ nhớ (2 Byte) § Các bước thực hiện: › SP  SP – 2 › Một bản sao của toán hạng nguồn được chuyển vào địa chỉ xác định bởi SS:SP (toán hạng nguồn không đổi) § Lệnh PUSHF cất nội dung của thanh ghi cờ vào trong ngăn xếp. Copyright (c) 1/2007 by DTB 119
  120. Ví dụ về lệnh PUSH § Xác định nội dung các Byte nhớ trong Stack. .Stack 100h Start: ; lệnh đầu tiên của chương trình MOV AX, 1234h MOV BX, 5678h PUSH AX PUSH BX Copyright (c) 1/2007 by DTB 120
  121. Ví dụ (tiếp) Copyright (c) 1/2007 by DTB 121
  122. Lệnh POP và POPF § Lệnh POP dùng để lấy ra 1 từ dữ liệu bắt đầu từ đỉnh ngăn xếp. § Cú pháp: POP đích › đích là 1 thanh ghi 16 bit (trừ IP) hoặc 1 từ nhớ § Các bước thực hiện: › Nội dung của từ nhớ ở địa chỉ xác định bởi SS:SP được chuyển tới toán hạng đích. › SP  SP + 2 § Lệnh POPF đưa vào thanh ghi cờ nội dung của từ nhớ ở đỉnh ngăn xếp. Copyright (c) 1/2007 by DTB 122
  123. Ví dụ về lệnh POP § Xác định nội dung các Byte nhớ trong Stack. .Stack 100h Start: ; lệnh đầu tiên của chương trình MOV AX, 1234h MOV BX, 5678h PUSH AX PUSH BX POP CX POP DX Copyright (c) 1/2007 by DTB 123
  124. Ví dụ (tiếp) Copyright (c) 1/2007 by DTB 124
  125. Một số lưu ý § Các lệnh PUSH, PUSHF, POP và POPF không ảnh hưởng đến các cờ. § Các lệnh trên chỉ thao tác với các WORD. § Các lệnh sau là không hợp lệ: › PUSH AH ; thanh ghi 8 bit › POP DL ; thanh ghi 8 bit › PUSH 2 ; giá trị hằng số Copyright (c) 1/2007 by DTB 125
  126. Bài tập § 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 DX (Hexa) sau khi thực hiện đoạn lệnh sau: push mem1 push mem2 mov bp, sp mov dx, [bp]+2 a) FFCE b) 0000 c) 01F4 d) FFFF Copyright (c) 1/2007 by DTB 126
  127. 2. Thủ tục § Ngoài thủ tục chính, ta có thể khai báo và sử dụng các thủ tục khác. § Khai báo thủ tục: Tên_thủ_tục PROC Kiểu_thủ_tục RET Tên_thủ_tục ENDP § Trong đó: › Tên_thủ_tục: do người lập trình định nghĩa › Kiểu_thủ_tục: § NEAR : gọi thủ tục ở trong cùng 1 đoạn § FAR : gọi thủ tục ở đoạn khác Copyright (c) 1/2007 by DTB 127
  128. Lệnh CALL § Là lệnh gọi chương trình con (thủ tục) § Thông dụng: CALL Tên_thủ_tục § Các bước thực hiện: › Thủ tục NEAR § SP  SP – 2 § Cất nội dung của IP (địa chỉ quay về) vào Stack § Nạp địa chỉ của lệnh đầu tiên của chương trình con vào IP › Thủ tục FAR § SP  SP – 2 § Cất nội dung của CS vào Stack § SP  SP – 2 § Cất nội dung của IP vào Stack § Nạp vào CS và IP địa chỉ đầu của chương trình con Copyright (c) 1/2007 by DTB 128
  129. Lệnh RET § Là lệnh trở về từ chương trình con § Các bước thực hiện: › Trở về kiểu NEAR § IP  word nhớ đỉnh Stack § SP  SP + 2 › Trở về kiểu FAR (RETF) § IP  word nhớ đỉnh Stack § SP  SP + 2 § CS  word nhớ tiếp § SP  SP + 2 Copyright (c) 1/2007 by DTB 129
  130. Truyền dữ liệu giữa các thủ tục § Các thủ tục của hợp ngữ không có danh sách tham số đi kèm như các ngôn ngữ lập trình bậc cao. § Người lập trình phải nghĩ ra cách truyền dữ liệu giữa các thủ tục. § Các cách truyền dữ liệu thông dụng: › Truyền qua thanh ghi › Sử dụng biến toàn cục › Truyền địa chỉ của dữ liệu › Sử dụng ngăn xếp (thường dùng trong các NNLT bậc cao) Copyright (c) 1/2007 by DTB 130
  131. 3. Các ví dụ § VD1: Nhập 1 chuỗi kí tự kết thúc bởi ENTER. Hiện chuỗi kí tự viết theo thứ tự ngược lại ở dòng tiếp theo. § VD2: Cài đặt các thủ tục viết số nhị phân và số Hexa ra màn hình. Copyright (c) 1/2007 by DTB 131
  132. Nội dung chương 4 4.1. Mở đầu về lập trình hợp ngữ 4.2. Các cấu trúc lập trình với hợp ngữ 4.3. Các lệnh logic, lệnh dịch và lệnh quay 4.4. Ngăn xếp và thủ tục 4.5. Các lệnh nhân, chia 4.6. Các lệnh thao tác chuỗi 4.7. Một số ví dụ Copyright (c) 1/2007 by DTB 132
  133. 4.5. Các lệnh nhân, chia 1. Các lệnh MUL và IMUL 2. Các lệnh DIV và IDIV 3. Vào-ra số thập phân Copyright (c) 1/2007 by DTB 133
  134. 1. Các lệnh MUL và IMUL § Có sự khác nhau giữa phép nhân các số không dấu với phép nhân các số khác dấu. § Lệnh nhân cho các số không dấu: MUL số_nhân § Lệnh nhân cho các số có dấu: IMUL số_nhân § Các lệnh trên làm việc với byte (cho KQ là 1 word) hoặc word (cho KQ là 1 double word) § Số_nhân (thanh ghi / ngăn nhớ) được coi là số nhân, nếu nguồn là giá trị: › 8 bit: AX  AL x số_nhân § Số bị nhân là số 8 bit chứa trong AL § Tích là số 16 bit chứa trong AX › 16 bit: DXAX  AX x số_nhân § Số bị nhân là số 16 bit chứa trong AX § Tích là số 32 bit chứa trong DXAX Copyright (c) 1/2007 by DTB 134
  135. Ảnh hưởng đến các cờ § SF, ZF, AF, PF : không xác định § Sau lệnh MUL: › CF = OF = 0 nếu nửa cao của kết quả = 0 › CF = OF = 1 trong các trường hợp còn lại § Sau lệnh IMUL: › CF = OF = 0 nếu nửa cao của kết quả chỉ chứa các giá trị của dấu › CF = OF = 1 trong các trường hợp còn lại § Nói cách khác, CF = OF = 1 nghĩa là kết quả quá lớn để chứa trong nửa thấp (AL hoặc AX) của tích. Copyright (c) 1/2007 by DTB 135
  136. 2. Các lệnh DIV và IDIV § Phép chia không dấu: DIV số_chia § Phép chia có dấu: IDIV số_chia § Chia số 16 bit (trong AX) cho số chia 8 bit hoặc chia số 32 bit (trong DXAX) cho số chia 16 bit. § Thương và số dư có cùng kích thước với số chia. › Số chia 8 bit: AL chứa thương, AH chứa số dư › Số chia 16 bit: AX chứa thương, DX chứa số dư § Số dư và số bị chia có cùng dấu. § Nếu số chia = 0 hoặc thương nằm ngoài khoảng xác định thì BXL thực hiện INT 0 (lỗi chia cho 0). § Các cờ không xác định sau phép chia. Copyright (c) 1/2007 by DTB 136
  137. Sự mở rộng dấu của số bị chia § Trong phép chia cho Word, số bị chia được đặt trong DXAX ngay cả khi nó có thể chứa vừa trong AX. Khi đó DX phải được chuẩn bị như sau: › Với lệnh DIV, DX phải được xóa về 0. › Với lệnh IDIV, DX được lấp đầy bằng bit dấu của AX. Phép biến đổi này được thực hiện bởi lệnh CWD. § Trong phép chia cho Byte, số bị chia được đặt trong AX ngay cả khi nó có thể chứa vừa trong AL. Khi đó AH phải được chuẩn bị như sau: › Với lệnh DIV, AH phải được xóa về 0. › Với lệnh IDIV, AH được lấp đầy bằng bit dấu của AL. Phép biến đổi này được thực hiện bởi lệnh CBW. Copyright (c) 1/2007 by DTB 137
  138. 3. Vào-ra số thập phân § Các thao tác: › In số thập phân › Nhập số thập phân Copyright (c) 1/2007 by DTB 138
  139. a. In số thập phân § In số nguyên có dấu trong BX ra màn hình dưới dạng số thập phân. § Thuật giải: § AX:=BX IF AX < 0 THEN In ra dấu ' ' AX := số bù 2 của AX END IF Lấy dạng thập phân của từng chữ số trong AX Đổi các chữ số này ra kí tự rồi in ra màn hình Copyright (c) 1/2007 by DTB 139
  140. In số thập phân (tiếp) § Lấy dạng thập phân của từng chữ số trong AX: Đếm := 0 REPEAT Chia số bị chia cho 10 ; số bị chia ban đầu = AX Cất số dư vào trong Stack Đếm := Đếm + 1 UNTIL Thương = 0 § Đổi các chữ số ra kí tự rồi in ra màn hình: FOR Đếm lần DO Lấy từng chữ số từ Stack Đổi ra kí tự In kí tự đó ra màn hình END FOR Copyright (c) 1/2007 by DTB 140
  141. b. Nhập số thập phân § Thuật giải (đơn giản): Tổng := 0 Đọc 1 kí tự ASCII REPEAT Đổi kí tự ra giá trị nhị phân Tổng := Tổng * 10 + giá trị nhận được Đọc kí tự UNTIL kí tự vừa nhận = Enter Copyright (c) 1/2007 by DTB 141
  142. Nội dung chương 4 4.1. Mở đầu về lập trình hợp ngữ 4.2. Các cấu trúc lập trình với hợp ngữ 4.3. Các lệnh logic, lệnh dịch và lệnh quay 4.4. Ngăn xếp và thủ tục 4.5. Các lệnh nhân, chia 4.6. Các lệnh thao tác chuỗi 4.7. Một số ví dụ Copyright (c) 1/2007 by DTB 142
  143. 4.6. Các lệnh thao tác chuỗi 1. Cờ định hướng 2. Chuyển một chuỗi 3. Lưu kí tự vào chuỗi 4. Nạp kí tự của chuỗi 5. Tìm kí tự trong chuỗi 6. So sánh chuỗi 7. Tổng kết thao tác chuỗi Copyright (c) 1/2007 by DTB 143
  144. 1. Cờ định hướng § Cờ định hướng DF (Direction Flag) xác định hướng cho các thao tác chuỗi. § Các thao tác chuỗi được thực hiện thông qua 2 thanh ghi chỉ số SI và DI. § Nếu DF = 0 thì SI và DI được xử lý theo chiều tăng của địa chỉ bộ nhớ (từ trái qua phải trong chuỗi). § Nếu DF = 1 thì SI và DI được xử lý theo chiều giảm của địa chỉ bộ nhớ (từ phải qua trái trong chuỗi). Copyright (c) 1/2007 by DTB 144
  145. Các lệnh CLD và STD § Lệnh CLD (Clear Direction Flag): xóa cờ hướng CLD ; xóa DF = 0 § Lệnh STD (Set Direction Flag): thiết lập cờ hướng STD ; thiết lập DF = 1 § Các lệnh này không ảnh hưởng đến các cờ khác. Copyright (c) 1/2007 by DTB 145
  146. 2. Chuyển một chuỗi Copyright (c) 1/2007 by DTB 146
  147. Kỹ thuật Vi xử lý HẾT CHƯƠNG 4 Copyright (c) 1/2007 by DTB 147