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

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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

26 CHƯƠNG 6 : MỘT SỐ CẤU TRÚC 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 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ò 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 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 bit 2 cmp al,8 OR 4 ; Kiểm tra bit 3 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 chia trên số nhò phân Tác vụ nhân 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ừ 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 31 shl ax,1 ; AX = giá-trò-đầu*2*2*2*2 add ax,bx ; AX = giá-trò-đầu*(2*2*2*2-2) ; AX = giá-trò-đầu*14 6.5MỘT SỐ GIẢI THUẬT CHUYỂN ĐỔI 6.5.1Tạo chuỗi số dec từ một giá trò nhò phân 2 byte (Không đònh dạng) Num-to-Dec proc near ; ; Input : ; AX = giá trò cần chuyển đổi ( 2 byte ) ; DS:SI = Buffer (Kích thước 5 byte,xóa trống bằng 020h) ; Output : ; Dec-string được đặt vào buffer canh theo lề phải ; push ax push bx push cx mov bx,5 mov cl,10 NTD1: div cl ; add ah,’0’ ; Chuyển số dư thành ký số ; Chú ý : ‘0’ ’9’ là các mã liên tục mov byte ptr [si+bx],ah dec bx ; bx = bx-1 xor ah,ah ; Chia al cho 10,số dư trong ah cmp al,0 jne NTD1 ; Nếu AL # 0 thì lặp lại pop cx pop bx pop ax ret Num-to-Dec endp 6.5.2Tạo chuỗi số dạng dec từ một giá trò nhò phân 4 byte (Có đònh dạng) Num-to-Dec proc near ; ; Input : ; DX,AX = giá trò cần chuyển đổi ( 4 byte ) ; DS:SI = Buffer ( Không cần phải xóa trống trước ) ; CX = Kích thước chuỗi số ( format/picture ) ; Cho CX = 0 sẽ tạo ra lỗi ; Output : ; Dec-string được đặt vào buffer canh theo lề phải ; 32 push ax push bx push cx push dx push si push di mov di,10 add si,cx NTD1: mov bx,ax ; BX = 2 byte thấp mov ax,dx ; Chia 2 byte cao cho 10 xor dx,dx div di xchg ax,bx ; (số-dư*65536 + 2 byte thấp)/10 div di add dl,’0’ ; Số dư chính là ký số cần tìm dec cx jcxz NTD3 NTD2: mov byte ptr ds:[si],dl dec si mov dx,bx or dx,ax jnz NTD1 mov dl,’ ‘ loop NTD2 NTD3: pop di pop si pop dx pop cx pop bx pop ax ret Num-to-Dec endp 6.5.3Tạo chuỗi số dạng dec từ một giá trò nhò phân 4 byte (Có đònh dạng) NUM-TO-DEC proc near ; ; Input : ; ; DX,AX = Giá trò cần chuyển đổi ; (DX : 2 byte cao, AX : 2 byte thấp) ; ES:DI = Đòa chỉ của buffer ; CH = Kích thước chuỗi số ( format/picture ) ; ; Output : 33 ; Dec-string được đặt vào buffer canh theo lề phải cld mov bx,ax ; DX,BX chứa giá trò cần đổi mov al,’ ‘ mov cl,9 ; Chuỗi số có chiều dài tối mov si,offset NTD-table ; đa 9 ký số NTD1: cmp dx,word ptr cs:[si+2] ; So sánh DX,BX với dword jb NTD2 ; đang được DS:SI chỉ đến ja NTD3 ; ( Bắt đầu từ hàng tỉ ) cmp bx,word ptr cs:[si] ; So sánh 2 byte cao trước jae NTD3 ; 2 byte thấp sau NTD2: add si,4 ; Dời đến hàng kế tiếp cmp ch,cl jbe NTD21 ; Xóa trống phần đầu buffer stosb ; NTD21: dec cl jnz NTD1 NTD3: inc cl NTD4: mov al,’0’-1 NTD5: inc al sub bx,word ptr cs:[si] ; Trừ hai giá trò 4 byte sbb dx,word ptr cs:[si+2] ; jnc NTD5 ; Kết quả vẫn chưa âm add bx,word ptr cs:[si] ; Nếu kết quả âm, trả lại adc dx,word ptr cs:[si+2] ; kết quả dương nhỏ nhất ; --> chuyển xuống hàng ; kế tiếp stosb ; AL = ký số hàng đang xét dec cl ; CL = hàng đang xét add si,4 ; Dời đến hàng kế tiếp jnz NTD4 ret NUM-TO-DEC endp NTD-table dd 1000000000 ; hàng tỉ dd 100000000 ; hàng trăm triệu 34 dd 10000000 ; hàng chục triệu dd 1000000 ; hàng triệu dd 100000 ; hàng trăm ngàn dd 10000 ; hàng chục ngàn dd 1000 ; hàng ngàn dd 100 ; hàng trăm dd 10 ; hàng chục dd 1 ; hàng đơn vò Chú ý : Giải thuật của 6.5.1 6.5.2 : chia số cần đổi cho 10, suy ra ký số tương ứng từ số dư của phép toán chia . Quá trình tạo ra chuỗi số thập phân theo chiều từ phải sang trái. Để tránh trường hợp kết quả chia bò tràn,thí dụ 6.5.2 đã dùng đến hai lần chia trung gian, trong đó kết quả của mỗi lần chia luôn không tràn. Giải thuật của 6.5.3 : dùng một bảng liệt kê giá trò các hàng đơn vò của hệ thập phân theo thứ tự từ lớn đến nhỏ . Khi chuyển đổi sẽ tiến hành dò bảng từ trên xuống cho đến khi gặp giá trò nhỏ hơn giá trò cần chuyển đổi . Thí dụ : giá trò cần chuyển đổi là 170900 thì giá trò tìm thấy là 100000 (tiêu biểu cho hàng trăm ngàn) Lấy giá trò cần chuyển đổi trừ cho giá trò tìm thấy lặp lại cho đến khi hiệu số nhỏ hơn số trừ . Số lần lặp chính là giá trò của ký số tương ứng. Trong thí dụ trên, số lần lặp là 1, hiệu số là 70900 Cho số trừ là phần tử kế tiếp trong bảng, lặp lại quá trình trên cho đến khi dò hết bảng . Giải thuật của 6.5.3 chỉ dùng các tác vụ cộng trừ có thể mở rộng cho các số có kích thước tùy ý . 6.5.4Tạo chuỗi số dạng hex từ một giá trò nhò phân 1 byte Num-To-Hex proc near ; ; Input : ; AL = giá trò cần chuyển đổi ( 1 byte ) ; DS:SI = Buffer ; Output : ; Hex-string được đặt vào buffer ( 2 ký số hex ) ; push ax push cx mov ah,al ; AH = AL mov cl,4 shl ah,4 ; Xóa 4 bit cao (nibble cao) shr ah,4 ; AH = nibble thấp shr al,4 ; AL = nibble cao add ax,03030h ; AH = AH+’0’, AL = AL +’0’ cmp ah,’9’ jbe NTH1 add ah,’A’-‘9’-1 NTH1: 35 cmp al,’9’ ; Nếu AL >’9’ --> ‘A’ ’F’ jbe NTH2 add al,’A’-‘9’-1 ; Cộng thêm khoảng cách từ ‘A’ NTH2: ; đến ‘9’ trừ 1 . mov word ptr [si],ax ; ký số tương ứng với nibble pop cx ; cao sẽ đặt trước . pop ax ret Num-To-Hex endp 6.5.5Tạo chuỗi số dạng bin từ một giá trò nhò phân 1 byte Num-to-Bin proc near ; ; Input : ; AL = giá trò cần chuyển đổi ( 1 byte ) ; DS:SI = Buffer ( 8 byte ) ; Output : ; Bin-string được đặt vào buffer ( 8 ký số bin ) ; push ax push bx xor bx,bx ; BX = 0 NTB1: mov ah,’0’ shl al,1 ; CF = bit bò đẩy lọt ra ngoài adc ah,0 ; CF = 0 --> AH = ‘0’+0 = ‘0’ ; CF = 1 --> AH = ‘0’+1 = ‘1’ mov byte ptr [si+bx],ah inc bx ; bx = bx+1 cmp bx,8 ; Đã hết 8 bit chưa ? jne NTB1 pop bx pop ax ret Num-to-Bin endp 6.5.6Đổi chuỗi số dec thành giá trò nhò phân 4 byte DTN proc near ; Input : ; DS:SI = Buffer chứa num-str dạng decimal ; CL = chiều dài của num-str ; Output: ; CF=1 --> lỗi chuyển đổi ; CF=0 --> DX:AX = giá trò nhò phân tương ứng push bx push cx [...]... trái chuỗi số inc si loop DTN0 jmp DTN3 ; Chuỗi số “rỗng” DTN1: mov bl,byte ptr [si] inc si sub bl,03Ah ; kiểm tra ‘0’ ‘F’ > lỗi HTN2: push cx mov cl,4 HTN3: shl bx,1 ; Nhân DX|BX với 16 rcl dx,1 ; loop HTN3 ; or bl,al ; Cộng dồn giá trò mới pop cx 37 loop HTN1 ; Cho đến khi hết chuỗi số HTN4: mov ax,bx pop si pop cx pop bx ret HTN endp 6.5.8Đổi chuỗi số bin thành... bx,bx xor dx,dx BTN0: cmp byte ptr [si],’ ‘ ; Bỏ qua các khoảng trống jne BTN1 ; bên trái chuỗi số inc si loop BTN0 jmp BTN2 ; Chuỗi số “rỗng” BTN1: mov al,byte ptr [si] inc si sub al,’0’ jc BTN2 ; AL < 0 > lỗi cmp al,1 ja BTN2 ; AL > 1 > lỗi shr al,1 ; Bit giá trò đặt trong CF rcl bx,1 ; rcl dx,1 ; Chuyển vào DX|BX loop BTN1 BTN2: 38 mov ax,bx pop si pop cx pop bx ret BTN endp 39 ... chuỗi số hex thành giá trò nhò phân 4 byte HTN proc near ; Input : ; DS:SI = Buffer chứa num-str dạng hexa ; CL = chiều dài của num-str ; Output: ; CF=1 > lỗi chuyển đổi ; CF=0 > DX:AX = giá trò nhò phân tương ứng ; push bx push cx push si xor ch,ch xor bx,bx ; DX|BX chứa kết quả trung xor dx,dx ; gian mov ah,0Fh HTN0: cmp byte ptr [si],’ ‘ ; Bỏ qua các khoảng trống jne HTN1 ; bên trái chuỗi số inc . 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. vò Chú ý : Giải thuật của 6.5.1 và 6.5.2 : chia số cần đổi cho 10, suy ra ký số tương ứng từ số dư của phép toán chia . Quá trình tạo ra chuỗi số thập phân

Ngày đăng: 29/09/2013, 11:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan