Tải bản đầy đủ (.pdf) (14 trang)

Một số cấu trúc và giải thuật căn bản

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (82.99 KB, 14 trang )

26
CHƯƠNG 6 : MỘT SỐ CẤU TRÚC VÀ GIẢI THUẬT CĂN BẢN
6.1CẤU TRÚC IF
6.1.1IF Biến-A <= 5 THEN Biến-B:=1 ELSE Biến-B:=0
cmp Biến-A,5 ; So sánh Biến-A với 5
ja L1
mov Biến-B,1 ; Nhỏ hơn hay bằng
jmp L2
L1:
mov Biến-B,0 ; Lớn hơn
L2:
...
6.1.2IF Biến-A <= 5 THEN ..... ELSE Biến-B:=0
cmp Biến-A,5 ; So sánh Biến-A với 5
jbe L1
jmp L2
L1: ; Nhỏ hơn hay bằng
. ;
. ; Kích thước đoạn mã này lớn hơn
. ; 128 byte
.
jmp L3
L2: ; Lớn hơn
mov Biến-B,0
L3:
...
6.2CẤU TRÚC CASE
6.2.1Case Biến-A of 0 : Loại-A:=Loại-A+1;
1 : Loại-B:=Loại-B+1;
2 : Loại-C:=Loại-C+1;
3 : Loại-D:=Loại-D+1;


end;
cmp Biến-A,0
jne L1
inc Loại-A ; Loại-A:=Loại-A+1
jmp L4
L1:
cmp Biến-A,1
jne L2
inc Loại-B ; Loại-B:=Loại-B+1
jmp L4
L2:
27
cmp Biến-A,2
jne L3
inc Loại-C ; Loại-C:=Loại-C+1
jmp L4
L3:
cmp Biến-A,3
jne L4
inc Loại-D ; Loại-D:=Loại-D+1
jmp L4
L4: ; End-case
...
6.2.2Case Biến-A of ‘0’..’9’ : Loại:=0;
‘A’..’Z’ : Loại:=1;
end;
cmp Biến-A,’0’
jae L1
jmp L2
L1: ; Biến-A >=’0’

cmp Biến-A,’9’
ja L2
Mov Loại,0 ; Biến-A <=’9’
jmp L4
L2:
cmp Biến-A,’A’
jae L3
jmp L4
L3: ; Biến-A >=’A’
cmp Biến-A,’Z’
ja L4
Mov Loại,0 ; Biến-A <=’Z’
L4:
...
Chú ý : Để kiểm tra xem một giá trò có thuộc một khoảng cho trước hay không ta có thể dùng giải
thuật sau :
Khoảng cho trước : M1..M2
Giá trò cần kiểm tra : X đặt trong AL ( hoặc AX )
sub AL,M2+1 ; Kết quả âm nếu X <=M2 (1)
add AL,(M2-M1)+1 ; Kết quả âm nếu X < M1 (2)
jnc Không-thuộc-về ; tương đương với JAE
jc Thuộc-về ; tương đương với JB
Để chứng minh, hãy xem ảnh hưởng của các phép tính số học lên các cờ hiệu và tác dụng của cờ
hiệu lên các lệnh chuyển điều khiển có điều kiện.
Nếu X thuộc về M1..M2 thì phép tính (1) phải cho kết quả âm (2) phải cho kết quả dương. Kết quả
cộng hai phần tử, trong đó có một phần tử âm tạo thành một kết quả dương sẽ có bit tràn --> CF = 1
Chỉ thò JB được thực hiện nếu CF = 1
Chỉ thò JAE được thực hiện nếu CF = 0
28
6.2.3Chuyển điều khiển theo nhiều giá trò và cự ly chuyển điều khiển lớn hơn 128

cmp ah,0
je L1
cmp ah,1
je L2
cmp ah,2
je L3
cmp ah,010h
je L4
cmp ah,011h
je L5
cmp ah,012h
je L6
jmp End-case

L1: jmp Case-0
L2: jmp Case-1
L3: jmp Case-2
L4: jmp Case-10
L5: jmp Case-11
L6: jmp Case-12

Case-0:
...
jmp End-case
Case-1:
...
jmp End-case
Case-2:
...
jmp End-case

Case-10:
...
jmp End-case
Case-11:
...
jmp End-case
Case-12:
...

End-case:
...


29
6.3CẤU TRÚC FOR
6.3.1FOR Biến-A:=0 TO 100 DO ....
mov Biến-A,0
L1:
...
inc Biến-A
cmp Biến-A,100
ja L2
jmp L1
L2:
...
6.3.2Chỉ thò LOOP <nhãn>
Chỉ thò LOOP <nhãn> thực hiện như sau : trừ cx 1,kiểm tra cx đã bằng 0 chưa, nếu chưa sẽ chuyển
quyền điều khiển đến <nhãn> . Nếu cx = 0 thì tiếp tục làm các lệnh kế tiếp . Dùng chỉ thò LOOP để điều
khiển các vòng lặp làm chương trình của chúng ta trở nên ngắn gọn và thực hiện nhanh hơn. Trong khi
dùng chỉ thò LOOP để điều khiển vòng lặp hãy cẩn thận khi làm thay đổi giá trò của CX .

Thí dụ :
mov cx,10 ; Lặp 10 lần
L1:
push cx ; Bảo toàn CX

mov ah,2 ; Chức năng 02h interrupt 021h
mov dl,7 ; In mã số 7 : beep một tiếng
int 021h
pop cx ; Phục hồi CX
loop L1

Chú ý :
Khởi đầu quá trình LOOP nếu CX=0 thì vòng lặp sẽ thực hiện 65536 lần trước khi kết thúc ! Để
kiểm tra CX có bằng 0 hay không, ta có thể dùng chỉ thò JCXZ <nhãn> .Đây là một lệnh chuyển điều
khiển có điều kiện.Chuyển điều khiển được thực hiện nếu CX=0
Mỗi lần “loop” CX bò giảm 1 nhưng đây là phép toán nội của 8088, thanh ghi cờ hiệu hoàn toàn
không bò ảnh hưởng . Do đó khi kết thúc quá trình lặp mặc dù CX luôn bằng 0 nhưng hiện tượng này
không được ghi nhận bởi cờ hiệu ZF.
6.4MỘT SỐ KỸ THUẬT CĂN BẢN
6.4.1Xóa/Dựng/Đảo một bit
Xóa bit 2 của AL
AND AL,NOT 4 ; 11111011b
Dựng bit 2 của AL
OR AL,4 ; 00000100b

NOT bit 2 của AL
XOR AL,4 ; 00000100b
30

6.4.2Kiểm tra một bit

...
test al,8 ; kiểm tra bit 3 của AL
jz L2
L1: ; Bằng 1
...
jmp L3
L2: ; Bằng 0
...
L3:
6.4.3Kiểm tra nhiều bit đồng thời khác không
...
and al,8 OR 4 ; Xóa các bit khác bit 3 và bit 2
cmp al,8 OR 4 ; Kiểm tra bit 3 và bit 2
jne L2
L1: ; Đồng thời bằng 1
...
jmp L3
L2: ; Có ít nhất 1 bit bằng 0
...
L3:
6.4.4Kỹ thuật nhân và chia trên số nhò phân
Tác vụ nhân và chia thường chiếm nhiều thời gian thực hiện hơn các tác vụ cộng trừ, shift ... Do đó
các chương trình assembler thường cố gắng chuyển các tác vụ nhân chia thành những đoạn chương trình
chỉ gồm các tác vụ cộng trừ và shift, rol ...
Ta có các số tính chất sau :
- Shift left 1 bit trên một giá trò nhò phân cho kết quả tương tự nhân giá trò nhò phân đó cho 2
- Shift right 1 bit trên một giá trò nhò phân cho kết quả tương tự chia giá trò nhò phân đó cho 2
Thí dụ 1 :
Nhân một giá trò với 10 . Dùng quy tắc A*10 = A*8+A*2
mov ax,giá-trò-đầu ;

shl ax,1 ; AX = giá-trò-đầu*2
mov bx,ax ; BX = giá-trò-đầu*2
shl ax,1 ; AX = giá-trò-đầu*2*2
shl ax,1 ; AX = giá-trò-đầu*2*2*2
add ax,bx ; AX = giá-trò-đầu*(2*2*2+2)
; AX = giá-trò-đầu*10
Thí dụ 2 : Nhân một giá trò với 14. Dùng quy tắc A*14 = A*16-A*2
mov ax,giá-trò-đầu ;
shl ax,1 ; AX = giá-trò-đầu*2
mov bx,ax ; BX = giá-trò-đầu*2
shl ax,1 ; AX = giá-trò-đầu*2*2
shl ax,1 ; AX = giá-trò-đầu*2*2*2

×