Bài giảng Kiến trúc máy tính - Chương 2: Ngôn ngữ của máy tính (Assembly) - Bài 2.6: Các lệnh Assembly cơ bản - Phạm Thanh Bình (Phần 1)
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kiến trúc máy tính - Chương 2: Ngôn ngữ của máy tính (Assembly) - Bài 2.6: Các lệnh Assembly cơ bản - Phạm Thanh Bình (Phần 1)", để 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_kien_truc_may_tinh_chuong_2_ngon_ngu_cua_may_tinh.ppt
Nội dung text: Bài giảng Kiến trúc máy tính - Chương 2: Ngôn ngữ của máy tính (Assembly) - Bài 2.6: Các lệnh Assembly cơ bản - Phạm Thanh Bình (Phần 1)
- KIẾN TRÚC MÁY TÍNH Giảng viên: Ths Phạm Thanh Bình Bộ môn Kỹ thuật máy tính & mạng Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 1
- Bài 2.6 – Các lệnh Assembly cơ bản Cấu trúc chương trình Một số lệnh thường dùng Nhập/xuất dữ liệu Cách chạy chương trình Assembly Các lệnh nhảy, cấu trúc rẽ nhánh và lặp Các lệnh logic, dịch, và quay Ngăn xếp và thủ tục Mảng và các chế độ địa chỉ Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 2
- 2.6.1 Cấu trúc chương trình TITLE VI DU 1 .MODEL SMALL .STACK 100H .DATA A DB 4 B DB 6 C DB ? .CODE MAIN PROC MOV AX, @DATA MOV DS, AX MOV AL, A ADD AL, B MOV C, AL MOV AX, 4C00H INT 21H MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 3
- Giải thích: Phần tên Tên chương trình được viết sau từ khoá TITLE ở đầu chương trình. Tên có thể chứa dấu cách và các kí tự đặc biệt khác. Thông thường phần tên sẽ cho ta biết mục đích, nhiệm vụ hoặc nội dung tóm tắt của chương trình. Ví dụ: TITLE VI DU 1 Phần khai báo Trong hợp ngữ có nhiều nội dung cần phải khái báo như kiểu bộ nhớ, ngăn xếp, biến, hằng Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 4
- Khai báo kiểu bộ nhớ Kiểu bộ nhớ được viết sau từ .MODEL. Kiểu bộ nhớ sẽ quy định kích thước của đoạn mã và dữ liệu trong chương trình Trong ví dụ trên, kiểu bộ nhớ là SMALL, nghĩa là kiểu bộ nhớ nhỏ, mã lệnh sẽ nằm trong 1 đoạn nhớ, dữ liệu nằm trong 1 đoạn nhớ. Ngoài kiểu SMALL còn có nhiều kiểu bộ nhớ khác Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 5
- Một số kiểu bộ nhớ MEDIUM Mã lệnh chiếm nhiều hơn 1 đoạn Dữ liệu trong 1 đoạn COMPACT Mã lệnh trong 1 đoạn Dữ liệu chiếm nhiều hơn 1 đoạn LARGE Mã lệnh chiếm nhiều hơn 1 đoạn Dữ liệu chiếm nhiều hơn 1 đoạn Không có mảng nào lớn hơn 64 KB HUGE Mã lệnh chiếm nhiều hơn 1 đoạn Dữ liệu chiếm nhiều hơn 1 đoạn Các mảng có thể lớn hơn 64 KB Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 6
- Khai báo kích thước ngăn xếp Kích thước ngăn xếp được viết sau từ .STACK Ví dụ: .STACK 100H Khi đó kích thước vùng bộ nhớ dùng làm ngăn xếp là 100H Bytes Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 7
- Khai báo dữ liệu Khai báo dữ liệu được viết sau từ .DATA. Các biến của chương trình sẽ được khai báo ở phần này. Ví dụ 1: A DB 4 Trong đó: A là tên biến, DB là kiểu dữ liệu (biến kiểu DB sẽ có kích thước 1 byte), 4 là giá trị ban đầu của biến. Ví dụ 2: B DW ? Trong ví dụ này, biến B sẽ có kiểu là DW (1 Word) và không có giá trị khởi tạo. Khai báo hằng: Ví dụ: H EQU 2Bh Hằng H sẽ nhận giá trị bằng 2Bh Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 8
- Quy tắc đặt tên (Biến, hằng, nhãn, thủ tục): Tên có chiều dài tối đa 31 kí tự. Có thể chứa chữ cái, chữ số và các kí tự đặc biệt (? . @ _ $ %). Không được bắt đầu bằng số. Nếu dùng dấu chấm thì nó phải đứng đầu tiên. Tên không được chứa dấu cách. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 9
- Phần mã lệnh Phần này bao gồm các thủ tục được viết sau từ .CODE. Trong số các thủ tục này phải chọn một thủ tục làm chương trình chính, tên của thủ tục đó được viết sau từ END ở cuối chương trình. Tên chương trình chính thường đặt là MAIN, cũng có thể chọn một tên khác. Cấu trúc một thủ tục: PROC Lệnh 1 Lệnh 2 Lệnh 3 ENDP Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 10
- Cấu trúc chung của phần mã lệnh: .CODE PROC Lệnh 1 Lệnh 2 Lệnh 3 ENDP Các thủ tục khác END Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 11
- 2.6.2 Một số lệnh thường dùng Cấu trúc câu lệnh Assembly Lệnh MOV (Move) Lệnh XCHG (Exchange) Lệnh ADD và SUB (Subtract) Lệnh INC (Increment) và DEC (Decrement) Lệnh NEG (Negartive) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 12
- Cấu trúc câu lệnh Assembly Một câu lệnh hợp ngữ gồm 3 phần: Tên lệnh, các toán hạng, phần chú thích. Nếu có nhiều toán hạng thì chúng được phân cách với nhau bằng dấu phảy (,). [, ] [;Lời chú thích] Ví du: MOV DS, AX ;Chuyển nội dung của thanh ghi AX vào thanh ghi DS Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 13
- Lệnh MOV (Move) Lệnh này được sử dụng để chuyển dữ liệu giữa các thanh ghi hay ô nhớ. Cú pháp lệnh: MOV , : là một thanh ghi hay một ô nhớ : là một thanh ghi, một ô nhớ, hoặc một hằng số Dữ liệu sẽ được chuyển từ Nguồn vào Đích (nội dung của Nguồn không thay đổi sau khi chuyển) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 14
- Ví dụ 1: MOV AX, 4C00h Lệnh trên chuyển giá trị 4C00h vào thanh ghi AX. Ví dụ 2: MOV AL, A Lệnh trên chuyển giá trị của biến A vào thanh ghi AL. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 15
- Chú ý: Không được chuyển trực tiếp nội dung của hai thanh ghi đoạn cho nhau Không được chuyển trực tiếp nội dung của hai biến cho nhau Không được chuyển trực tiếp một hằng số vào một thanh ghi đoạn Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 16
- Ví dụ: Các lệnh sau đều sai: MOV CS, DS MOV A, B MOV DS, 2000h Để khắc phục: sử dụng trung gian: MOV AX, DS ; dùng AX làm trung gian MOV CS, AX Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 17
- Lệnh XCHG (Exchange) Lệnh này dùng để hoán đổi dữ liệu dữ liệu giữa hai toán hạng. Cú pháp lệnh: XCHG , Các toán hạng có thể là thanh ghi công dụng chung, hoặc một thanh ghi công dụng chung và một ô nhớ. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 18
- Ví dụ: XCHG AX, BX ;hoán đổi nội dung của ; AX và BX Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 19
- Lệnh ADD và SUB (Subtract) Cú pháp lệnh: ADD , SUB , : là một thanh ghi hay một ô nhớ : là một thanh ghi, một ô nhớ, hoặc một hằng số , không đồng thời là hai ô nhớ. Lệnh ADD sẽ thực hiện phép cộng Đích với Nguồn, kết quả chứa trong Đích. Lệnh SUB sẽ lấy Đích trừ đi Nguồn, kết quả chứa trong Đích. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 20
- Ví dụ: ADD AX, 10 ;Tăng nội dung của ; thanh ghi AX lên 10 ADD BX, AX ;Cộng nội dung 2 thanh ghi ; AX và BX, tổng cất vào BX SUB AX, B ;Trừ nội dung thanh ghi AX ; cho biến B Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 21
- Lệnh INC (Increment) và DEC (Decrement) Cú pháp lệnh: INC DEC : là một thanh ghi hay một ô nhớ Lệnh INC sẽ tăng Đích lên 1 (cộng Đích với 1). Lệnh DEC sẽ giảm Đích đi 1 (trừ Đích cho 1). Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 22
- Ví dụ: INC AH ;Cộng nội dung của ; thanh ghi AH với 1 DEC B ;Trừ giá trị của biến B ; cho 1 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 23
- Lệnh NEG (Negartive) Cú pháp lệnh: NEG : là một thanh ghi hay một ô nhớ. Lệnh này có tác dụng đổi dấu toán hạng Đích. Ví dụ: NEG AL Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 24
- 2.6.3 Nhập/xuất dữ liệu Chương trình ngắt Chức năng nhập/xuất của ngắt 21h Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 25
- Chương trình ngắt Chương trình ngắt là những chương trình con đã được viết sẵn nhằm thực hiện những chức năng cơ bản khi thao tác với máy tính. Các chương trình con này được phân phối kèm theo các phần mềm điều khiển hệ thống như BIOS, Hệ điều hành. Mỗi chương trình có một số hiệu riêng (0, 1, 2, ). Khi lập trình ta có thể sử dụng các chương trình con có sẵn này bằng cách dùng lệnh INT (interrupt). Cú pháp lệnh: INT Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 26
- Ví dụ 1: INT 21h Lệnh trên sẽ gọi thực hiện chương trình ngắt số 21h (đây là số hiệu ngắt hay sử dụng nhất của DOS). Ví dụ 2: INT 13h Lệnh trên sẽ gọi thực hiện chương trình ngắt số 13h (đây là số hiệu ngắt của BIOS, dùng để thao tác với đĩa từ). Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 27
- Chức năng nhập/xuất của ngắt 21h Ngắt 21h của DOS cung cấp rất nhiều chức năng khác nhau, mỗi chức năng cũng có một số hiệu riêng (0, 1, 2, ). Trong phần này ta chỉ quan tâm tới chức năng nhập - xuất dữ liệu. Trước khi gọi ngắt cần xác định được số hiệu chức năng, số hiệu đó được đặt vào thanh ghi AH. Ngoài ra cũng cần quan tâm tới các tham số khác (chương trình ngắt sẽ sử dụng thanh ghi nào? Giá trị của chúng bằng bao nhiêu? ) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 28
- Hiện một kí tự ra màn hình Đây là chức năng số 2 của ngắt 21h. Các tham số cần thiết để gọi ngắt như sau: Vào: AH = 2 DL = Mã ASCII của kí tự cần hiển thị Ra: AL chứa mã ASCII của kí tự hiển thị Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 29
- Ví dụ 2: Hiện kí tự ‘M’ ra màn hình MOV AH, 2 MOV DL, ‘M’ INT 21h Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 30
- Chương trình đầy đủ TITLE HIEN KI TU .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AH, 2 ;Chức năng số 2 MOV DL, ’M’ ;Kí tự cần hiển thị INT 21h ;Gọi ngắt MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 31
- Chú ý: Chương trình trên có sử dụng chức năng số 4Ch của ngắt 21h. Chức năng này có tác dụng kết thúc chương trình và trả lại quyền điều khiển cho hệ điều hành DOS. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 32
- Hiện một chuỗi kí tự ra màn hình Đây là chức năng số 9 của ngắt 21h. Các tham số cần thiết để gọi ngắt như sau: Vào: AH = 9 DX = Địa chỉ offset của vùng nhớ chứa chuỗi kí tự Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 33
- Ví dụ: Hiện ra màn hình dòng chữ: KHOA CONG NGHE THONG TIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 34
- TITLE HIEN CHUOI KT .MODEL SMALL .STACK 100H .DATA ChuoiKT DB ’KHOA CONG NGHE THONG TIN$’ .CODE MAIN PROC MOV AX, @DATA MOV DS, AX MOV AH, 9 ;Chức năng số 9 LEA DX, ChuoiKT ;Lấy địa chỉ chuỗi kí tự đặt vào DX INT 21h ;Gọi ngắt MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 35
- Chú ý: Chuỗi kí tự cần hiển thị phải được kết thúc bằng dấu $. Nếu trong chương trình có sử dụng khai báo dữ liệu .DATA thì ở đầu của chương trình chính phải có các lệnh: MOV AX, @DATA MOV DS, AX Mục đích là để đặt địa chỉ segment của đoạn dữ liệu vào thanh ghi DS. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 36
- Chú ý: Chương trình trên có sử dụng lệnh LEA (Load Effective Address). Cú pháp lệnh như sau: LEA , : là một thanh ghi công dụng chung hoặc thanh ghi con trỏ - chỉ số. : là một ô nhớ. Lệnh này sẽ lấy địa chỉ offset của Nguồn đặt vào Đích. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 37
- Nhập một kí tự từ bàn phím Đây là chức năng số 1 của ngắt 21h. Các tham số cần thiết để gọi ngắt như sau: Vào: AH = 1 Ra: AL chứa mã ASCII của kí tự Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 38
- Các lệnh cụ thể như sau: MOV AH, 1 INT 21h Khi gặp các lệnh trên, chương trình sẽ dừng lại chờ ta gõ một kí tự từ bàn phím, mã ASCII của kí tự đó sẽ được cất trong thanh ghi AL. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 39
- Ví dụ: Nhập một kí tự thường từ bàn phím, đổi nó thành kí tự in hoa rồi hiện ra màn hình. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 40
- TITLE DOI KI TU .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AH, 1 ;Chức năng số 1: Nhập một kí tự INT 21h SUB AL, 20h ;Đổi kí tự sang in hoa MOV AH, 2 ;Chức năng số 2: Hiện kí tự MOV DL, AL INT 21h MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 41
- Giải thích: Mã ASCII của kí tự thường lớn hơn kí tự in hoa tương ứng là 20h. Muốn chuyển từ kí tự thường thành in hoa thì chỉ việc lấy mã ASCII của nó trừ đi 20h. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 42
- 2.6.4 Cách chạy chương trình Assembly Để có thể chạy một chương trình hợp ngữ thì trước hết phải biên dịch nó thành file thi hành (EXE, COM). Có nhiều công cụ biên dịch khác nhau do nhiều hãng phần mềm sản xuất. Ta sẽ sử dụng bộ công cụ MASM (Microsoft Macro Assembler) của hãng MicroSoft vì nó khá nhỏ gọn và dễ dùng. Để bắt đầu thì ta chỉ cần tới hai file: MASM.EXE và LINK.EXE. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 43
- Các bước thực hiện: Bước 1: Soạn thảo nội dung chương trình bằng một công cụ soạn thảo text bất kì, cất vào file với phần mở rộng là ASM. Ví dụ: tên file là Baitap.asm Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 44
- Bước 2: Dịch file ASM thành file OBJ bằng công cụ MASM.EXE. Gõ lệnh như sau: MASM Baitap; (Enter) (file MASM.EXE và file Baitap.asm nên để cùng một thư mục) Nếu dịch thành công (chương trình không có lỗi) thì ta sẽ thu được file Baitap.obj. Nếu chương trình bị lỗi thì phải sửa, sau đó tiến hành dịch lại. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 45
- Bước 3: Sử dụng công cụ LINK.EXE để liên kết các file OBJ thu được ở bước 2 thành file thi hành được (EXE). Vì trong ví dụ này chỉ có 1 file OBJ nên cách gõ lệnh như sau: LINK Baitap; (Enter) (file LINK.EXE cũng ở cùng thư mục nói trên) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 46
- Ta sẽ thu được file Baitap.exe. Để chạy file này chỉ việc gõ lệnh: Baitap (Enter) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 47
- 2.6.5 Các lệnh nhảy Thanh ghi cờ và các cờ trạng thái Các lệnh nhảy có điều kiện Lệnh nhảy không điều kiện JMP Cấu trúc rẽ nhánh Cấu trúc lặp Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 48
- Thanh ghi cờ và các cờ trạng thái Thanh ghi cờ dài 16 bít, mỗi bít được gọi là một cờ và có công dụng riêng. Dưới đây là vị trí của các cờ: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 OF DF IF TF SF ZF AF PF CF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 49
- Tên và chức năng của các cờ Bit Tên cờ Kí hiệu 0 Cờ nhớ (Carry Flag) CF 2 Cờ chẵn lẻ (Parity Flag) PF 4 Cờ nhớ phụ (Auxiliary Flag) AF 6 Cờ Zero (Zero Flag) ZF 7 Cờ dấu (Sign Flag) SF 11 Cờ tràn (OverFlow Flag) OF 8 Cờ bẫy (Trap Flag) TF 9 Cờ ngắt (Interrupt Flag) IF 10 Cờ định hướng (Direction Flag) DF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 50
- Các cờ chia làm hai nhóm khác nhau: Nhóm cờ trạng thái (gồm 6 cờ: CF, PF, AF, ZF, SF, OF) Nhóm cờ điều khiển (gồm 3 cờ: TF, IF, DF) Dưới đây ta sẽ tìm hiểu một số cờ hay dùng: CF, ZF, và OF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 51
- Cờ nhớ CF: Xét các lệnh sau đây: MOV AX, 0FFFFh ADD AX, 1 Trước khi thực hiện lệnh ADD thì AX = FFFFh = 1111 1111 1111 1111b = 65535 Sau khi thực hiện phép cộng với 1 thì AX bằng bao nhiêu? Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 52
- 1111 1111 1111 1111b + 1 1 0000 0000 0000 0000b Thanh ghi AX dài 16 bit nên sau lệnh ADD thì AX = 0! Phép cộng đã không còn chính xác do kết quả vượt quá phạm vi chứa của AX (gọi là hiện tượng tràn khi cộng số không dấu). Khi đó cờ CF được thiết lập bằng 1. Như vậy, cờ CF sẽ được thiết lập khi thực hiện phép cộng có nhớ ở bít Msb hoặc khi thực hiện phép trừ có vay ở bít Msb. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 53
- Cờ Zero ZF: Xét các lệnh sau đây: MOV CX, 2Ah SUB CX, 2Ah Sau khi thực hiện lệnh SUB thì CX = 0, cờ ZF được thiết lập bằng 1. Như vậy, cờ ZF sẽ được thiết lập khi kết quả của lệnh vừa thực hiện bằng 0. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 54
- Cờ tràn OF: Xét các lệnh sau đây: MOV AX, 7FFFh ADD AX, 7FFFh Trước khi thực hiện lệnh ADD thì AX = 7FFFh = 0111 1111 1111 1111b = 32767 Sau khi thực hiện phép cộng thì AX bằng bao nhiêu? Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 55
- 0111 1111 1111 1111b + 0111 1111 1111 1111b 1111 1111 1111 1110b Sau lệnh ADD thì AX = FFFEh. Nếu coi đây là số không dấu thì AX = 65534, không có hiện tượng tràn, cờ CF = 0. Nhưng nếu coi đây là số có dấu thì AX = -2 (32767 + 32767 = -2!), phép cộng đã không còn chính xác do kết quả vượt quá phạm vi chứa của AX (gọi là hiện tượng tràn khi cộng số có dấu). Khi đó cờ OF được thiết lập bằng 1. Như vậy, cờ OF sẽ được thiết lập khi xuất hiện hiện tượng tràn trong phép tính với số có dấu. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 56
- Các lệnh nhảy có điều kiện Ví dụ: TITLE Lenh nhay .MODEL SMALL .STACK 100H .CODE MAIN PROC NHAPLAI: MOV AH, 1 ;Chức năng số 1: Nhập 1 kí tự INT 21h CMP AL, ’ ’ ;Kiểm tra kí tự vừa nhập JZ NHAPLAI MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 57
- Giải thích: Chương trình trên sẽ nhập một kí tự từ bàn phím, kiểm tra xem đó có phải là kí tự khoảng trống ‘ ’ hay không, nếu đúng thì tiến hành nhập lại. Quá trình đó được thực hiện nhờ lệnh so sánh CMP và lệnh nhảy JZ. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 58
- Lệnh CMP (Compare) Cú pháp lệnh: CMP , Lệnh này có tác dụng tương tự lệnh SUB, nó thực hiện phép trừ giữa Đích và Nguồn. Sự khác biệt là ở chỗ: Đích không bị thay đổi sau phép trừ, chỉ có các cờ là thay đổi. Ví dụ: CMP AL, ‘ ’ Lệnh trên sẽ lấy nội dung của AL trừ cho 20h (mã ASCII của kí tự khoảng trống). Nếu kết quả mà bằng 0, tức là AL = 20h (AL = ‘ ‘), thì cờ ZF sẽ được thiết lập bằng 1. Trạng thái của các cờ sẽ được sử dụng làm điều kiện cho các lệnh nhảy Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 59
- Lệnh nhảy JZ Lệnh JZ là lệnh nhảy khi cờ ZF = 1 (Jump if Zero). Cú pháp lệnh: JZ Trong chương trình trên, lệnh JZ sẽ kiểm tra cờ ZF, nếu ZF = 1 thì sẽ nhảy tới nhãn NHAPLAI, nghĩa là thực hiện lại các lệnh nhập dữ liệu. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 60
- Một số lệnh nhảy Có nhiều lệnh nhảy khác nhau ứng với trạng thái khác nhau của các cờ: Lệnh Chức năng Điều kiện nhảy JC Nhảy nếu có nhớ (Jump if Carry) CF = 1 JNC Nhảy nếu không nhớ (Jump if Not Carry) CF = 0 JO Nhảy nếu tràn có dấu (Jump if OverFlow) OF = 1 JNO Nhảy nếu không tràn (Jump if Not OverFlow) OF = 0 JS Nhảy nếu dấu âm (Jump if Sign) SF = 1 JNS Nhảy nếu dấu dương (Jump if Not Sign) SF = 0 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 61
- Đơn giản hoá cách dùng lệnh nhảy Kết hợp lệnh nhảy và lệnh CMP theo quy tắc sau: CMP , Điều kiện nhảy Lệnh nhảy Lệnh nhảy có không dấu dấu Đích > Nguồn JA/ JNBE JG/ JNLE Đích < Nguồn JB/ JNAE JL/ JNGE Đích = Nguồn JE/ JZ JE/ JZ Đích ≥ Nguồn JAE/ JNB JGE/ JNL Đích ≤ Nguồn JBE/ JNA JLE/ JNG Đích ≠ Nguồn JNE/ JNZ JNE/ JNZ Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 62
- Một số từ viết tắt: A: Above (lớn hơn) = G: Greater than B: Below (nhỏ hơn) = L: Less than E: Equal (bằng) N: Not (không) Ví dụ: JNA: Jump if Not Above = JBE: Jump if Below - Equal Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 63
- Giải thích: Trước mỗi lệnh nhảy cần dùng một lệnh CMP để tạo điều kiện nhảy. Người lập trình sẽ căn cứ vào quan hệ giữa và để lựa chọn lệnh nhảy thích hợp. Ví dụ: CMP AL, 5Ah JA KetThuc ;Nếu AL > 5Ah thì nhảy ; tới nhãn KetThuc Nếu Đích > Nguồn: Ta có thể sử dụng lệnh nhảy JA hoặc JNBE (trong trường hợp Đích và Nguồn là số không dấu). Hai lệnh này có tác dụng giống hệt nhau. Nếu coi đích và nguồn là các số có dấu thì phải sử dụng lệnh JG hoặc JNLE. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 64
- Lệnh nhảy không điều kiện JMP Các lệnh nhảy có điều kiện mà ta đã nghiên cứu có một nhược điểm là không thể nhảy quá xa. Các lệnh đó chỉ có thể nhảy tới một nhãn đứng trước nó không quá 126 byte hoặc đứng sau không quá 127 byte. Để khắc phục điều này có thể sử dụng lệnh nhảy không điều kiện JMP. Cú pháp lệnh như sau: JMP Vị trí của phải nằm cùng một đoạn nhớ với lệnh nhảy JMP. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 65
- Ví dụ: Xét đoạn lệnh sau: MOV AH, 1 ;Nhập một kí tự INT 21h CMP AL, ‘Z’ ;So sánh kí tự vừa nhập với ‘Z’ JA KetThuc ;Nếu AL > ‘Z’ thì nhảy tới nhãn KetThuc ;Các lệnh khác KetThuc: MOV AH, 4Ch INT 21h Đoạn lệnh trên chỉ thực hiện được khi khoảng cách giữa lệnh JA và vị trí đặt nhãn KetThuc không quá 127 byte. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 66
- Sử dụng phương pháp “nhảy hai bước” : MOV AH, 1 ;Nhập một kí tự INT 21h CMP AL, ‘Z’ ;So sánh kí tự vừa nhập với ‘Z’ JA NhanTrungGian ;Nếu AL > ‘Z’ thì nhảy tới NhanTrungGian JMP TiepTuc NhanTrungGian: JMP KetThuc TiepTuc: ;Các lệnh khác KetThuc: MOV AH, 4Ch INT 21h Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 67
- Cấu trúc rẽ nhánh IF Đối với cấu trúc rẽ nhánh thì vị trí của nhãn sẽ đứng ở sau lệnh nhảy: Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 68
- Ví dụ: Nhập một kí tự từ bàn phím, nếu là kí tự in thường thì đổi sang in hoa. Hiện kí tự ra màn hình. Thuật toán như sau: + Nhập một kí tự KT + IF (KT ≤ ‘z’) AND (KT ≥ ‘a’) THEN Đổi KT sang in hoa + Hiện KT ra màn hình Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 69
- TITLE DOI KI TU .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AH, 1 ;Nhập một kí tự INT 21h CMP AL, ’z’ JA HienChu ;Nếu AL > ’z’ thì hiện kí tự ra màn hình CMP AL, ’a’ JB HienChu ;Nếu AL < ’a’ thì hiện kí tự ra màn hình SUB AL, 20h ;Đổi kí tự sang in hoa HienChu: MOV AH, 2 ;Chức năng số 2: Hiện kí tự MOV DL, AL INT 21h MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 70
- Cấu trúc lặp Lặp không biết trước số lần lặp (While, Repeat) Lặp với số lần lặp biết trước (For) Lệnh lặp LOOP Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 71
- Đối với các cấu trúc lặp nói chung thì vị trí của nhãn sẽ đứng ở trước lệnh nhảy: Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 72
- Lặp không biết trước số lần lặp (While, Repeat) Ví dụ: Nhập một kí tự số từ bàn phím (‘0’, ‘1’, , ‘9’), đổi nó sang số thập phân tương ứng. Nhân đôi số đó. Thuật toán như sau: REPEAT Nhập một kí tự KT UNTIL (KT ≥ ‘0’) AND (KT ≤ ‘9’) Đổi KT sang số thập phân Nhân đôi số Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 73
- TITLE VI DU LAP .MODEL SMALL .STACK 100H .CODE MAIN PROC NhapLai: MOV AH, 1 ;Nhập một kí tự INT 21h CMP AL, ’0’ JB NhapLai ;Nếu AL ’9’ thì nhập lại SUB AL, 30h ;Đổi sang số thập phân tương ứng ;Các lệnh khác MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 74
- Giải thích: Kí tự ‘0’ có mã ASCII bằng 30h Kí tự ‘1’ có mã ASCII bằng 31h Kí tự ‘9’ có mã ASCII bằng 39h Để đổi kí tự số sang số thập phân tương ứng, ta lấy mã ASCII của nó đem trừ cho 30h. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 75
- Lặp với số lần lặp biết trước (For) Ví dụ: Hiện ra màn hình 10 số nguyên theo thứ tự: 0, 1, 2, 3, , 9. Thuật toán như sau: FOR I = 0 TO 9 DO Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 76
- TITLE VI DU LAP FOR .MODEL SMALL .STACK 100H .DATA I DB 0 ;Khởi tạo giá trị biến I bằng 0 .CODE MAIN PROC MOV AX, @DATA MOV DS, AX Lap: MOV DL, I ADD DL,30h ;Đổi số nguyên sang kí tự số tương ứng MOV AH, 2 ;Chức năng số 2: Hiện kí tự INT 21h INC I ;Tăng biến I lên 1 CMP I, 10 JNZ Lap ;Nếu I ≠ 10 thì lặp lại MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 77
- Lệnh lặp LOOP Đây là cấu trúc lệnh có sẵn trong hợp ngữ để thực hiện các vòng lặp biết trước số lần lặp. Cách viết lệnh như sau: MOV CX, NHANLAP: ;Các lệnh cần lặp LOOP NHANLAP Số lần lặp được đặt vào thanh ghi CX, sau mỗi lần lặp thì CX được tự động giảm đi 1. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 78
- TITLE VI DU LAP LOOP .MODEL SMALL .STACK 100H .DATA I DB 0 ;Khởi tạo giá trị biến I bằng 0 .CODE MAIN PROC MOV AX, @DATA MOV DS, AX MOV CX, 10 ;Số lần lặp Lap: MOV DL, I ADD DL,30h ;Đổi số nguyên sang kí tự số tương ứng MOV AH, 2 ;Chức năng số 2: Hiện kí tự INT 21h INC I ;Tăng biến I lên 1 LOOP Lap MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 79
- Hết Phần 2.2 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 80