Bài giảng Cấu trúc máy tính - Nguyễn Hữu Nam Dương

161 47 0
Bài giảng Cấu trúc máy tính - Nguyễn Hữu Nam Dương

Đ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

Bài giảng Cấu trúc máy tính do Nguyễn Hữu Nam Dương biên soạn tập trung trình bày các vấn đề cơ bản về việc biểu diễn dữ liệu và số học máy tính; hệ thống máy tính; họ máy tính IBM-PC; lập trình hợp ngữ trên PC.

Tài liệu tham khảo Stallings, W Computer Organization and Architecture, 6th ed, Prentice Hall, 2003 Ytha Yu, Charles Marut - Lập trình assembly máy tính IBM-PC - 1992 Văn Thế Minh – Kỹ thuật vi xử lý – Nhà xuất Giáo dục, 1997 Walter A Triebel, Avtar Singh - The 8088 and 8086 Microprocessors: Programming, Interfacing, Software, Hardware and Applications - 1997 Địa download giảng, thực hành phần mềm ftp://dce.hut.edu.vn/vinhtt/CA CẤU TRÚC MÁY TÍNH Computer Architecture GV: Nguyễn Hữu Nam Dương Bộ môn Kỹ thuật máy tính, Viện CNTT & TT ĐHBK Hà Nội Email duongnhn@soict.hut.edu.vn Nội dung môn học Chương 1: Giới thiệu chung Chương 2: Biểu diễn liệu số học máy tính Chương 3: Hệ thống máy tính Chương 4: Họ máy tính IBM-PC Chương 5: Lập trình hợp ngữ PC Cấu trúc máy tính Chương Giới thiệu chung Nội dung chương Máy tính phân loại máy tính Định nghĩa máy tính: Thiết bị điện tử thực công việc sau: Máy tính phân loại máy tính Sự tiến hóa máy tính Nhận thơng tin vào Xử lý thơng tin theo chương trình nhớ sẵn bên Đưa thơng tin ⇒ Máy tính hoạt động theo chương trình Máy tính phân loại máy tính Máy tính phân loại máy tính Mơ hình máy tính Mơ hình phân lớp máy tính Phân loại máy tính Phân loại truyền thống: Máy vi tính (Microcomputer) Máy tính nhỏ (Minicomputer) Máy tính lớn (Mainframe Computer) Siêu máy tính (Supercomputer) Phân loại máy tính Phân loại đại: Máy tính cá nhân (Personal Computer) Máy chủ (Server) Máy tính nhúng (Embedded Computer) Máy tính cá nhân 10 Máy tính cá nhân Là loại máy tính phổ biến người dùng thông thường Thiết kế theo hướng tối ưu giá thành hiệu Một số loại: Máy tính để bàn (Desktop) Máy tính xách tay (Notebook) Máy trạm làm việc (Workstation) Giá thành: từ vài trăm đến vài nghìn USD 11 12 Máy Server Máy Server Máy chủ (Server) Thực chất máy phục vụ Dùng mạng máy tính theo mơ hình Client/Server Tốc độ hiệu tính tốn cao Dung lượng nhớ lớn Độ tin cậy cao Giá thành: từ hàng chục nghìn đến hàng triệu USD 13 Máy tính nhúng 14 Máy tính nhúng Máy tính nhúng (Embedded Computer) Được đặt thiết bị khác (bao gồm phần cứng kết cấu khí) để điều khiển thiết bị làm việc Được thiết kế chuyên dụng Ví dụ: Điện thoại di động Bộ điều khiển máy giặt, điều hòa nhiệt độ Một số thiết bị mạng: Switch, Router, … Giá thành: từ vài USD đến hàng trăm ngàn USD 15 16 Kiến trúc máy tính Kiến trúc tập lệnh Nghiên cứu cấu trúc hoạt động máy tính theo cách nhìn người lập trình Kiến trúc tập lệnh máy tính bao gồm Kiến trúc tập lệnh (Instruction Set Architecture – ISA) Tập lệnh: tập hợp chuỗi số nhị phân mã hóa cho thao tác mà máy tính thực Kiểu liệu: kiểu liệu mà máy tính xử lý Chế độ địa Tổ chức máy tính (Computer Organization) Kiến trúc máy tính 17 Tổ chức máy tính 18 Tổ chức máy tính Nghiên cứu cấu trúc phần cứng máy tính Các thành phần máy tính Bộ xử lý trung tâm (Central Processing Unit): điều khiển hoạt động máy tính xử lý liệu Bộ nhớ (Main Memory): chứa chương trình liệu sử dụng Hệ thống vào (Input/Output System): trao đổi thơng tin máy tính bên ngồi Liên kết hệ thống (System Interconnection): kết nối vận chuyển thông tin thành phần với Cấu trúc máy tính 19 20 Nội dung chương Các hệ máy tính Thế hệ 1: Máy tính dùng đèn điện tử chân khơng (1946 - 1955) Thế hệ 2: Máy tính dùng transistor (1956 - 1965) Thế hệ 3: Máy tính dùng mạch tích hợp (1966 1980) Thế hệ 4: Máy tính dùng mạch tích hợp VLSI (1981 - nay) Máy tính phân loại máy tính Sự tiến hóa máy tính 21 Máy tính dùng đèn chân khơng 22 Kiến trúc Von Neumann Dựa ý tưởng chương trình lưu trữ (storedprogram concept) 23 24 Máy tính dùng transistor Máy tính dùng mạch tích hợp Mạch tích hợp (Integrated Circuit – IC) hay gọi vi mạch, chip bán dẫn chứa transistor linh kiện khác So với hệ trước, máy tính hệ này: Nhỏ gọn Nhanh Tiêu thụ lượng Rẻ tiền Máy PDP-1 CDC 6600 25 Siêu máy tính CRAY-1 26 Máy tính dùng mạch tích hợp VLSI Các cơng nghệ mạch tích hợp: SSI (Small scale integration) – từ 1965 Tích hợp tới 100 transistor chip MSI (Medium scale integration) – 1971 Tích hợp từ 100 đến 3,000 transistor chip LSI (Large scale integration) – từ 1971 đến 1977 Tích hợp từ 3,000 đến 100,000 transistor chip VLSI (Very large scale integration) – từ 1978 đến Tích hợp từ 100,000 đến 100,000,000 transistor chip ULSI (Ultra large scale integration) Có 100,000,000 transistor chip 27 28 Máy tính dùng mạch tích hợp VLSI Máy tính dùng mạch tích hợp VLSI Các sản phẩm cơng nghệ VLSI: Bộ vi xử lý (Microprocessor): CPU chế tạo chip Các vi mạch điều khiển tổng hợp (Chipset): vi mạch thực nhiều chức điều khiển nối ghép Bộ nhớ bán dẫn, gồm hai loại: ROM, RAM Các vi điều khiển (Microcontroller): máy tính chuyên dụng chế tạo chip 29 Cấu trúc máy tính 30 Nội dung chương 2.1 Các hệ đếm 2.2 Mã hóa lưu trữ liệu máy tính 2.3 Biểu diễn số nguyên 2.4 Các phép toán số học với số nguyên 2.5 Biểu diễn số thực 2.6 Biểu diễn kí tự Chương BIỂU DIỄN DỮ LIỆU & SỐ HỌC MÁY TÍNH 31 32 Các hệ đếm Về mặt tốn học, ta biểu diễn số theo hệ đếm số Khi nghiên cứu máy tính, ta quan tâm đến hệ đếm sau đây: Hệ thập phân Sử dụng 10 chữ số: 0,1,2,3,4,5,6,7,8,9 để biểu diễn số Dùng n chữ số thập phân biểu diễn 10n giá trị khác nhau: Hệ thập phân (Decimal System) → người sử dụng Hệ nhị phân (Binary System) → máy tính sử dụng Hệ mười sáu (Hexadecimal System) → dùng để viết gọn cho số nhị phân 00 000 = 99 999 = 10n-1 Giả sử số A biểu diễn dạng: A = an an-1 … a1 a0 a-1 a-2 … a-m → Giá trị A hiểu sau: A = an 10n + an −110n −1 + + a1101 + a0100 + a−110 −1 + + a− m10 − m n A= ∑ a 10 i i i =− m 33 34 Ví dụ Số thập phân 472.38 có giá trị hiểu sau: 472.38 = x 102 +7x 101 +2x 100 +3x 10-1 +8x 10-2 Mở rộng cho hệ số r (r>1) Sử dụng r chữ số có giá trị riêng từ đến r-1 để biểu diễn số Giả sử có số A biểu diễn chữ số hệ đếm theo số r sau: A = an an-1 … a1 a0 a-1 a-2 … a-m Giá trị A là: A = an r n + an −1r n −1 + + a1r + a0 r + a−1r −1 + a− r −2 + + a− m r − m n A= ∑a r i i i =− m Một chuỗi n chữ số hệ đếm số r biểu diễn rn giá trị khác 35 36 Hệ nhị phân Ví dụ Số nhị phân 1101001.1011 có giá trị xác định sau: Sử dụng chữ số: 0,1 Chữ số nhị phân gọi bit (binary digit) Bit đơn vị thông tin nhỏ Dùng n bit biểu diễn 2n giá trị khác nhau: 1101001.1011(2) = 26 + 25 + 23 + 20 + 2-1 + 2-3 + 2-4 = 64 + 32 + + + 0.5 + 0.125 + 0.0625 = 105.6875(10) 00 000 = 11 111 = 2n-1 Giả sử có số A biểu diễn theo hệ nhị phân sau: A = an an-1 … a1 a0 a-1 a-2 … a-m Với chữ số nhị phân, giá trị A là: A = an n + an−1 n −1 + + a1 21 + a0 + a−1 −1 + a− 2 −2 + + a− m − m n A= ∑a i i i=− m 37 Đổi số thập phân sang nhị phân Thực chuyển đổi phần nguyên phần lẻ riêng Chuyển đổi phần nguyên: 38 Đổi số thập phân sang nhị phân Chuyển đổi phần nguyên (tiếp): Cách 2: phân tích số thành tổng lũy thừa 2, sau dựa vào số mũ để xác định dạng biểu diễn nhị phân Cách 1: chia dần số cho 2, xác định phần dư, viết số dư theo chiều ngược lại Ví dụ: 105 = 64 + 32 + + = 26 + 25 + 23 + 20 → 105(10) = 1101001(2) Ví dụ: chuyển đổi 105(10) sang hệ nhị phân ta làm sau: 105 : = 52 dư 52 : = 26 dư 26 : = 13 dư 13 : = dư 6:2 = dư 3:2 = dư 1:2 = dư Như vậy, ta có: 105(10) = 1101001(2) Chuyển đổi phần lẻ: Nhân phần lẻ với lấy phần nguyên Sau viết phần nguyên theo chiều thuận Ví dụ: chuyển đổi số 0.6875(10) sang hệ nhị phân: 0.6875 x = 1.3750 phần nguyên 0.375 x2 = 0.750 phần nguyên 0.75 x2 = 1.50 phần nguyên 0.5 x2 = 1.0 phần nguyên Kết là: 0.6875(10) = 0.1011(2) 39 = = = = 1 40 10 b In số nhị phân In giá trị BX hình dạng số nhị phân Thuật giải: Mã lệnh MOV MOV Print: ROL MOV ADC INT LOOP FOR 16 lần DO Quay trái BX (bit MSB BX đưa CF) IF CF = THEN Đưa '1' ELSE Đưa '0' END IF END FOR CX, 16 AH, ; số bit cần ; hàm kí tự BX, DL, DL, 30h 21h Print ; ; ; ; ; quay trái BX ⇒ CF = MSB DL = DL ⇐ 30h + CF in kí tự DL lặp lại 16 lần Có thể dùng lệnh ADC: ADC đích, nguồn đích ⇐ đích + nguồn + CF 585 586 c Nhập số Hexa Đọc kí tự Hexa từ bàn phím (tối đa chữ số, nhập chữ số chữ hoa, kết thúc nhập ENTER) Chuyển thành số Hexa tương ứng lưu vào BX Thuật giải: Xóa BX (là ghi chứa kết quả) Nhập kí tự Hexa WHILE kí tự Enter DO Đổi kí tự nhị phân Dịch trái BX lần Chèn giá trị vào bit thấp BX Nhập kí tự tiếp END WHILE 587 Đoạn lệnh nhập số Hexa XOR BX, BX MOV CL, MOV AH, INT 21h VongLap: CMP AL, 13 JE KetThucLap CMP AL, '9' JG ChuCai AND AL, 0Fh JMP ChenBit ChuCai: SUB AL, 37h ChenBit: SHL BX, CL OR BL, AL INT 21h JMP VongLap KetThucLap: ; ; ; ; Xóa BX Số lần dịch trái BX Hàm nhập kí tự Nhập kí tự ⇒ AL = mã ASCII ; ; ; ; ; ; Kí tự vừa nhập Enter? ðúng ⇒ Kết thúc So sánh với '9' Lớn ⇒ chữ hoa Khơng lớn ⇒ đổi chữ số nhị phân Rồi chèn vào cuối BX ; ðổi chữ giá trị nhị phân ; ; ; ; Dịch trái BX ñể dành chỗ cho c/s Chèn chữ số vào bit thấp BX Nhận tiếp kí tự từ bàn phím Lặp lại 588 147 d In số Hexa Mã lệnh MOV CX, MOV AH, InHexa: MOV DL, BH SHR DL, SHR DL, SHR DL, SHR DL, CMP DL, JA ChuCai ADD DL, 30h JMP TiepTuc ChuCai: ADD DL, 37h TiepTuc: INT 21h ROL BX, ROL BX, ROL BX, ROL BX, LOOP InHexa Đưa giá trị Hexa chữ số BX hình Thuật giải: FOR lần DO Chuyển BH vào DL (giá trị cần in nằm BX) Dịch phải DL vị trí IF DL < 10 THEN Đổi thành kí tự '0' '9' ELSE Đổi thành kí tự 'A' 'F' END IF Đưa kí tự Quay trái BX vị trí END FOR 589 590 Nội dung chương 5.1 Mở đầu lập trình hợp ngữ 5.2 Các cấu trúc lập trình với hợp ngữ 5.3 Các lệnh logic, lệnh dịch lệnh quay 5.4 Ngăn xếp thủ tục 5.5 Các lệnh nhân, chia 5.6 Các lệnh thao tác chuỗi 5.7 Một số ví dụ Ngăn xếp thủ tục Ngăn xếp Thủ tục Các ví dụ 591 592 148 Ngăn xếp Ngăn xếp (Stack): Lệnh PUSH dùng để cất liệu 16 bit vào ngăn xếp Cú pháp: PUSH nguồn Vùng nhớ tổ chức theo cấu trúc LIFO dùng để cất giữ thông tin Chiều Stack từ đáy lên đỉnh ngược với chiều tăng địa Khai báo ngăn xếp: STACK Ví dụ: Stack 100h Lệnh PUSH PUSHF nguồn ghi 16 bit từ nhớ (2 Byte) Các bước thực hiện: kich_thuoc SP ⇐ SP – Một toán hạng nguồn chuyển vào địa xác định SS:SP (tốn hạng nguồn khơng đổi) Khi chương trình thực thi thì: SS : chứa địa đoạn ngăn xếp SP : chứa địa offset đỉnh ngăn xếp Ban đầu ngăn xếp rỗng nên 0100h địa đáy ngăn xếp (=0100h) Lệnh PUSHF cất nội dung ghi cờ vào ngăn xếp 593 Ví dụ lệnh PUSH 594 Ví dụ (tiếp) Xác định nội dung Byte nhớ Stack .Stack Start: MOV MOV PUSH PUSH 100h ; lệnh chương trình AX, 1234h BX, 5678h AX BX 595 596 149 Lệnh POP POPF Lệnh POP dùng để lấy từ liệu đỉnh ngăn xếp Cú pháp: POP đích Ví dụ lệnh POP Xác định nội dung Byte nhớ Stack đích ghi 16 bit (trừ IP) từ nhớ Các bước thực hiện: Nội dung từ nhớ địa xác định SS:SP chuyển tới tốn hạng đích SP ⇐ SP + Lệnh POPF đưa vào ghi cờ nội dung từ nhớ đỉnh ngăn xếp .Stack Start: MOV MOV PUSH PUSH POP POP 100h ; lệnh chương trình AX, 1234h BX, 5678h AX BX CX DX 597 598 Ví dụ (tiếp) Offset Offset 0000 0000 Offset 00FC 78h 00FC 78h 00FC 78h 00FD 56h 00FD 56h 00FD 56h 00FE 34h 00FE 34h 00FE 34h 00FF 12h 00FF 12h 00FF 12h 0100 Đáy 0100 Đáy 0100 Đáy SP SP SP 00FCh SP 00FEh SP 0100h CX ? CX 5678h CX 5678h ? DX ? DX DX Sau lệnh PUSH BX Các lệnh PUSH, PUSHF, POP POPF không ảnh hưởng đến cờ Các lệnh thao tác với WORD Các lệnh sau không hợp lệ: 0000 Sau lệnh POP CX Một số lưu ý PUSH AH POP DL PUSH SP ; ghi bit ; ghi bit ; giá trị số 1234h Sau lệnh POP DX 599 600 150 Bài tập Bài tập (tiếp) Dữ liệu chương trình hợp ngữ khai báo dạng: DATA SEGMENT mem1 dw 500 mem2 dw -50 vec1 db 1, 2, 3, 4, 8, vec2 db 10, 20, -10, -20, -30, -40 DATA ENDS Hãy xác định nội dung DX (Hexa) sau thực đoạn lệnh sau: push mem1 push mem2 mov bp, sp mov dx, [bp]+2 a) FFCE b) 0000 c) 01F4 d) FFFF 601 602 Thủ tục Ngoài thủ tục chính, ta khai báo sử dụng thủ tục khác Khai báo thủ tục: Tên_thủ_tục PROC Kiểu_thủ_tục RET Tên_thủ_tục ENDP Lệnh CALL Là lệnh gọi chương trình (thủ tục) Thơng dụng: CALL Tên_thủ_tục Các bước thực hiện: Thủ tục NEAR SP ← SP – Cất nội dung IP (địa quay về) vào Stack Nạp địa lệnh chương trình vào IP Thủ tục FAR Trong đó: SP ← SP – Cất nội dung CS vào Stack SP ← SP – Cất nội dung IP vào Stack Nạp vào CS IP địa đầu chương trình Tên_thủ_tục: người lập trình định nghĩa Kiểu_thủ_tục: NEAR : gọi thủ tục đoạn FAR : gọi thủ tục đoạn khác 603 604 151 Lệnh RET Là lệnh trở từ chương trình Các bước thực hiện: Các thủ tục hợp ngữ khơng có danh sách tham số kèm ngơn ngữ lập trình bậc cao Người lập trình phải nghĩ cách truyền liệu thủ tục Các cách truyền liệu thông dụng: Trở kiểu NEAR IP ← word nhớ đỉnh Stack SP ← SP + Trở kiểu FAR Truyền liệu thủ tục (RETF) Truyền qua ghi Sử dụng biến toàn cục Truyền địa liệu Sử dụng ngăn xếp (thường dùng NNLT bậc cao) IP ← word nhớ đỉnh Stack SP ← SP + CS ← word nhớ tiếp SP ← SP + 605 Các ví dụ VD1: Nhập chuỗi kí tự kết thúc ENTER Hiện chuỗi kí tự viết theo thứ tự ngược lại dòng VD2: Cài đặt thủ tục viết số nhị phân số Hexa hình 607 606 Nội dung chương 5.1 Mở đầu lập trình hợp ngữ 5.2 Các cấu trúc lập trình với hợp ngữ 5.3 Các lệnh logic, lệnh dịch lệnh quay 5.4 Ngăn xếp thủ tục 5.5 Các lệnh nhân, chia 5.6 Các lệnh thao tác chuỗi 5.7 Một số ví dụ 608 152 5.5 Các lệnh nhân, chia Các lệnh MUL IMUL Có khác phép nhân số không dấu với phép nhân số khác dấu Lệnh nhân cho số không dấu: MUL nguồn Lệnh nhân cho số có dấu: IMUL nguồn Các lệnh làm việc với byte (cho KQ word) word (cho KQ double word) nguồn (thanh ghi / ngăn nhớ) coi số nhân, nguồn giá trị: Các lệnh MUL IMUL Các lệnh DIV IDIV Vào-ra số thập phân bit: AX ⇐ AL x nguồn Số bị nhân số bit chứa AL Tích số 16 bit chứa AX 16 bit: DXAX ⇐ AX x nguồn Số bị nhân số 16 bit chứa AX Tích số 16 bit chứa DXAX 609 Ảnh hưởng đến cờ 610 Các lệnh DIV IDIV Phép chia khơng dấu: DIV số_chia Phép chia có dấu: IDIV số_chia Chia số 16 bit (trong AX) cho số chia bit chia số 32 bit (trong DXAX) cho số chia 16 bit Thương số dư có kích thước với số chia SF, ZF, AF, PF : không xác định Sau lệnh MUL: CF = OF = nửa cao kết = CF = OF = trường hợp lại Sau lệnh IMUL: Số chia bit: AL chứa thương, AH chứa số dư Số chia 16 bit: AX chứa thương, DX chứa số dư CF = OF = nửa cao kết chứa giá trị dấu CF = OF = trường hợp lại Nói cách khác, CF = OF = nghĩa kết lớn để chứa nửa thấp (AL AX) tích 611 Số dư số chia có dấu Nếu số chia = thương nằm khoảng xác định BXL thực INT (lỗi chia cho 0) Các cờ không xác định sau phép chia 612 153 Sự mở rộng dấu số bị chia Trong phép chia cho Word, số bị chia đặt DXAX chứa vừa AX Khi DX phải chuẩn bị sau: Với lệnh DIV, DX phải xóa Với lệnh IDIV, DX lấp đầy bit dấu AX Phép biến đổi thực lệnh CWD Vào-ra số thập phân Các thao tác: In số thập phân Nhập số thập phân Trong phép chia cho Byte, số bị chia đặt AX chứa vừa AL Khi AH phải chuẩn bị sau: Với lệnh DIV, AH phải xóa Với lệnh IDIV, AH lấp đầy bit dấu AL Phép biến đổi thực lệnh CBW 613 614 a In số thập phân In số nguyên có dấu AX hình dạng số thập phân Thuật giải: In số thập phân (tiếp) Lấy dạng thập phân chữ số AX: Đếm := REPEAT Chia số bị chia cho 10 Cất số dư vào Stack Đếm := Đếm + UNTIL Thương = IF AX < THEN In dấu '− −' AX := số bù AX END IF Lấy dạng thập phân chữ số AX Đổi chữ số kí tự in hình ; số bị chia ban đầu = AX Đổi chữ số kí tự in hình: FOR Đếm lần DO Lấy chữ số từ Stack Đổi kí tự In kí tự hình END FOR 615 616 154 b Nhập số thập phân Nội dung chương Thuật giải (đơn giản): Tổng := Đọc kí tự ASCII REPEAT Đổi kí tự giá trị thập phân Tổng := Tổng * 10 + giá trị nhận Đọc kí tự UNTIL kí tự vừa nhận = Enter 5.1 Mở đầu lập trình hợp ngữ 5.2 Các cấu trúc lập trình với hợp ngữ 5.3 Các lệnh logic, lệnh dịch lệnh quay 5.4 Ngăn xếp thủ tục 5.5 Các lệnh nhân, chia 5.6 Các lệnh thao tác chuỗi 5.7 Một số ví dụ 617 5.6 Các lệnh thao tác chuỗi 618 Cờ định hướng Cờ định hướng DF (Direction Flag) xác định hướng cho thao tác chuỗi Các thao tác chuỗi thực thông qua ghi số SI DI Nếu DF = SI DI xử lý theo chiều tăng địa nhớ (từ trái qua phải chuỗi) Nếu DF = SI DI xử lý theo chiều giảm địa nhớ (từ phải qua trái chuỗi) Cờ định hướng Chuyển chuỗi Lưu kí tự vào chuỗi Nạp kí tự chuỗi Tìm kí tự chuỗi So sánh chuỗi Tổng kết thao tác chuỗi 619 620 155 Các lệnh CLD STD Lệnh CLD (Clear Direction Flag): xóa cờ hướng CLD ; xóa DF = Lệnh STD (Set Direction Flag): thiết lập cờ hướng STD ; thiết lập DF = Các lệnh không ảnh hưởng đến cờ khác Chuyển chuỗi Bài tốn: giả sử có chuỗi định nghĩa sau: DATA STRING1 STRING2 DB DB 'BACH KHOA' DUP (?) Cần chuyển nội dung chuỗi STRING1 (chuỗi nguồn) sang chuỗi STRING2 (chuỗi đích) 621 622 Các lệnh liên quan Lệnh: MOVSB (Move String Byte) Để chuyển nhiều kí tự ta cần sử dụng lệnh lặp Lệnh: REP Chuyển phần tử byte chuỗi gốc (trỏ DS:SI) sang phần tử chuỗi đích (trỏ ES:DI) Sau thực hiện: Lặp lại lệnh viết sau CX = Mỗi lần lặp CX giảm ⇒ số lần lặp phải gán trước vào CX Ví dụ: SI DI tăng thêm cờ hướng DF = (dùng lệnh CLD) SI DI giảm cờ hướng DF = (dùng lệnh STD) Lệnh: MOVSW Các lệnh liên quan (tiếp) MOV REP (Move String Word) Chuyển phần tử word (2 byte) chuỗi gốc (trỏ DS:SI) sang phần tử chuỗi đích (trỏ ES:DI) Sau thực hiện: SI DI tăng thêm cờ hướng DF = (dùng lệnh CLD) SI DI giảm cờ hướng DF = (dùng lệnh STD) CX, MOVSB ; chuyển byte từ chuỗi nguồn đến chuỗi đích Lệnh: REPE/REPZ Lặp lại lệnh viết sau CX = ZF = Lệnh: REPNE/REPNZ Lặp lại lệnh viết sau CX = ZF = 623 624 156 Ví dụ MOV MOV MOV LEA LEA CLD MOV REP AX, @DATA DS, AX ES, AX SI, STRING1 DI, STRING2 CX, MOVSB Giải thích ví dụ ; khởi tạo DS ; ES trỏ đến đoạn liệu DATA ; SI trỏ đến chuỗi nguồn ; DI trỏ đến chuỗi đích ; Xóa cờ hướng ; Số byte cần chuyển ; Chuyển byte từ STRING1 sang STRING2 625 626 Lưu kí tự vào chuỗi Lệnh: STOSB (Store String Byte from AL) Lưu kí tự 'A' vào đầu chuỗi STRING2 MOV MOV LEA CLD MOV MOV REP Chuyển nội dung ghi AL sang phần tử (1 byte) trỏ ES:DI chuỗi đích Sau thực hiện: DI tăng thêm cờ hướng DF = (dùng lệnh CLD) DI giảm cờ hướng DF = (dùng lệnh STD) Lệnh: STOSW Ví dụ (Store String Word from AX) AX, @DATA ES, AX DI, STRING2 CX, AL, 'A' STOSB ; ES trỏ đến đoạn liệu DATA ; ES:DI trỏ đến đầu chuỗi STRING2 ; Xóa cờ hướng ; Số kí tự cần lưu ; Kí tự cần lưu vào chuỗi ; Lặp lưu lần kí tự 'A' vào STRING2 Chuyển nội dung ghi AX sang phần tử (2 byte) trỏ ES:DI chuỗi đích Sau thực hiện: DI tăng thêm cờ hướng DF = (dùng lệnh CLD) DI giảm cờ hướng DF = (dùng lệnh STD) 627 628 157 Ví dụ Nhập kí tự từ bàn phím lưu vào chuỗi STRING nhập đủ 20 kí tự gặp phím ENTER MOV MOV LEA CLD MOV XOR MOV DocKiTu: INT CMP JZ STOSB INC LOOP DungNhap: AX, @DATA ES, AX DI, STRING CX, 20 BX, BX AH, 21h AL, 13 DungNhap BX DocKiTu ; ES trỏ đến đoạn liệu DATA ; ES:DI trỏ đến đầu chuỗi STRING ; Xóa cờ hướng ; Số kí tự tối đa nhập từ bàn phím ; Khởi tạo số kí tự nhập ban đầu = ; Hàm nhập kí tự từ bàn phím Nạp kí tự chuỗi Lệnh: LODSB (Load String Byte into AL) Chuyển phần tử (1 byte) trỏ DS:SI chuỗi nguồn vào ghi AL Sau thực hiện: SI tăng thêm cờ hướng DF = (dùng lệnh CLD) SI giảm cờ hướng DF = (dùng lệnh STD) ; Nhập kí tự ⇒ AL chứa mã ASCII kí tự ; Là phím ENTER ? ; ⇒ Dừng nhập ; Nếu khơng phải lưu AL vào chuỗi STRING ; Tăng số đếm số kí tự nhập ; Lặp lại (tối đa 20 lần) Lệnh: LODSW (Load String Word into AX) Chuyển phần tử (2 byte) trỏ DS:SI chuỗi nguồn vào ghi AX Sau thực hiện: SI tăng thêm cờ hướng DF = (dùng lệnh CLD) SI giảm cờ hướng DF = (dùng lệnh STD) 629 630 Ví dụ Giả sử STR1 STR2 chuỗi có độ dài 40 kí tự Viết đoạn chương trình chuyển kí tự chữ hoa từ STR1 sang STR2 MOV MOV MOV LEA LEA CLD MOV XOR VongLap: LODSB CMP JB CMP JA STOSB INC LapTiep: LOOP AX, @DATA DS, AX ES, AX SI, STR1 DI, STR2 CX, 40 BX, BX ; khởi tạo DS ; ES trỏ đến đoạn liệu DATA ; SI trỏ đến chuỗi nguồn STR1 ; DI trỏ đến chuỗi đích STR2 ; Xóa cờ hướng ; Số kí tự STR1 cần xét (độ dài xâu STR1) ; Khởi tạo số kí tự thực chuyển ban đầu = BX ; Nạp kí tự STR1 vào AL ; Nếu AL < 'A' ⇒ khơng phải chữ hoa ; xét kí tự ; Nếu AL > 'Z' ⇒ chữ hoa ; xét kí tự ; Nếu AL chữ hoa cất vào chuỗi STR2 ; Tăng số đếm số chữ hoa VongLap ; Lặp lại, xét kí tự STR1 AL, 'A' LapTiep AL, 'Z' LapTiep Tìm kí tự chuỗi Lệnh: SCASB (Scan String Byte) Trừ thử nội dung AL cho byte đích trỏ ES:DI, không thay đổi giá trị AL mà cập nhật cờ Sau thực hiện: DI tăng thêm cờ hướng DF = (dùng lệnh CLD) DI giảm cờ hướng DF = (dùng lệnh STD) Lệnh: SCASW (Scan String Word) Trừ thử nội dung AX cho word đích trỏ ES:DI, không thay đổi giá trị AX mà cập nhật cờ Sau thực hiện: DI tăng thêm cờ hướng DF = (dùng lệnh CLD) DI giảm cờ hướng DF = (dùng lệnh STD) 631 632 158 Ví dụ Cho chuỗi khai báo sau: DATA STRING1 Trước thực lệnh SCASB DI AL DB 'ABC' Khảo sát đoạn chương trình sau: MOV MOV CLD LEA MOV SCASB SCASB Ví dụ (tiếp) STRING1 'A' 'B' 'C' Offset 'B' DI, STRING1 AL, 'B' STRING1 'A' 'B' 'C' Offset 'B' 'A' 'B' 'C' Offset ZF (Không thấy) Sau thực lệnh SCASB thứ DI AL STRING1 ? (Không xác định) Sau thực lệnh SCASB thứ DI AL AX, @DATA ES, AX ZF 'B' ZF (Tìm thấy) 633 634 Ví dụ Tìm chữ 'A' chuỗi STRING2 có độ dài 40 kí tự Đoạn chương trình: MOV MOV CLD LEA MOV MOV REPNE AX, @DATA ES, AX DI, STRING2 CX, 40 AL, 'A' SCASB ; ES trỏ đến đoạn liệu ; Xóa cờ hướng ; ES:DI trỏ đến chuỗi đích STRING2 ; Độ dài chuỗi STRING2 ; AL chứa kí tự cần tìm ; Tìm thấy CX=0 So sánh chuỗi Lệnh: CMPSB (Compare String Byte) Trừ thử byte địa DS:SI cho byte địa ES:DI, kết không lưu lại mà cập nhật cờ Sau thực hiện: SI, DI tăng thêm cờ hướng DF = (dùng lệnh CLD) SI, DI giảm cờ hướng DF = (dùng lệnh STD) Lệnh: CMPSW (Compare String Word) Trừ thử word địa DS:SI cho word địa ES:DI, kết không lưu lại mà cập nhật cờ Sau thực hiện: Ra khỏi đoạn chương trình: SI, DI tăng thêm cờ hướng DF = (dùng lệnh CLD) SI, DI giảm cờ hướng DF = (dùng lệnh STD) Nếu ZF = ES:[DI-1] kí tự 'A' tìm thấy Nếu ZF = chuỗi STRING2 khơng chứa kí tự 'A' 635 636 159 Ví dụ Trước lệnh CMPSB thứ Cho chuỗi khai báo sau: DATA STRING1 STRING2 Ví dụ (tiếp) SI ZF DB DB 'ABC' 'ACB' STRING1 'A' 'B' 'C' Offset DI STRING2 'A' 'C' 'B' Offset Khảo sát đoạn chương trình sau: MOV MOV MOV CLD LEA LEA CMPSB CMPSB CMPSB Sau lệnh CMPSB thứ SI ? ZF STRING1 'A' 'B' 'C' Offset DI STRING2 'A' 'C' 'B' Offset SF AX, @DATA DS, AX ES, AX ? Sau lệnh CMPSB thứ SF Sau lệnh CMPSB thứ SI SI, STRING1 DI, STRING2 ZF STRING1 'A' 'B' 'C' Offset DI ZF STRING1 'A' 'B' 'C' Offset SI STRING2 'A' 'C' 'B' Offset DI SF STRING2 'A' 'C' 'B' Offset SF 637 Tổng kết thao tác chuỗi 638 Nội dung chương 5.1 Mở đầu lập trình hợp ngữ 5.2 Các cấu trúc lập trình với hợp ngữ 5.3 Các lệnh logic, lệnh dịch lệnh quay 5.4 Ngăn xếp thủ tục 5.5 Các lệnh nhân, chia 5.6 Các lệnh thao tác chuỗi 5.7 Một số ví dụ 639 640 160 5.7 Một số ví dụ Một số ví dụ (tiếp) Bài tập 3: Dùng vòng lặp hiển thị hình vẽ sau: Bài tập 1: Đọc chuỗi kí tự từ bàn phím gặp phím ENTER Hiện kí tự vừa nhập theo chiều ngược lại Bài tập 2: Nhập nội dung chuỗi STR1 có tối đa 40 kí tự từ bàn phím Q trình nhập kết thúc gặp phím ENTER Duyệt qua chuỗi STR1, chuyển kí tự chữ hoa sang chuỗi STR2 Hiển thị nội dung chuỗi STR2 hình Bài tập 4: Dùng vòng lặp hiển thị hình vẽ sau: 641 642 Kết thúc giảng 643 161 ... ⇒ Máy tính hoạt động theo chương trình Máy tính phân loại máy tính Máy tính phân loại máy tính Mơ hình máy tính Mơ hình phân lớp máy tính Phân loại máy tính Phân loại truyền thống: Máy vi tính. .. tác mà máy tính thực Kiểu liệu: kiểu liệu mà máy tính xử lý Chế độ địa Tổ chức máy tính (Computer Organization) Kiến trúc máy tính 17 Tổ chức máy tính 18 Tổ chức máy tính Nghiên cứu cấu trúc phần... (Microcomputer) Máy tính nhỏ (Minicomputer) Máy tính lớn (Mainframe Computer) Siêu máy tính (Supercomputer) Phân loại máy tính Phân loại đại: Máy tính cá nhân (Personal Computer) Máy chủ (Server) Máy tính

Ngày đăng: 30/01/2020, 15:53

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan