Chuong 8 : Cau truc DK va Vong lap 1Chương 8 : Cấu trúc điều khiển và Vòng lặp Mục tiêu Biết cách mô phỏng cấu trúc điều khiển và vòng lặp như ở ngôn ngữ lập trình cấp cao.. Nắm được cá
Trang 1Chuong 8 : Cau truc DK va Vong lap 1
Chương 8 : Cấu trúc điều khiển và Vòng lặp
Mục tiêu
Biết cách mô phỏng cấu trúc điều khiển và vòng lặp như ở ngôn ngữ
lập trình cấp cao.
Nắm được các lệnh nhảy trong lập trình Assembly.
Trên cơ sở đó, vận dụng để lập trình giải quyết 1 số bài toán.
Trang 2Nội dung
Sự cần thiết của lệnh nhảy trong lập trình ASM.
Lệnh JMP (Jump) : nhảy không điều kiện.
Lệnh LOOP : cho phép lặp 1 công việc với 1 số lần nào đó.
Các lệnh so sánh và luận lý.
Lệnh lặp có điều kiện.
Lệnh nhảy có điều kiện.
Biểu diễn mô phỏng cấu trúc luận lý mức cao.
Chương trình con.
Một số chương trình minh họa.
Trang 3Sự cần thiết của lệnh nhảy
• Ở các chương trình viết bằng ngôn ngữ cấp cao thì
việc nhảy (lệnh GoTo) là điều nên tránh nhưng ở lập
trình hệ thống thì đây là việc cần thiết và là điểm
mạnh của 1 chương trình viết bằng Assembly.
Một lệnh nhảy CPU phải thực thi 1 đoạn lệnh ở 1 chỗ khác với nơi mà các lệnh đang được thực thi.
Trong lập trình, có những nhóm phát biểu cần phải lặp đi lặp lại nhiều lần trong 1 điều kiện nào đó Để đáp ứng điều kiện này ASM cung cấp 2 lệnh JMP và LOOP.
Trang 4Lệnh JMP (J((((
• Công dụng :Chuyển điều khiển không điều kiện.
•• Nhảy gần (NEAR) : 1 tác vụ nhảy trong cùng 1
segment.
•• Nhảy xa (FAR) : 1 tác vụ nhảy sang segment
khác.
•• Cú pháp : JMP đích
Trang 5Cacù lệnh chuyển điều khiển
Chuyển điều khiển vô điều kiện
Chuyển điều khiển có điều kiện
JMP [ SORT | NEAR PTR |FAR PTR ] DEST
JConditional destination
Ex : JNZ nhãn đích ;
Trang 6LỆNH LOOP
Công dụng : cho phép lặp 1 công việc với 1 số lần nào đó
Mỗi lần lặp CX giảm đi 1 đơn vị Vòng lặp chấm dứt khi CX =0.
Ex 1 : xuất ra màn hình 12 dòng gồm các ký tự A.
MOV CX, 12 * 80
MOV DL, ‘A’
NEXT :
MOV AH, 2 INT 21H
LOOP NEXT
Trang 7LOOP (tt)
Ex : có 1 Array A gồm 6 bytes, chép A sang array B – dùng SI và
DI để lấy Offset
MOV SI, OFFSET A
MOV DI, OFFSET B
MOV CX, 6
MOVE_BYTE :
MOV AL, [SI]
MOV [DI], AL
INC SI
INC DI
LOOP MOVE_BYTE
A DB 10H,20H,30H,40H,50H,60H
B DB 6 DUP (?)
Trang 8CÁC LỆNH LUẬN LÝ
Lưu ý về các toán tử LOGIC :
AND 2 Bit : kết quả là 1 khi và chỉ khi 2 bit là 1
OR 2 Bit : kết quả là 1 khi 2 Bit có bit là 1
XOR 2 Bit : kết quả là 1 chỉ khi 2 bit khác nhau
NOT 1 Bit : lấy đảo của Bit này
Lưu ý về thanh ghi cờ :
Cờ ZERO được lập khi tác vụ cho kết quả là 0
Cờ CARRY được lập khi cộng kết quả bị tràn hay trừ phải mượn
Cờ SIGN được lập khi bit dấu của kết quả là 1, tức kết quả là số âm
Trang 9Lệnh AND
Công dụng :
Lệnh này thực hiện phép AND giữa 2 toán hạng, kết quả cuối
cùng chứa trong toán hạng đích.
Dùng để xóa các bit nhất định của toán hạng đích giữ nguyên
các bit còn lại.
Cú pháp : AND Destination , Source
Muốn vậy ta dùng 1 mẫu bit gọi là mặt nạ bit (MASK),
các bit mặt nạ được chọn để sao cho các bit tương ứng
của đích được thay đổi như mong muốn
Trang 10Lệnh AND
Ex1 : xoá bit dấu của AL, giữ nguyên các bit còn lại :
dùng AND với 01111111b làm mặt nạ
AND AL, 7FH
Ex2 :
MOV AL, ‘5’ ; Đổi mã ASCII của số
AND AL, 0FH ; thành số tương ứng
Ex3 :
MOV DL, ‘a’ ; Đổi chữ thường thành chữ hoa
AND DL, 0DFH ; thành số tương ứng
Mask bits
Mask bits
Trang 11LỆNH OR
Công dụng : dùng để bật lên 1 số bit và giữ nguyên các bit khác
Cú pháp : OR destination, source
Ex1 :
OR AL , 10000001b ; bật bit cao nhất và bit thấp nhất trong thanh ghi AL lên 1
Ex 2:
MOV AL , 5 ; đổi 0 9 thành ký số
OR AL , 30h ; ASCII tương ứng
Ex 3:
OR AL , AL ; kiểm tra một thanh ghi có = 0
Nếu : cờ ZF được lập AL =0
cờ SIGN được lập AL <0
cờ ZR và cờ SIGN không được lập AL >0
Trang 12Việc xoá 1 thanh ghi
Ta có 3 cách để xoá 1 thanh ghi :
C1: MOV AX , 0
C2 : SUB AX, AX
C3 : XOR AX, AX
Mã lệnh 2 và 3 dài 2 bytes
Mã lệnh 1 dài 3 bytes
Lệnh 2,3 hiệu quả hơn
Tuy nhiên các thao tác giữa ô
nhớ và ô nhớ là không hợp lệ
nên khi cần xoá 1 ô nhớ ta
phải dùng lệnh 1
Trang 13LỆNH XOR
Công dụng : dùng để tạo đồ họa màu tốc độ cao
Cú pháp : XOR destination, source
Ex : lật bit cao của AL 2 lần
MOV AL , 00111011b ;
XOR AL, 11111111b ; AL = 11000100b
XOR AL, 11111111b ; AL = 00111011b
Trang 14LỆNH TEST
Cú pháp : TEST destination, source
Ex : kiểm tra bit 13 trong DX là 0 hay 1
TEST DX, 2000h
JZ BitIs0
BitIs1 : bit 13 is 1
BitIs0 : bit 13 is 0
Để kiểm tra 1 bit nào đó chỉ cần đặt bit 1 vào đúng vị trí bit cần kiểm tra và khảo sát cờ ZF
(nếu bit kiểm là 1 thì ZF sẽ xoá, ngược lại ZF được lập
Công dụng : dùng để khảo sát trị của từng bit hay nhóm bit.
Test thực hiện giống lệnh AND nhưng không làm thay đổi toán hạng đích.
Trang 15MINH HỌA LỆNH TEST
MOV AH, 2
INT 17h
TEST AL , 00100000b ; Test bit 5, nếu bit 5 = 1 máy in hết giấy
Ex : kiểm tra trạng thái máy in Interrupt 17H trong BIOS sẽ kiểm tra
trạng thái máy in, sau khi kiểm tra AL sẽ chứa trạng thái máy in Khi bit 5
của AL là 1 thì máy in hết giấy.
Lệnh TEST cho phép test nhiều bit 1 lượt.
Trang 16MINH HỌA LỆNH TEST(tt)
TEST AL, 1 ; AL chứa số chẳn ?
JZ A1 ; nếu đúng nhảy đến A1
Ex :viết đoạn lệnh thực hiện lệnh nhảy đến nhãn A1 nếu AL chứa số
chẵn.