giao trinh thuc hanh_vxl

30
Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông PHẦN 1: LẬP TRÌNH HỢP NGỮ CHO HỌ x86 BÀI 1: CĂN BẢN VỀ HỢP NGỮ 1. MỤC ĐÍCH Làm quen với ngôn ngữ lập trình Assembly Biết cách viết, dịch, chạy một vài chương trình đơn giản trên chương trình mô phỏng Emu8086 2. TÓM TẮT LÝ THUYẾT Hợp ngữ (assembler) là ngôn ngữ bậc thấp, giúp cho người lập trình không phải ghi nhớ mã máy (opcode) mà sử dụng các từ ngữ gợi nhớ (pseudo-code) gần với ngôn ngữ tự nhiên để miêu tả công việc cần thực hiện. Tuy vậy, assembler rất gần với ngôn ngữ máy, đòi hỏi người lập trình phải hiểu biết tương đối đầy đủ về cấu trúc phần cứng máy tính. Với mỗi kiểu kiến trúc của bộ vi xử lý, có một bộ lệnh riêng, do đó, có một ngôn ngữ assembler riêng cho nó. Ở đây, chúng ta nghiên cứu assembler cho các bộ vi xử lý Intel thuộc họ x86. Các chương trình sẽ được viết trên chương trình mô phỏng Emu8086. Tuy chương trình mô phỏng không thể hiện được đầy đủ các tập lệnh có trong họ 8086. Ngược lại, chương trình mô phỏng giúp ta tìm hiểu về hợp ngữ một cách trực quan và dễ hiểu. 2.1. Cấu trúc thông thường của một chương trình hợp ngữ được viết trên Emu8086: #make_COM# <Khai báo chương trình dang .com> .stack <Khai báo kích thước ngăn xếp> .data <Khai báo dữ liệu> .code ORG 100h ; COM file is loaded at CS:0100h <Các lệnh> End Chúng ta có bỏ qua các khai báo về “.model”, “.stack”, “.data”, “.code” và “end” khi chạy trên chương trình mô phỏng. Ví dụ: Chương trình sau in ra màn hình dòng chữ “Hello, World!” #make_COM# ; Standard header Trang 30

Upload: gaikieuuc

Post on 01-Jul-2015

488 views

Category:

Documents


26 download

TRANSCRIPT

Page 1: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

PHẦN 1: LẬP TRÌNH HỢP NGỮ CHO HỌ x86

BÀI 1: CĂN BẢN VỀ HỢP NGỮ1. MỤC ĐÍCH

Làm quen với ngôn ngữ lập trình Assembly

Biết cách viết, dịch, chạy một vài chương trình đơn giản trên chương trình mô phỏng Emu8086

2. TÓM TẮT LÝ THUYẾTHợp ngữ (assembler) là ngôn ngữ bậc thấp, giúp cho người lập trình không phải ghi nhớ mã

máy (opcode) mà sử dụng các từ ngữ gợi nhớ (pseudo-code) gần với ngôn ngữ tự nhiên để miêu tả công việc cần thực hiện. Tuy vậy, assembler rất gần với ngôn ngữ máy, đòi hỏi người lập trình phải hiểu biết tương đối đầy đủ về cấu trúc phần cứng máy tính.

Với mỗi kiểu kiến trúc của bộ vi xử lý, có một bộ lệnh riêng, do đó, có một ngôn ngữ assembler riêng cho nó. Ở đây, chúng ta nghiên cứu assembler cho các bộ vi xử lý Intel thuộc họ x86. Các chương trình sẽ được viết trên chương trình mô phỏng Emu8086. Tuy chương trình mô phỏng không thể hiện được đầy đủ các tập lệnh có trong họ 8086. Ngược lại, chương trình mô phỏng giúp ta tìm hiểu về hợp ngữ một cách trực quan và dễ hiểu.

2.1. Cấu trúc thông thường của một chương trình hợp ngữ được viết trên Emu8086:

#make_COM# <Khai báo chương trình dang .com>.stack <Khai báo kích thước ngăn xếp>.data <Khai báo dữ liệu>.codeORG 100h ; COM file is loaded at CS:0100h

<Các lệnh>

End

Chúng ta có bỏ qua các khai báo về “.model”, “.stack”, “.data”, “.code” và “end” khi chạy trên chương trình mô phỏng.

Ví dụ: Chương trình sau in ra màn hình dòng chữ “Hello, World!”

#make_COM# ; Standard headerORG 100H

JMP START ; Jump to start:msg DB 13, 10, 'Hello, World!$‘ ; Data

START: LEA DX, msg ; Load address of msg to DX register

MOV AH, 9 ; Print using DOS interruptINT 21h

MOV AH, 4Ch ; Exit to operating systemINT 21h

Trang 20

Page 2: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Lưu ý:- Mọi chương trình đều phải có đoạn code thoát khỏi chương trình, nếu không chương

trình sẽ không dừng khi hết chương trình của mình.

2.2. Khai báo biến trong hợp ngữ

Cú pháp:<tên biến> D<Kiểu DL> <giá trị khởi tạo>

hoặc<tên biến> D<Kiểu DL> <số phần tử> dup(<giá trị khởi tạo>)

Các kiểu dữ liệu: B (1 byte), W (2 bytes), D (4 bytes)Nếu không khởi tạo, dùng dấu hỏi “?”

Ví dụ:

Khai báo trong C Khai báo trong hợp ngữchar ch; ch DB ? char ch = ‘a’; ch DB ‘a’char ch = 5; ch DB 5char s[]=”\nhello world!” s DB 10,13,”hello world!$”int i=100; i DW 100long l; l DD ?char a[] = {1,2,3}; a DB 1,2,3char a[100]; a DB 100 dup(?)char a[100][50]; a DB 100 dup(50 dup(?))

2.3. Dịch, liên kết, chạy và chẩn lỗi chương trình từ dấu nhắc DOS

Để tạo một chương trình dạng .com, ta chọn File/New/COM Template như hình 1.1

Hình 1.1: Cách tao chương trình trên Emu8086

Để biên dịch chương trình, ta chọn Compile. Ta có thể mô phỏng trực tiếp bằng cách chọn

Emulate. Màn hình sẽ hiện thị lên như hình 1.2

Trang 20

Page 3: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Hình 1.2: Giao diện chương trình mô phỏng

Trên chương trình mô phỏng, ta có thể quan sát được nội dụng các thanh ghi, dữ liệu lưu trong bộ nhớ, màn hình, bộ ALU, Stack, thanh ghi cờ… Ngoài ra, ta có thể chạy chương trình (chọn Run) hoặc thực hiện từng lệnh (Single Step).

2.4. Một số lệnh cơ bản

MOV des,src : chép dữ liệu từ src sang desINC des : tăng des một đơn vịDEC des : giảm des một đơn vịADD des,src : des = des + srcSUB des,src : des = des – srcINT num : gọi ngắt

3. THỰC HÀNH

3.1. Bài tập B à i 1. Viết CT nhập vào 1 ký tự, xuất ra ký tự đó

V í dụ : Nhap 1 ky tu: bKy tu vua nhap: b

B à i 2. Viết chương trình xuất ra màn hình một số dòng chữVí dụ: Dai hoc Quoc gia Thanh pho Ho Chi MinhTruong Dai hoc Khoa hoc tu nhienKhoa Dien tu – Vien thong

Trang 20

Page 4: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Bài 3. Viết CT nhập vào 1 ký tự, xuất ra ký tự liền trước và liền sau.V í dụ :

Moi ban nhap 1 ky tu: bKy tu lien truoc: aKy tu lien sau: c

Bài 4. Viết CT nhập vào 1 ký tự thường. In ra ký tự HoaV í dụ :

Moi ban nhap 1 ky tu: bKy tu hoa la: B

Bài 5. Viết CT nhập vào 1 ký tự hoa. In ra ký tự thườngVí dụ:

Moi ban nhap 1 ky tu: BKy tu thuong la: b

Bài 6. Viết chương trình nhập vào 2 số nguyên dương x1, x2 (1 x2 < x1 < 9). Xuất ra kết quả các phép tính: 3x1 + 5x2

Ví dụ:x1 = 3x2 = 43x1 + 5X2 = 29

3.2. Hướng dẫnBài 1. Để nhập 1 một ký tự sử dụng hàm 1 của ngắt 21h, để xuất, sử dụng hàm 2.

Ví dụ:mov AH,1int 21h ; kết quả trong AL

mov DL,AL ; kí tự cần xuất trong DLmov AH,2int 21h

Bài 2. Cặp kí tự xuống dòng là 10,13. Có thể khai báo nhiều xâu kí tự hoặc chung một xâu.Ví dụ: Msg1 DB 13,10,‘ Dai hoc Quoc gia Thanh pho Ho Chi Minh$’Msg2 DB 13,10,’ Truong Dai hoc Khoa hoc tu nhien$’

Hoặc

Msg12 DB 13,10, ‘Dai hoc Quoc gia Thanh pho Ho Chi Minh’ DB 13,10, ’Truong Dai hoc Khoa hoc tu nhien$’

Bài 3, 4. Kí tự hoa và kí tự thường của cùng một chữ cái tiếng Anh cách nhau 20h. Do đó, để chuyển đổi chữ hoa thành chữ thường và ngược lại, chỉ cần dùng lệnh ADD, SUB.

Bài 5. Để chuyển đổi các kí tự ‘0’ – ‘9’ thành số 0 – 9 chỉ cần thực hiện phép trừ đi 30h (mã của ‘0’). Sau khi thực hiện phép tính, chuyển đổi thành kí tự và in ra màn hình. Kết quả phép tính có thể ở dạng số có 2 chữ số. Vì vậy, ta phải tách hàng chục và hàng đơn vị hiển thị riêng bằng cách thực hiện phép chia.

Trang 20

Page 5: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

BÀI 2: CÁC CHỈ THỊ LOGIC VÀ ĐIỀU KHIỂN

1. MỤC ĐÍCHHiểu cách so sánh hai số trong hợp ngữHiểu cách thay đổi thứ tự thực hiện các lệnhBiết cách sử dụng các lệnh so sánh, nhảy và lặp

2. TÓM TẮT LÝ THUYẾT

2.1. Lệnh so sánhTrong hợp ngữ, muốn so sánh hai số, ta phải thực hiện một phép toán số học hoặc logic trên

hai số đó và căn cứ vào các bit trong thanh ghi cờ rồi đưa ra kết luận. Để làm việc này, có thể dùng lệnh CMP và TEST.

Bản chất của lệnh CMP Des,Src là lệnh SUB Des,Src (thực hiện phép tính Des – Src) nhưng kết quả của phép tính không được lưu vào Des như trong lệnh SUB.

Ví dụ: so sánh hai số nguyên dươngMOV AH,1MOV AL,2CMP AH,AL

Sau khi thực hiện hai lệnh trên, cờ Carry (CF) bật, báo hiệu rằng AH < AL

Bản chất của lệnh TEST Des,Src là lệnh AND Des,Src (thực hiện phép tính Des AND Src) nhưng kết quả của phép tính không được lưu vào Des như trong lệnh AND.

Ví dụ: kiểm tra hai bit cuối cùng của ALTEST AL,3 ; 3h = 11b

Nếu cờ Zero (ZF) bật, có nghĩa là cả hai bit 0 và 1 của AL đều bằng 0.

2.2. Lệnh nhảy

Thông thường, khi một lệnh (instruction) được thực hiện, giá trị của thanh ghi IP (instruction pointer) được tự động cập nhật để trỏ đến lệnh kế tiếp. Ngoài ra, nội dung của thanh ghi IP chỉ có thể bị thay đổi thông qua một số lệnh đặc biệt. Đó là: các lệnh nhảy (J*), lệnh lặp (LOOP*), lệnh gọi hàm (call, ret), lệnh gọi ngắt (int, iret). Các lệnh này được xếp vào nhóm “Lệnh điều khiển luồng” (Program flow control instructions). Trong bài thực hành này, chúng ta sẽ học cách sử dụng các lệnh nhảy và các lệnh lặp.

Lệnh nhảy không điều kiện

JMP <target>

Có các trường hợp sau:+ JMP SHORT <tên nhãn> (short jump). Khi đó trong mã lệnh lưu 1 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này chỉ nhảy trong phạm vi từ –128 đến +127 byte so với vị trí hiện tại.

Ví dụ: JMP SHORT Calculate

+ JMP <tên nhãn> (near jump). Khi đó trong mã lệnh lưu 2 byte khoảng cách (offset) giữa vị trí hiện tại và vị trí cần nhảy đến. Kiểu này nhảy tùy ý trong phạm vi segment.

Ví dụ: JMP Calculate

Trang 20

Page 6: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

+ JMP FAR PTR <tên nhãn> (far jump). Khi đó trong mã lệnh lưu offset và segment của vị trí cần nhảy đến. Kiểu này nhảy đến bất kì chỗ nào.

Ví dụ: JMP FAR PTR Calculate

+ JMP <con trỏ 2 byte> (near indirect jump). Khi đó trong mã lệnh lưu địa chỉ offset của một ô nhớ. Khi thực hiện, IP sẽ được gán bằng giá trị lưu tại địa chỉ này. Có thể kết hợp dùng với định vị chỉ số.

+ JMP <con trỏ 4 byte> (far indirect jump). Tương tự trường hợp trên, nhưng con trỏ gồm cả segment và offset. Chỉ khác ở khai báo con trỏ

+ JMP <thanh ghi 2 byte> (indirect jump via regs). Nhảy đến địa chỉ lưu trong thanh ghi AX.

Ví dụ:MOV ax, offset Calculate...JMP ax ; (IP ← AX)

Lệnh nhảy có điều kiện

J.... <Label>

Các lệnh nhảy có điều kiện bắt đầu bằng chữ J sau đó là các chữ cái biểu thị điều kiện (ví dụ JGE ah,5: Jump if Greater than or Equal, nhảy nếu AH lớn hơn hay bằng 5), tiếp sau là một tên nhãn. Tùy thuộc vào trạng thái các cờ hiệu mà bộ vi xử lý có thực hiện việc nhảy đến nhãn hay không.

Đối với bộ vi xử lý 80286 trở xuống, lệnh nhảy có điều kiện có độ dài 2 byte, byte đầu tiên chứa mã lệnh, byte thứ hai chứa khoảng cách tương đối từ lệnh đến nhãn, vì vậy <Label> trong lệnh nhảy có điều kiện phải nằm trong khoảng từ -128 đến 127 so với vị trí lệnh nhảy. Muốn nhảy xa hơn ta phải dùng kết hợp lệnh nhảy không điều kiện JMP

Từ 80386 trở lên, bộ lệnh được bổ sung, cho phép sử dụng lệnh nhảy có điều kiện có độ dài 4 byte, do đó <Label> có quyền nằm tùy ý trong cùng phạm vi segment.

Khi sử dụng lệnh nhảy có điều kiện sau khi thực hiện phép so sánh, phải đặc biệt lưu ý toán hạng trong phép so sánh là số có dấu (signed) hay không có dấu (unsigned) để lựa chọn lệnh cho phù hợp.

Ví dụ:MOV AH,AL ; AL hiện bằng 128CMP AH,1JGE Greater ; AH > 1 nhưng không nhảy ????. . .

Greater:Có ba nhóm lệnh nhảy cơ bản là: kiểm tra cờ dấu, kiểm tra một số có dấu và kiểm tra một số không dấu.

Trang 20

Page 7: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Các lệnh nhảy kiểm tra cờ dấu:

Các lệnh nhảy kiểm tra một số có dấu:

Các lệnh nhảy kiểm tra một số không dấu:

Trang 20

Page 8: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Một số lệnh nhảy có điều kiện thường dùng : JE, JZ (nhảy nếu bằng). JA (nhảy nếu lớn hơn, không dấu), JG (nhảy nếu lớn hơn, có dấu), JB (nhảy nếu nhỏ

hơn, không dấu), JL (nhảy nếu nhỏ hơn, có dấu). JAE (nhảy nếu lớn hơn hay bằng, không dấu), JGE (nhảy nếu lớn hơn hay bằng, có

dấu), JBE (nhảy nếu nhỏ hơn hay bằng, không dấu), JLE (nhảy nếu nhỏ hơn hay bằng, có dấu).

JNE, JNZ (nhảy nếu không bằng).

Ví dụ: nếu AL là số nguyên không dấu thì đoạn chương trình ở trên phải sửa lại như sau:MOV AH,ALCMP AH,1JAE Greater. . .

Greater:

3.3. Lệnh lặp

Bằng cách dùng các lệnh nhảy có thể tạo ra vòng lặp. Tuy nhiên, để viết chương trình tiện lợi và ngắn gọn, có thể dùng thêm các lệnh lặp như LOOP, LOOPZ,…

Lệnh LOOP <Label> tự động giảm CX một đơn vị, sau đó kiểm tra xem CX có bằng 0, nếu không bằng thì nhảy đến nhãn <Label>

Lệnh LOOPZ <Label> tự động giảm CX một đơn vị, sau đó kiểm tra xem CX có bằng 0 hoặc cờ ZF có bật không, nếu cả hai điều này không xảy ra thì nhảy đến nhãn <Label>

Ví dụ: Nhập mảng A gồm 10 ký tự

MOV SI, 0 ; chỉ số mảngMOV CX, 10 ; số lần lặp

LAP:;nhập ký tựMOV AH, 1INT 21HMOV A[SI], ALINC SI

; xuất ký tựMOV AH, 2INT 21H

LOOP LAP

Trang 20

Page 9: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Các lệnh lặp

3. BÀI TẬP

Bài 1. Viết chương trình cho nhập 1 ký tự từ màn hình và xuất câu thông báo chào buổi sáng, buổi trưa hay buổi chiều tương ứng với ký tự nhậpvào là 'S', 's', 'T', 't', 'C', 'c'.

Bài 2. Nhập 2 số nguyên dương thuộc N, M thuộc [0..9], nhập 1 ký tự Char. Xuất ra màn hình ma trận gồm N dòng và M cột gồm ký tự Char.

Ví dụ: N=3, M=4, C='*' * * * *

* * * ** * * *

Bài 3: Viết chương trình cho chữa A chạy xung quanh màn hìnhBài 4. Dùng lệnh lặp, viết chương trình nhập vào 1 chuỗi ký tự. Sau khi nhập xong đếm xem chuỗi có bao nhiêu ký tự. Xuất số ký tự có trong chuỗi.

Ví dụ: S = "Hello world !" ==> Số kí tự trong chuỗi là 13.

Bài 5. Viết chương trình cho phép nhập vào một chuỗi S.Đổi tất cả ký tự thường thành ký tự hoa.Đổi tất cả ký tự hoa thành ký tự thường.

Trang 20

Page 10: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

BÀI 3: LỆNH LOGIC VÀ SỐ HỌC

1. MỤC ĐÍCHBiết sử dụng các phép toán logic, số họcBiết cách đổi giữa các cơ số nhị phân, thập phân và thập lục phân

2. TÓM TẮT LÝ THUYẾT

2.1. Phép toán trên bit NOT – Đảo mỗi bit và không ảnh hưởng đến cờ,NEG – lấy số bù 2, ảnh hưởng đến cờ CF, ZF, SF, OF, PF, AFAND - AND logic giữa các bit của hai toán hạng.OR - OR logic giữa các bit của 2 toán hạng. XOR - XOR logic giữa các bit của 2 toán hạng.

Các lệnh dịch bit SHL và SHR : dịch các bit của toán hạng đích sang trái (hoặc phải) một hay nhiều bit.

SHL (SHR) Đích, 1 hoặc SHL (SHR) Đích, CL CL là số lần dịch bit.Việc dịch bit trái (phải) tương ứng với phép nhân (chia) cho lũy thừa 2. Chú ý : Hiện tượng tràn số có thể xảy ra và cờ CF chứa bit cuối cùng bị dịch ra khỏi toán hạng.Để dịch bit với các số âm ta nên dùng SAL hoặc SAR tương ứng. Các lệnh quay ROL và ROR : dịch các bit của toán hạng đích sang trái (phải) một hay nhiều bit theo vòng tròn. ROL (ROR) Đích, 1 hoặc ROL (ROR) Đích, CL CL là số lần quay bit, cờ CF sẽ chứa giá trị bit bị dịch ra khỏi toán hạng. Chú ý : Để dịch bit qua cờ nhớ ta dùng RCL hoặc RCR tương ứng. Ví dụ : Sử dụng lệnh ROL để đếm số bit 1 trong thanh ghi BX XOR AX,AX MOV CX,16TOP : ROL BX, 1 JNC NEXT ; kiểm tra có phải là bit 0 không INC AX ; nếu không phải thì tăng số bit 1NEXT: LOOP TOP ; lặp cho đến khi làm xong

2.2. Lệnh số học

Lệnh: ADD, SUBCác toán hạng tương thích:

REG, memorymemory, REGREG, REGmemory, immediateREG, immediate

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.memory: [BX], [BX+SI+7], biến,...immediate: 5, -24, 3Fh, 10001101b,...

Kết quả thưởng lưu ở toán hạng thứ nhất.

Trang 20

Page 11: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

ADD – cộng toán hạng thứ 2 với toán hạng thứ nhất. SUB – trừ toán hạng thứ hai với toán hạng thứ nhất.

Ví dụ : ADD AL , 10H -> AL = AL + 10HSUB BL, 10H -> BL = BL – 10H

Ngoài ra ta có lệnh INC, DEC dùng để tăng/giảm 1 đơn vị và ảnh hưởng đến các cờ: ZF, SF, OF, PF, AF.

Lệnh: MUL, IMUL, DIV, IDIV

Các toán hạng tương thích:REGmemory

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.memory: [BX], [BX+SI+7],biến,...Lệnh MUL và IMUL chỉ ảnh hưởng đến cờ: CF, OFKhi kết quả vượt quá kích thứớc của toán hạng toán hạng thì các cờ là 1, ngược lại thì các cờ là 0. • MUL – nhân không dấu:

+ Khi toán hạng là một byte:AX = AL * operand.

+ Khi toán hạng là một word:(DX AX) = AX * operand.

• IMUL – nhân số có dấu: + Khi toán hạng là một byte:

AX = AL * operand. + Khi toán hạng là một word:

(DX AX) = AX * operand. • DIV – chia không dấu:

+Khi toán hạng là một byte:AL = AX / operandAH = remainder (modulus).

+ Khi toán hạng là một word:AX = (DX AX) / operandDX = remainder (modulus).

• IDIV - Signed divide: Khi toán hạng là một byte:AL = AX / operandAH = remainder (modulus).

+ Khi toán hạng là một word:AX = (DX AX) / operandDX = remainder (modulus). .

Trang 20

Page 12: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

3. BÀI TẬP

Bài 1: Viết chương trình đổi một số dạng thập phân sang thập lục phân. Ví dụ: Nhập một số hệ 10 : 26 Dạng thập lục phân: 1A

Bài 2: Viết chương trình nhập một số hệ thập phân rồi xuất ra biểu diễn dạng nhị phân của nó.Ví dụ: Nhập số hệ 10: 26 Dạng nhị phân: 11010

Bài 3: Viết chương trình đổi một số dạng thập lục phân sang sang thập phân.Ví dụ: Nhập số hệ thập lục phân: 1a (hoặc 1A) Dạng thập phân của nó là: 26

Bài 4: Viết chương trình đổi một số dạng thập lục phân sang nhị phân Ví dụ: Nhập số hệ thập lục phân: 1a (hoặc 1A) Dạng biểu diễn nhị phân là : 00011010

Bài 5: Viết chương trình đổi một số dạng nhị phân sang thập phânVí dụ: Nhập một số nhị phân: 11010 Dạng thập phân là: 26

Bài 6: Viết chương trình đổi một số dạng nhị phân sang thập lục phânVí dụ: Nhập một số nhị phân: 11010 Dạng thập lục phân là: 1A

Trang 20

Page 13: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

BÀI 4: LẬP TRÌNH ĐIỀU KHIỂN CÁC THIẾT BỊ ẢO (VI)

1. MỤC ĐÍCHLàm quen với cách lập trình điều khiển thiết bịVận dụng tổng hợp các kiến thức đã biết để xây dựng chương trình

2. GIỚI THIỆU CÁC THIẾT BỊ ẢO

2.1. Xuất nhập Bộ nhập gồm giá trị 8 bit không dấu tại địa chỉ 110 và giá trị 16 bit có dấu tại địa chỉ 112.Bộ xuất gồm giá trị 8 bit không dấu tại địa chỉ 115 và giá trị 16 bit có dấu tại địa chỉ 117.Để nhập một giá trị ra port, ta dùng lệnh IN Ví dụ:

in al,110; Nhập giá trị tại địa chỉ 110 vào thanh ghi alĐể xuất một giá trị ra port, ta dùng lệnh OUT Ví dụ:

mov al,215out 115,al; Nhập giá trị tại địa chỉ 110 vào thanh ghi al

Hình 4.1. Giao diện xuất nhập và chương trình ví dụ

Chương trình ví dụ sẽ thực hiện các nhiệm vụ sau:Xuất giá trị 215 ra địa chỉ 115Xuất giá trị 1234 ra địa chỉ 117Nhập giá trị địa chỉ 110 vào thanh ghi alNhập giá trị địa chỉ 112 vào thanh ghi ax

Lưu ý: Ta có thể dùng lệnh IN và OUT để truy xuất cổng của máy tính.

Trang 20

Page 14: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

2.2. Led – Port 199 (word)

Hình 4.2: Giao diện Led và chương trình ví dụ

Chương trình mô phỏng hổ trợ 5 Led 7 đoạn hiển thị thập phân tại địa chỉ 199. Do các Led đã được giải mã, nên ta không cần giải mã Led.

2.3. Bảng đèn giao thông – Port 4 (Word)Bảng đèn giao thông được điều khiển bằng cách gởi data ra port 4. Có 12 đèn: 4 đèn

xanh, 4 đèn vàng và 4 đèn đỏ.Ta có thể thiết lập trạng thái mỗi đèn bằng cách gởi ra bit để thiết lập

1 – đèn sáng0 – đèn tắt

Chỉ có 12 bit được dùng (0 đến 11), các bit cuối (12 đến 15 không sử dụng)Ví dụ:

mov ax, 0000001011110100bout 4, ax

Hình 4.3. Hình bảng đèn giao thông và chương trình ví dụ hiện thị từng Led

Các số màu vàng trên hình chỉ thứ tự các bit trong bảng đènTa có thể đọc trạng thái bảng đèn giao thông bằng các dùng lệnh

in ax,4

Trang 20

Page 15: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

2.4. Nhiệt kế, lò đốt Bộ nhiệt kế, lò đốt và thiết bị I/O được điều khiển như sau: dữ liệu đo từ nhiệt kế được

hiển thị tại port 125, bộ điều khiển lò đốt được điều khiển bằng bit thứ 0 của địa chỉ 127. Nếu bit này là “0”, thực hiện mở lò. Ngược lại, nếu bit này là “1”, thực hiện đóng lò. Ta có thể tác động để tác mở lò bằng cách nhấn nút On/Off. Ô Air Temperature dùng thể thiết lập nhiệt độ của môi trường.

Hình 3.5. Nhiệt kế, lò đốt và chương trình ví dụ

Trang 20

Page 16: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

2.5. Robot - Port 9 (3 byte)

Hình 3.6. Mô hình robot

Robot được điều khiển bằng cách gởi data ra port 9.

Byte đầu tiên (port 9) là thanh ghi lệnh ( command register). Các giá trị thiết lập sẽ làm robot thực hiện 1 công việc như bảng sau:

decimal value

binary value

action

0 00000000 do nothing.

1 00000001 move forward.

2 00000010 Turn left.

3 00000011 Turn right.

4 00000100

examine. examines an object in front using sensor. when robot completes the task, result is set to data register and bit #0 of status register is set to 1.

5 00000101 switch on a lamp.

6 00000110 switch off a lamp.

Trang 20

Page 17: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Byte thứ hai (port 10) là thanh ghi dữ liệu (data register). Thanh ghi này được thiết lập sau khi robot hoàn thành lệnh kiểm tra.

decimal value binary value meaning

255 11111111 wall

0 00000000 nothing

7 00000111 switched-on lamp

8 00001000 switched-off lamp

Byte thứ ba (port 11) là một thanh ghi trạng thái. Các giá trị đọc từ trạng thái của port này sẽ quyết định trạng thái của Robot. Mỗi bit có một giá trị đặc biệt

bit number

Description

bit #0 zero when there is no new data in data register, one when there is new data in data register.

bit #1 zero when robot is ready for next command, one when robot is busy doing some task.

bit #2

zero when there is no error on last command execution, one when there is an error on command execution (when robot cannot complete the task: move, turn, examine, switch on/off lamp).

Chú ý rằng Robot là một dạng máy móc. Do đó chúng cần thời gian để thực hiện hoàn tất một lệnh. Ta nên thường xuyên kiểm tra trạng thái bit 1 của thanh ghi trạng thái trước khi gởi 1 lệnh ra port 9. Ta có thể dùng Tool box để thiết lập mô hình

Ví dụ:

MOV AL, 1 ; move forward.OUT 9, AL ;MOV AL, 3 ; turn right.OUT 9, AL ;MOV AL, 1 ; move forward.OUT 9, AL ;MOV AL, 2 ; turn left.OUT 9, AL ;MOV AL, 1 ; move forward.OUT 9, AL ;

Trang 20

Page 18: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Chương trình ví dụ: Robot đi một vòng quanh sân. Khi robot gặp đèn đang tắt thì robot sẽ bật sáng đèn này. Ngược lại, nếu robot gặp đèn đang sáng thì tắt đèn này. Bài toán chỉ giải quyết trong trường hợp robot gặp 1 đèn ( và đèn không ở nằm ở góc sân ).

Trang 20

Page 19: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

Trang 20

Page 20: Giao Trinh Thuc Hanh_VXL

Trường Đại học Khoa học tự nhiên TPHCM Khoa Điện tử - Viễn thông

3. THỰC HÀNH

Câu 1: Viết chương trình hiển thị ra Led 7 đoạn và thiết bị xuất 8 bit giá trị nhập vào từ địa chỉ 110.

Câu 2: Trong bảng đèn giao thông, ta giả sử ngã tư là giao lộ của đường A và B. Viết chương trình sau cho thời gian lưu thông trên đường A là 1s và đường B là 0.5s

Câu 3: Viết chương trình điều khiển lò nung để nhiệt độ của nhiệt kế luôn lớn hơn môi trường là 5oC (sai số là 1oC).

Câu 4: Viết chương trình cho Robot đi một vòng xung quanh sân. Nếu Robot gặp đèn thì sẽ bật sáng đèn nếu gặp tường thì dừng lại.

Câu 5: Viết chương trình điều khiển khi robot gặp tường thì sẽ bật lò nung. Khi nhiệt độ của nhiệt kế lớn hơn nhiệt độ môi trường 5oC thì robot sẽ tìm và tắt đèn robot gặp đầu tiên.

Trang 20