Cấu trúc Máy tính và Lập trình Assembly - Chương 13: Lập trình xử lý mảng & chuỗi

ppt 46 trang phuongnguyen 4870
Bạn đang xem 20 trang mẫu của tài liệu "Cấu trúc Máy tính và Lập trình Assembly - Chương 13: Lập trình xử lý mảng & chuỗi", để 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:

  • pptcau_truc_may_tinh_va_lap_trinh_assembly_chuong_13_lap_trinh.ppt

Nội dung text: Cấu trúc Máy tính và Lập trình Assembly - Chương 13: Lập trình xử lý mảng & chuỗi

  1. Chương 13 :LẬP TRÌNH XỬ LÝ MẢNG & CHUỔI • GiỚI THIỆU • CỜ HƯỚNG DF • CÁC LỆNH THIẾT LẬP VÀ XÓA CỜ HƯỚNG • CÁC LỆNH THAO TÁC TRÊN CHUỔI • MỘT SỐ THÍ DỤ MINH HỌA •THƯ ViỆN LIÊN QUAN ĐẾN CHUỔI Chương 14 Lập trình XL Chuỗi 1
  2. GiỚI THIỆU CHUỖI Trong ASM 8086 khái niệm chuỗi bộ nhớ hay chuỗi là 1 mảng các byte hay word. ➔ Các lệnh thao tác với chuỗi cũng được thiết kế cho các thao tác với mảng. Chương 14 Lập trình XL Chuỗi 2
  3. Cờ hướng DF Cờ định hướng (Direction Flag) : xác định hướng cho các thao tác chuỗi. DF=0 chuỗi được xử lý theo chiều tăng tức địa chỉ vùng nhớ chứa chuỗi tăng dần. (chuỗi được xử lý từ trái qua phải). DF=1 chuỗi được xử lý theo chiều tăng tức địa chỉ vùng nhớ chứa chuỗi giảm dần. (chuỗi được xử lý từ phải qua trái). Trong DEBUG DF=0 ký hiệu là UP DF=1 ký hiệu là DN Chương 14 Lập trình XL Chuỗi 3
  4. LỆNH LIÊN QUAN ĐẾN CỜ HƯỚNG CLD (CLEAR DIRECTION FLAG) XÓA CỜ HƯỚNG DF =0 STD (SET DIRECTION FLAG) THIẾT LẬP CỜ HƯỚNG DF=1 Chương 14 Lập trình XL Chuỗi 4
  5. Chương 14 Lập trình XL Chuỗi 5
  6. ➔ Trước khi sử dụng các lệnh xử lý chuỗi, ta phải xác định hướng xử lý chuỗi bằng cách set hay clear cờ hướng. Lệnh đặt cờ hướng : CLD : xóa cờ hướng, chuổi được xử lý từ trái → phải STD : đặt cờ hướng, chuổi được xử lý từ phải → trái CON TRỎ CHUỖI Chứa địa chỉ chuỗi nguồn DS:SI ES:DI Chứa địa chỉ chuỗi đích Chương 14 Lập trình XL Chuỗi 6
  7. CÁC THAO TÁC XỬ LÝ CHUỖI NHẬP CHUỔI Input : AH = 0AH, ngắt 21H DS:DX = địa chỉ của buffer, trong đó buffer[0] là kích thước tối đa của chuỗi, buffer[1] sẽ là kích thước dữ liệu nhập. Output : Chuỗi buffer chứa nội dung nhập vào từ buffer[2] trở đi Yêu cầu xem thêm các chức năng AH = 3FH và AH = 40H của ngắt 21H. Chương 14 Lập trình XL Chuỗi 7
  8. Chương 14 Lập trình XL Chuỗi 8
  9. NHẬP CHUỖI Chương 14 Lập trình XL Chuỗi 9
  10. NHẬP CHUỔI Ta cũng có thễ dùng hàm 1 INT 21h đọc 1 ký tự từ bàn phím để nhập 1 chuỗi bằng cách dùng vòng lặp và lưu chuổi bằng lệnh STOSB. STOSB (STORE STRING BYTE) CHUYỂN NỘI DUNG AL ĐẾN BYTE ĐƯỢC TRỎ BỞI ES:DI. LƯU CHUỖI CÁC BYTES SAU KHI LỆNH ĐƯỢC THỰC HiỆN DI TĂNG 1 NẾU DF=0 HoẶC GiẢM 1 NẾU DF =1 Chương 14 Lập trình XL Chuỗi 10
  11. NHẬP CHUỔI Ta cũng có thễ dùng hàm 1 Int 21h đọc 1 ký tự từ bàn phím để nhập 1 chuỗi bằng cách dùng vòng lặp và lưu chuổi bằng lệnh STOSW. STOSW (STORE STRING WORD) CHUYỂN NỘI DUNG AX ĐẾN WORD ĐƯỢC TRỎ BỞI ES:DI. LƯU CHUỖI CÁC WORD SAU KHI LỆNH ĐƯỢC THỰC HiỆN DI TĂNG HAY GiẢM 2 TÙY VÀO DF. Chương 14 Lập trình XL Chuỗi 11
  12. THÍ DỤ .MODEL SMALL .STACK 100H .DATA STRING1 DB 'HELLO' .CODE MAIN PROC MOV AX,@DATA MOV ES,AX LEA DI, STRING1 ; khởi tạo ES CLD MOV AL,'A' ; xử lý từ trái ➔ phải STOSB ; AL chứa ký tự cần lưu STOSB ; lưu ký tự ‘A’ MOV AH,4CH ; lưu ký tự thứ 2 INT 21H MAIN ENDP END MAIN Chương 14 Lập trình XL Chuỗi 12
  13. THÍ DỤ READSTR. PROC ELSE1 : Giải thích : STOSB PUSH AX DI chứa offset của chuỗi INC BX PUSH DI BX chứa số ký tự nhập READ : CLD 8H mã ASCII của Backspace INT 21H XOR BX,BX không → lưu nó vào chuỗi JMP LAP MOV AH,1 tăng số ký tự lên 1 ENDLAP : INT 21H Đúng → lùi con trỏ DI POP DI LAP: giảm số ký tự nhập được POP AX CMP AL,0DH RET JE ENDLAP READSTR ENDP CMP AL,8H JNE ELSE1 DEC DI DEC BX JMP READ Chương 14 Lập trình XL Chuỗi 13
  14. NHẬP XUẤT CHUỖI HiỂN THỊ CHUỖI AH = 09, ngắt 21H Vào : DX = địa chỉ offset của chuỗi. Chuỗi phải kết thúc bằng kí tự ‘$’. Chú ý : thay vì dùng lệnh MOV OFFSET ta có thể dùng lệnh LEA. Chương 14 Lập trình XL Chuỗi 14
  15. CÁC THAO TÁC XỬ LÝ CHUỔI For counter Do Nạp chuổi cần hiển thị HiỂN THỊ CHUỖI vào AL Chuyển vào DL Hiển thị ký tự EndFor Nạp 1 chuổi Chương 14 Lập trình XL Chuỗi 15
  16. LODSB (LOAD STRING BYTE) NẠP 1 CHUỖI CÁC BYTES CHUYỂN BYTE TẠI ĐỊA CHỈ DS:SI ➔ AL SI TĂNG 1 NẾU DF=0 SI GiẢM 1 NẾU DF =1 Chương 14 Lập trình XL Chuỗi 16
  17. THÍ DỤ STRING1 DB ‘ABC’ MOV AX,@DATA MOV DS,AX LEA SI, STRING1 CLD LODSB LODSB NẠP BYTE THỨ 1 VÀ THỨ 2 ➔ AL . Chương 14 Lập trình XL Chuỗi 17
  18. LODSW (LOAD STRING WORD) NẠP 1 CHUỖI CÁC WORD CHUYỂN WORD TẠI ĐỊA CHỈ DS:SI ➔ AX SI TĂNG HAY GiẢM TÙY TRẠNG THÁI DF Chương 14 Lập trình XL Chuỗi 18
  19. THÍ DỤ Hiển thị chuỗi nhập DISPSTR PROC PUSH AX PUSH BX PUSH CX PUSH DX EXIT : PUSH SI POP SI MOV CX, BX POP DX JCXZ EXIT POP CX CLD POP BX MOV AH,2 POP AX LAP : RET LODSB DISPSTR ENDP MOV DL, AL INT 21H LOOP LAP Chương 14 Lập trình XL Chuỗi 19
  20. CHƯƠNG TRÌNH HÒAN CHỈNH Viết chương trình nhập 1 chuỗi ký tự tối đa 80 ký tự, hiển thị 15 ký tự của chuỗi đã nhập ở dòng kế. .MODEL SMALL .STACK 100H .DATA STRING1 DB 80 DUP(0) LEA SI, STRING1 XDONG DB 0DH,0AH,’$’ MOV BX, 15 .CODE CALL DISPSTR MAIN PROC MOV AX,4C00H MOV AX,@DATA INT 21H MOV DS,AX MAIN ENDP ; READSTR PROC MOV ES,AX LEA DI, STRING1 ; DISPSTR PROC CALL READSTR LEA DX,XDONG END MAIN MOV AH,9 INT 21H Chương 14 Lập trình XL Chuỗi 20
  21. CÁC THAO TÁC XỬ LÝ CHUỔI Chuyển một BYTE : MOVSB chuyển nội dung của byte được định bởi DS:SI đến byte được chỉ bởi ES: DI. Sau đó SI và DI tự động tăng lên 1 nếu cờ DF = 0 hay giảm 1 nếu DF = 1. MOVSB chỉ chuyển 1 byte. Vậy cả chuỗi ta làm thế nào ? Chương 14 Lập trình XL Chuỗi 21
  22. DF 0 Chương 14 Lập trình XL Chuỗi 22
  23. MOVSW Sau khi đã chuyển 1 word của chuỗi cả SI và DI cùng tăng Chuyển một chuỗi các word (2 bytes) lên 2 nếu DF=0 hoặc cùng giảm đi 2 nếu DF=1 DS:SI trỏ đến chuỗi nguồn ES:DI trỏ đến chuỗi đích Chương 14 Lập trình XL Chuỗi 23
  24. LODSB (Load String Byte) Chuyển byte chỉ bởi DS:SI ➔ AL tăng SI lên 1 nếu DF=0 giảm SI xuống 1 nếu DF=1 Chương 14 Lập trình XL Chuỗi 24
  25. DF DS:SI DS:SI 0 3A LODSB 3A AL Chương 14 Lập trình XL Chuỗi 25
  26. Chương 14 Lập trình XL Chuỗi 26
  27. STOSB (LƯU CHUỖI BYTE) Chương 14 Lập trình XL Chuỗi 27
  28. STOSW (LƯU CHUỖI WORD) Chương 14 Lập trình XL Chuỗi 28
  29. Chương 14 Lập trình XL Chuỗi 29
  30. Chương 14 Lập trình XL Chuỗi 30
  31. Chương 14 Lập trình XL Chuỗi 31
  32. Chương 14 Lập trình XL Chuỗi 32
  33. Chương 14 Lập trình XL Chuỗi 33
  34. REP Khởi tạo CX với số byte cần chuyển Sau đó thực hiện lệnh REP MOVSB Sau mỗi lệnh MOVSB, CX giảm 1 cho đến khi nó =0 ➔ hết chuỗi. Chương 14 Lập trình XL Chuỗi 34
  35. THÍ DỤ MINH HỌA .DATA Bài tập : STRING1 DB ‘HELLO’ Viết đoạn chương trình chép chuỗi STRING2 DB 5 DUP(?) STRING1 ở thí dụ trước vào chuỗi STRING2 nhưng theo thứ CLD tự ngược lại. LEA SI, STRING1 LEA DI, STRING2 MOV CX, 5 REP MOVSB Chương 14 Lập trình XL Chuỗi 35
  36. THÍ DỤ MINH HỌA Cho mảng sau ARR DW 10,20,40,50,60,? Viết các lệnh để chèn 30 vào giữa 20 và 40 ( giả sử rằng DS và ES đã chứa địa chỉ đoạn dữ liệu) 10,20, ,40,50,60 Dời 40,50,60 ra sau 1 vị trí 30 Sau đó chèn 30 vào Chương 14 Lập trình XL Chuỗi 36
  37. STD LEA SI, ARR+8H LEA DI, ARR+AH MOV CX, 3 REP MOVSW MOV WORD PTR[DI],30 Chương 14 Lập trình XL Chuỗi 37
  38. MẢNG 1 CHIỀU Một dãy các phần tử có cùng kiểu dữ liệu, có cùng 1 tên gọi. Khai báo MKT DB ‘abcdef’ ; mảng ký tự MNB Dw 10h,20h,30h,40h,50h,60h ; mảng số ArrA DB 100 DUP(0) ; khai báo mảng có 100 phần tử có giá trị khởi tạo bằng 0. Chương 14 Lập trình XL Chuỗi 38
  39. Chương 14 Lập trình XL Chuỗi 39
  40. Chương 14 Lập trình XL Chuỗi 40
  41. BÀI TẬP Bài 1 : Viết chương trình nhập 1 số từ 1-12, in ra tên tháng tương ứng. Bài 2 : Viết chương trình nhập 1 số từ 1-7, in ra tên thứ tương ứng. Chương 14 Lập trình XL Chuỗi 41
  42. MỘT SỐ BÀI TẬP MINH HỌA LẬP TRÌNH XỬ LÝ CHUỖI Nhập 1 chuỗi dài tối đa 255 ký tự từ bàn phím. Cho phép dùng phím BackSpace để sửa khi nhập sai và kết thúc nhập khi gỏ phím Enter. Hướng dẫn : Để nhập 1 chuỗi ký tự vào Buffer Dùng hàm 0AH INT 21H để nhập chuổi đệm ta khai báo như sau : DS:DX địa chỉ của buffer đệm lưu chuỗi. .DATA Byte 0 : số byte tối đa có thể nhập. BUFFERN DB 80,0,80 DUP(?) Byte 1 : chứa giá trị 0 Byte 2 trở đi : để trống (lưu các ký tự sẽ nhập) Chương 14 Lập trình XL Chuỗi 42
  43. B1. Viết chương trình nhập vào 1 từ, sau đó in từng ký tự trong từ theo chiều dọc. Thí dụ Nhập CONG Xuất : C O N G B2. Viết chương trình nhập vào 1 chuỗi, sau đó đổi tất cả chuỗi thành chữ hoa và in chuỗi ra màn hình ở dòng kế. B3.Viết chương trình nhập hai chuỗi ký tự , kiểm tra xem chuỗi thứ hai có xuất hiện trong chuỗi thứ nhất hay không. Ví dụ : Nhập chuỗi thứ nhất : computer information Nhập chuỗi thứ hai : compute Xuất: Chuỗi thứ hai có xuất hiện trong chuỗi thứ nhất. Chương 14 Lập trình XL Chuỗi 43
  44. B4. Viết chương trình nhập 1 chuỗi ký tự viết hoa các ký tự nguyên âm, viết thường các ký tự phụ âm. Ví dụ : Nhập chuỗi : “aBcdE” Xuất chuỗi: “AbCdE” B5. Viết chương trình nhập vào 2 chuỗi ký tự s1, s2 và 1 số nguyên dương n. Chèn chuỗi s2 vào chuỗi s1 ở vị trí ký tự thứ n trong chuỗi s1 . Ví dụ : Nhập chuỗi s1 : “abcde” Nhập chuỗi s2 : “fgh” Nhập n = 3 Xuất kết quả : “abcfghde” B6. Viết chương trình nhập vào từ bàn phím 1 chuỗi và tính số lần xuất hiện của các nguyên âm (a,e,i,o,u, y), cac phu am, cac khoang trang, trong chuỗi tương ứng. Ví dụ : Nhập chuỗi : “dai hoc khoa hoc tu nhien thanh pho ho chi minh” Xuất : Số lần xuất hiện của các nguyên âm là : 14 , phu am la: 24, khoang trang la: 9 Chương 14 Lập trình XL Chuỗi 44
  45. B7. Viết chương trình nhập vào từ bàn phím 1 chuỗi gồm các ký tự trong bảng chữ cái. Đếm xem trong chuỗi có bao nhiêu từ. Ví dụ : Nhập chuỗi : “ hO Chi mINh ” Xuất : chuỗi gồm có 3 từ B8. Viết chương trình nhập vào từ bàn phím 4 số . Xuất ra màn hình 4 số đó theo thứ tự tăng dần . Ví dụ : Nhập : 14 7 26 11 Xuất : 7 11 14 26 B9. Viết chương trình nhập vào từ bàn phím 4 số và sau đó xuất số lớn nhất và nhỏ nhất ra màn hình. Ví dụ : Nhập : 13 21 1 49 Xuất : Số lớn nhất : 49 Số nhỏ nhất : 1 Chương 14 Lập trình XL Chuỗi 45
  46. Chương 14 Lập trình XL Chuỗi 46