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
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:
- bai_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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Ý 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
- Ý 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
- Ý 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Các chế độ bộ nhớ (tiếp) Copyright (c) 1/2007 by DTB 29
- Đ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
- Đ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
- Đ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Ví dụ 2 Copyright (c) 1/2007 by DTB 49
- 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
- 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
- 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
- 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
- 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
- Bài tập 1 (tiếp) Copyright (c) 1/2007 by DTB 55
- 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
- Bài tập 2 (tiếp) Copyright (c) 1/2007 by DTB 57
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Các lệnh nhảy so sánh số có dấu Copyright (c) 1/2007 by DTB 65
- Các lệnh nhảy so sánh số không dấu Copyright (c) 1/2007 by DTB 66
- Các lệnh nhảy điều kiện đơn Copyright (c) 1/2007 by DTB 67
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Ví dụ § Đọc 1 kí tự, nếu là chữ cái hoa thì hiển thị. Copyright (c) 1/2007 by DTB 80
- e. Điều kiện chứa OR § If OR Then BoQua: 81 Copyright (c) 1/2007 by DTB
- 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
- Ví dụ (tiếp) Copyright (c) 1/2007 by DTB 83
- 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
- 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
- MOV DEM,N NHAN: ;cong viec DEC DEM JNZ NHAN . MOV CX,N NHAN: ;cong viec LOOP NHANCopyright (c) 1/2007 by DTB 86
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Minh họa các lệnh quay Copyright (c) 1/2007 by DTB 105
- 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
- 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
- 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
- Đ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
- 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
- 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
- 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
- Đ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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Ví dụ (tiếp) Copyright (c) 1/2007 by DTB 121
- 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
- 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
- Ví dụ (tiếp) Copyright (c) 1/2007 by DTB 124
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Ả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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 2. Chuyển một chuỗi Copyright (c) 1/2007 by DTB 146
- Kỹ thuật Vi xử lý HẾT CHƯƠNG 4 Copyright (c) 1/2007 by DTB 147