Bài giảng Kiến trúc máy tính - Chương 2: Ngôn ngữ của máy tính (Assembly) - Bài 2.6: Các lệnh Assembly cơ bản - Phạm Thanh Bình (Phần 2)
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kiến trúc máy tính - Chương 2: Ngôn ngữ của máy tính (Assembly) - Bài 2.6: Các lệnh Assembly cơ bản - Phạm Thanh Bình (Phần 2)", để 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:
bai_giang_kien_truc_may_tinh_chuong_2_ngon_ngu_cua_may_tinh.ppt
Nội dung text: Bài giảng Kiến trúc máy tính - Chương 2: Ngôn ngữ của máy tính (Assembly) - Bài 2.6: Các lệnh Assembly cơ bản - Phạm Thanh Bình (Phần 2)
- KIẾN TRÚC MÁY TÍNH Giảng viên: Ths Phạm Thanh Bình Bộ môn Kỹ thuật máy tính & mạng Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 1
- 2.6.6 Các lệnh logic, dịch, và quay Các phép logic Các phép dịch Các phép quay Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 2
- Các phép logic Phép toán AND (và) Phép toán OR (hoặc) Phép toán NOT (phủ định) Phép toán XOR (hoặc - phủ định) Các lệnh logic trong Assembly Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 3
- Phép toán AND (và) Quy tắc thực hiện phép toán AND giữa hai số nhị phân A và B được trình bày trong bảng sau: A B A AND B 0 0 0 0 1 0 1 0 0 1 1 1 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 4
- Ví dụ: Cho M = 16h, N = 0Dh, hãy tính M AND N = ? Giải: M = 0001 0110b (16h) N = 0000 1101b (0Dh) M AND N = 0000 0100b = 04h Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 5
- Phép toán OR (hoặc) Quy tắc thực hiện phép toán OR giữa hai số nhị phân A và B được trình bày trong bảng sau: A B A OR B 0 0 0 0 1 1 1 0 1 1 1 1 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 6
- Ví dụ: Cho M = 16h, N = 0Dh, hãy tính M OR N = ? Giải: M = 0001 0110b (16h) N = 0000 1101b (0Dh) M OR N = 0001 1111b = 1Fh Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 7
- Phép toán NOT (phủ định) Quy tắc thực hiện phép toán NOT giữa hai số nhị phân A và B được trình bày trong bảng sau: A NOT A 0 1 1 0 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 8
- Ví dụ: Cho M = 16h, hãy tính NOT M = ? Giải: M = 0001 0110b (16h) NOT M = 1110 1001b = E9h Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 9
- Phép toán XOR (hoặc - phủ định) Quy tắc thực hiện phép toán XOR giữa hai số nhị phân A và B được trình bày trong bảng sau: A B A XOR B 0 0 0 0 1 1 1 0 1 1 1 0 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 10
- Ví dụ: Cho M = 16h, N = 0Dh, hãy tính M XOR N = ? Giải: M = 0001 0110b (16h) N = 0000 1101b (0Dh) M XOR N = 0001 1011b = 1Bh Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 11
- Các lệnh logic trong Assembly Tương ứng với các phép toán logic trên, hợp ngữ có các lệnh sau đây: AND , OR , XOR , NOT : là một thanh ghi hay một ô nhớ : là một thanh ghi, một ô nhớ, hoặc một hằng số , không đồng thời là hai ô nhớ. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 12
- Ví dụ: AND AX, 002Ah OR AL, 3Dh NOT BX Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 13
- Ứng dụng các lệnh logic: Ví dụ 1: Hãy thay đổi bit dấu trong thanh ghi AX. XOR AX, 8000h Ví dụ 2: Hãy xoá bit LSB trong thanh ghi BH. AND BH, 0FEh Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 14
- Ví dụ 3: Nhập một kí tự số từ bàn phím (‘0’, ‘1’, , ‘9’), đổi nó sang số thập phân tương ứng. Giải: Ta sẽ sử dụng các lệnh logic để chuyển đổi kí tự sang số. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 15
- TITLE VI DU 3 .MODEL SMALL .STACK 100H .CODE MAIN PROC NhapLai: MOV AH, 1 ;Nhập một kí tự INT 21h CMP AL, ’0’ JB NhapLai ;Nếu AL ’9’ thì nhập lại AND AL, 0Fh ;Đổi sang số thập phân tương ứng ; (xoá 4 bit cao của AL) ;Các lệnh khác MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 16
- Các phép dịch Dịch trái Dịch phải Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 17
- Dịch trái Xét một dãy bit trong một thanh ghi hoặc một ô nhớ: phép dịch trái sẽ dịch chuyển toàn bộ các bít trong dãy về bên trái, giá trị của Msb được đưa vào cờ CF, thêm bit 0 vào vị trí Lsb Trước khi dịch trái: 1 1 1 0 0 1 1 0 CF Sau khi dịch trái: 1 ← 1 1 0 0 1 1 0 0 CF Msb Lsb Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 18
- Lệnh dịch trái Có thể sử dụng lệnh SHL (Shift Left) hoặc lệnh SAL (Shift Arithmetic Left), hai lệnh này tạo ra cùng một mã máy. Cú pháp lệnh: - Dạng 1: SHL , 1 - Dạng 2: SHL , CL : là một thanh ghi hay một ô nhớ Dạng 1 sẽ dịch các bít của toán hạng đích sang trái 1 lần, dạng 2 sẽ dịch các bít của toán hạng đích sang trái nhiều lần, số lần dịch chứa trong thanh ghi CL Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 19
- Ví dụ 1: SHL AX, 1 ;Dịch các bít của thanh ; ghi AX sang trái 1 lần Ví dụ 2: MOV CL, 3 SHL AX, CL ;Dịch các bít của thanh ;ghi AX sang trái 3 lần Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 20
- Ứng dụng của lệnh dịch trái Một trong số các ứng dụng của lệnh dịch trái là thực hiện phép nhân với 2. Giả sử AH = 0001 1010b = 1x24 + 1x23 + 1x21 = 26 Sau khi dịch trái 1 lần thì AH = 0011 0100b = 1x25 + 1x24 + 1x22 = 2x(1x24 + 1x23 + 1x21 ) = 52 Như vậy, phép dịch trái 1 lần tương đương phép nhân toán hạng đích với 2. Tổng quát: Phép dịch trái N lần tương đương phép nhân toán hạng đích với 2N. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 21
- Chú ý: Kết luận trên chỉ đúng khi không có hiện tượng tràn xảy ra. Ví dụ: Giả sử AH = 1000 0001b = 129 Sau khi dịch trái 1 lần thì AH = 0000 0010b = 2 Không phải là phép nhân với 2. Bít Msb của AH được chuyển vào cờ CF: cờ CF = 1 báo hiệu hiện tượng tràn xảy ra, kết quả không còn đúng nữa Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 22
- Dịch phải Xét một dãy bit trong một thanh ghi hoặc một ô nhớ: phép dịch phải sẽ dịch chuyển toàn bộ các bít trong dãy về bên phải, giá trị của Lsb được đưa vào cờ CF, thêm bit 0 vào vị trí Msb Trước khi dịch phải: 1 1 1 0 0 1 1 0 CF Sau khi dịch phải: 0 1 1 1 0 0 1 1 → 0 Msb Lsb CF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 23
- Lệnh dịch phải Có hai loại lệnh dịch phải: SHR (Shift Right) và SAR (Shift Arithmetic Right), tác dụng của chúng không hoàn toàn giống nhau. Cú pháp lệnh SHR: - Dạng 1: SHR , 1 - Dạng 2: SHR , CL : là một thanh ghi hay một ô nhớ Dạng 1 sẽ dịch các bít của toán hạng đích sang phải 1 lần, dạng 2 sẽ dịch các bít của toán hạng đích sang phải nhiều lần, số lần dịch chứa trong thanh ghi CL Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 24
- Ví dụ 1: SHR BX, 1 ;Dịch các bít của thanh ;ghi BX sang phải 1 lần Ví dụ 2: MOV CL, 3 SHR BX, CL ;Dịch các bít của thanh ;ghi BX sang phải 3 lần Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 25
- Ứng dụng của lệnh dịch phải Một trong số các ứng dụng của lệnh dịch phải là thực hiện phép chia cho 2. Giả sử AL = 0001 0000b = 1x24 = 16 Sau khi dịch phải 1 lần thì AL = 0000 1000b = 1x23 = 8 Như vậy, phép dịch phải 1 lần tương đương phép chia toán hạng đích cho 2. Tổng quát: Phép dịch phải N lần tương đương phép chia toán hạng đích cho 2N Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 26
- Chú ý: Kết luận trên chỉ đúng nếu không làm thay đổi bít dấu khi dịch phải. Ví dụ: Giả sử AL = 1000 0001b = -127 Sau khi dịch phải 1 lần thì AL = 0100 0000b = 64: Không phải là phép chia cho 2 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 27
- Chú ý: Do đó, đối với các số có dấu ta không được sử dụng lệnh SHR mà phải sử dụng lệnh SAR. Lệnh SAR sẽ giữ nguyên bít dấu khi dịch phải. Ví dụ: Ban đầu AL = 1000 0001b = -127 Sau lệnh SAR AL, 1 thì AL = 1100 0000b = -64 (bít dấu vẫn được giữ nguyên Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 28
- Các phép quay Lệnh quay trái (ROL - Rotate Left) Lệnh quay phải (ROR - Rotate Right) Lệnh quay trái qua cờ CF (RCL – Rotate Carry Left) Lệnh quay phải qua cờ CF (RCR – Rotate Carry Right) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 29
- Lệnh quay trái (ROL - Rotate Left) Lệnh quay trái cũng gần giống với lệnh dịch trái, chỉ khác ở chỗ bít Msb vừa được đưa vào cờ CF, vừa được đưa trở lại vị trí Lsb CF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 30
- Cú pháp lệnh: - Dạng 1: ROL , 1 (Quay trái một lần) - Dạng 2: ROL , CL (Quay trái nhiều lần, CL chứa số lần quay) : là một thanh ghi hay một ô nhớ Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 31
- Lệnh quay phải (ROR - Rotate Right) Lệnh quay phải cũng gần giống với lệnh dịch phải, chỉ khác ở chỗ bít Lsb vừa được đưa vào cờ CF, vừa được đưa trở lại vị trí Msb CF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 32
- Cú pháp lệnh: - Dạng 1: ROR , 1 (Quay phải một lần) - Dạng 2: ROR , CL (Quay phải nhiều lần, CL chứa số lần quay) : là một thanh ghi hay một ô nhớ Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 33
- Lệnh quay trái qua cờ CF (RCL – Rotate Carry Left) Lệnh này cũng gần giống với lệnh dịch trái, chỉ khác ở chỗ bít Msb được đưa vào cờ CF, còn nội dung cờ CF lại được đưa vào vị trí Lsb CF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 34
- Cú pháp lệnh: - Dạng 1: RCL , 1 (Quay một lần) - Dạng 2: RCL , CL (Quay nhiều lần, CL chứa số lần quay) : là một thanh ghi hay một ô nhớ Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 35
- Lệnh quay phải qua cờ CF (RCR – Rotate Carry Right) Lệnh này cũng gần giống với lệnh dịch phải, chỉ khác ở chỗ bít Lsb được đưa vào cờ CF, còn nội dung cờ CF lại được đưa vào vị trí Msb CF Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 36
- Cú pháp lệnh: - Dạng 1: RCR , 1 (Quay một lần) - Dạng 2: RCR , CL (Quay nhiều lần, CL chứa số lần quay) : là một thanh ghi hay một ô nhớ Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 37
- Ứng dụng của lệnh quay Ví dụ: Đếm số bít 1 trong thanh ghi AX Giải: Ta sẽ thực hiện lệnh quay AX 16 lần (quay trái hay quay phải đều được). Mỗi lần quay thì một bít sẽ được đưa vào cờ CF, nếu bít đó bằng 1 thì tăng BX lên 1 (BX chứa giá trị đếm được). Sau 16 lần quay thì thanh ghi AX sẽ trở lại giá trị ban đầu. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 38
- MOV CX, 16 ;CX chứa số lần lặp XOR BX ;Xoá BX để chuẩn bị chứa số lượng bít 1 Lap: ROL AX, 1 ;Quay trái AX 1 lần JNC TiepTuc ;Nếu CF = 0 (gặp bít 0) thì nhảy INC BX ;Nếu gặp bít 1 thì tăng BX TiepTuc: LOOP Lap Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 39
- 2.6.7 Ngăn xếp và thủ tục Các thành phần của chương trình Cách sử dụng ngăn xếp Thủ tục Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 40
- Các thành phần của chương trình TITLE .MODEL .STACK .DATA .CODE Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 41
- Ngăn xếp là vùng nhớ đặc biệt của chương trình. Có thể sử dụng vùng nhớ này để lưu trữ dữ liệu và giải phóng nó khi không dùng đến. Như vậy, việc sử dụng ngăn xếp một cách hợp lý sẽ giúp tiết kiệm bộ nhớ. Trong hợp ngữ, kích thước ngăn xếp của chương trình được khai báo sau từ khoá .Stack Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 42
- Một chương trình bao gồm ba phần cơ bản: Mã lệnh, Dữ liệu, Ngăn xếp. Khi chương trình được nạp vào bộ nhớ thì ba phần trên được nạp vào các đoạn nhớ khác nhau: Đoạn nhớ chứa phần mã lệnh được gọi là Đoạn mã (Code Segment), địa chỉ của nó được lưu giữ trong thanh ghi đoạn CS. Đoạn nhớ chứa phần dữ liệu được gọi là Đoạn dữ liệu (Data Segment), địa chỉ của nó được lưu giữ trong thanh ghi đoạn DS. Đoạn nhớ chứa phần ngăn xếp được gọi là Đoạn ngăn xếp (Stack Segment), địa chỉ của nó được lưu giữ trong thanh ghi đoạn SS. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 43
- Cách sử dụng ngăn xếp Cất dữ liệu vào ngăn xếp Lấy dữ liệu khỏi ngăn xếp Ứng dụng của ngăn xếp Cách thức làm việc của ngăn xếp Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 44
- Cất dữ liệu vào ngăn xếp Để cất dữ liệu vào ngăn xếp ta sử dụng lệnh Push, cách viết lệnh như sau: PUSH : là một thanh ghi hay một biến có kích thước 16 bít (1 word). Sau lệnh Push thì giá trị của toán hạng Nguồn vẫn giữ nguyên Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 45
- Ví dụ 1: PUSH AX Lệnh trên cất nội dung thanh ghi AX vào ngăn xếp. Ví dụ 2: PUSH A Lệnh trên cất nội dung biến A vào ngăn xếp (A phải là biến kiểu Word) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 46
- Lấy dữ liệu khỏi ngăn xếp Để lấy dữ liệu khỏi ngăn xếp ta sử dụng lệnh Pop, cách viết lệnh như sau: POP : là một thanh ghi hay một biến có kích thước 16 bít (1 word). Việc lấy dữ liệu khỏi ngăn xếp sẽ đồng thời giải phóng ô nhớ đang chứa dữ liệu (tức là có thể dùng nó để chứa dữ liệu khác). Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 47
- Ví dụ 1: POP AX Lệnh trên lấy dữ liệu từ ngăn xếp đặt vào thanh ghi AX. Ví dụ 2: POP A Lệnh trên lấy dữ liệu từ ngăn xếp đặt vào biến A (A phải là biến kiểu Word). Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 48
- Ứng dụng của ngăn xếp Ví dụ 1: Hãy chuyển nội dung của thanh ghi đoạn DS vào thanh ghi đoạn ES Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 49
- Giải: Do không thể chuyển trực tiếp nội dung của hai thanh ghi đoạn cho nhau (xem lại phần lệnh MOV) nên ta sẽ sử dụng ngăn xếp làm trung gian: dữ liệu được chuyển từ DS vào ngăn xếp, sau đó lấy từ ngăn xếp chuyển vào ES: PUSH DS ;Cất DS vào ngăn xếp POP ES ;Lấy dữ liệu từ ngăn xếp đặt ; vào ES Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 50
- Ví dụ 2: Viết chương trình nhập một kí tự từ bàn phím rồi hiện nó ở đầu dòng tiếp theo Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 51
- Giải: TITLE Vi du 2 .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AH, 1 ;Chức năng số 1: Nhập một kí tự INT 21h PUSH AX ;Cất kí tự vào ngăn xếp MOV AH, 2 ;Đưa con trỏ về đầu dòng tiếp theo MOV DL, 0Dh INT 21h MOV DL, 0Ah INT 21h POP DX ;Lấy kí tự từ ngăn xếp đặt vào DL INT 21h ;Hiển thị kí tự MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP END MAIN Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 52
- Giải thích: Kí tự nhập vào được cất ở thanh ghi AL. Để đưa con trỏ xuống đầu dòng tiếp theo thì phải hiển thị hai kí tự có mã ASCII là 0Dh (CR: về đầu dòng) và 0Ah (LF: xuống dòng). Quá trình hiển thị hai kí tự này sẽ làm thanh ghi AL bị thay đổi (xem lại chức năng số 2 của ngắt 21h). Do đó cần phải lưu kí tự ban đầu vào ngăn xếp trước khi xuống dòng, khi nào muốn hiển thị kí tự này thì lại lấy nó ra từ ngăn xếp Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 53
- Ví dụ 3: Viết lệnh thực hiện các công việc sau: + Lưu nội dung thanh ghi cờ vào AX. + Xoá thanh ghi cờ. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 54
- Giải: Ta không thể tác động tới thanh ghi cờ bằng các lệnh thông thường đã học như MOV, ADD, SUB, AND, OR Bộ vi xử lý 8086 cung cấp hai lệnh sau để thao tác với thanh ghi cờ (cả hai lệnh đều liên quan tới ngăn xếp): PUSHF ;Cất nội dung thanh ghi cờ vào ngăn xếp POPF ;Lấy dữ liệu từ ngăn xếp đặt vào thanh ghi cờ Sử dụng hai lệnh này ta có thể giải quyết yêu cầu đặt ra ở trên Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 55
- PUSHF POP AX ;chuyển nội dung thanh ghi cờ từ ngăn xếp vào AX XOR BX, BX ;xóa BX (BX = 0) PUSH BX ;Đặt giá trị 0 vào ngăn xếp POPF ;Chuyển giá trị 0 từ ngăn xếp vào thanh ghi cờ (xoá các cờ) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 56
- Cách thức làm việc của ngăn xếp Kích thước của ngăn xếp được khai báo ở đầu chương trình hợp ngữ sau từ khoá .Stack Ví dụ: .Stack 100h Khi đó ngăn xếp có kích thước bằng 100h byte (256 byte hay 128 word) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 57
- Mỗi lệnh Push sẽ chiếm dụng 1 word của ngăn xếp, như vậy ngăn xếp khai báo như trên sẽ cho phép cất tối đa 128 lần. Người lập trình sẽ phải tính toán để khai báo ngăn xếp có kích thước hợp lý nhất (không quá thừa hay thiếu) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 58
- Cấu trúc của ngăn xếp: Dữ liệu được lấy ra khỏi ngăn xếp theo trình tự ngược lại so với khi cất vào, nghĩa là cất vào sau thì sẽ được lấy ra trước (LIFO - Last In First Out). Bộ vi xử lý 8086 sử dụng hai thanh ghi chuyên dụng cho các thao tác với ngăn xếp là SS (Stack Segment) và SP (Stack Pointer). SS chứa địa chỉ segment còn SP chứa địa chỉ offset của ô nhớ trong ngăn xếp Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 59
- Dữ liệu được cất vào ngăn xếp theo trật tự ngược lại so với các đoạn nhớ khác (từ địa chỉ cao xuống địa chỉ thấp). Giả sử khai báo ngăn xếp là .Stack 100h thì ngăn xếp sẽ bắt đầu tại địa chỉ offset = 0100h và kết thúc tại offset = 0000h (xem hình trang sau) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 60
- 0000h Kết thúc stack 00FAh 00FCh 00FEh offset = 0100h SP = 0100h Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 61
- Khi ngăn xếp chưa có dữ liệu thì SP trỏ tới ô nhớ có địa chỉ cao nhất trong ngăn xếp. Sau mỗi lệnh Push thì SP sẽ giảm đi 2 để trỏ tới ô tiếp theo của ngăn xếp, dữ liệu sẽ được cất vào ô nhớ do SP trỏ tới Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 62
- Ví dụ: Cất ba thanh ghi AX, BX, CX vào ngăn xếp: PUSH AX PUSH BX PUSH CX Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 63
- Sau lệnh PUSH AX: 00FAh 00FCh 00FEh AX SP = 00FEh 0100h Rỗng Do giảm SP đi 2 rồi mới cất thanh ghi AX vào ngăn xếp nên sẽ tạo ra một ô rỗng ở địa chỉ cao nhất Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 64
- Sau lệnh PUSH BX: 00FAh 00FCh BX SP = 00FEh 00FEh AX 0100h Rỗng Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 65
- Sau lệnh PUSH CX: 00FAh CX SP = 00FEh 00FCh BX 00FEh AX 0100h Rỗng Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 66
- Muốn lấy nội dung của ba thanh ghi ra khỏi ngăn xếp thì phải tiến hành theo trình tự ngược lại: POP CX POP BX POP AX Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 67
- Sau lệnh POP CX: 00FAh - 00FCh BX SP = 00FEh 00FEh AX 0100h Rỗng Dữ liệu tại ô nhớ do SP trỏ tới (offset = 00FAh) sẽ được nạp vào thanh ghi CX, sau đó SP tăng lên 2 để trỏ tới ô cao hơn. Ô nhớ chứa CX đã được giải phóng nên ta không cần quan tâm tới nội dung bên trong nó nữa Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 68
- Sau lệnh POP BX: Dữ liệu tại ô nhớ có offset = 00FCh được nạp vào thanh ghi BX 00FAh - 00FCh BX 00FEh AX SP = 00FEh 0100h Rỗng Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 69
- Sau lệnh POP AX: Dữ liệu tại ô nhớ có offset = 00FEh được nạp vào thanh ghi AX. 00FAh - 00FCh BX 00FEh AX 0100h Rỗng SP = 00FEh Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 70
- Thủ tục Cấu trúc thủ tục Sử dụng thủ tục trong chương trình Quan hệ giữa thủ tục và ngăn xếp Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 71
- Cấu trúc thủ tục PROC ;Bắt đầu thủ tục Lệnh 1 Lệnh 2 Lệnh 3 RET ;Trở về chương trình chính ENDP ;Kết thúc thủ tục Đây là cấu trúc của một thủ tục thông thường (không là chương trình chính), nó phải được kết thúc bởi lệnh RET để trở về chương trình chính. Lệnh RET thường nằm ở cuối thủ tục, nhưng nó cũng có thể nằm ở một vị trí khác Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 72
- Ví dụ: Viết một thủ tục đưa con trỏ màn hình xuống đầu dòng tiếp theo. Giải: Để đưa con trỏ xuống đầu dòng tiếp theo cần hiển thị các kí tự CR (0Dh) và LF (0Ah). Ta đặt tên thủ tục này là Writeln Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 73
- Writeln PROC MOV AH, 2 ;Chức năng số 2 của ; ngắt 21h để hiện kí tự MOV DL, 0Dh INT 21h MOV DL, 0Ah INT 21h RET Writeln ENDP Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 74
- Sử dụng thủ tục trong chương trình Để gọi một thủ tục từ chương trình chính ta sử dụng lệnh Call, cú pháp lệnh như sau: CALL Cấu trúc của một chương trình assembly có sử dụng thủ tục như sau: Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 75
- TITLE .MODEL .STACK .DATA .CODE PROC Lệnh 1 Lệnh 2 Lệnh 3 CALL ;Gọi thủ tục ENDP PROC Lệnh 1 Lệnh 2 Lệnh 3 RET ;Trở về chương trình chính ENDP Các thủ tục khác END Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 76
- Ví dụ: Viết chương trình nhập một kí tự từ bàn phím rồi hiện nó ở đầu dòng tiếp theo (có sử dụng thủ tục). Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 77
- TITLE Vi du .MODEL SMALL .STACK 100H .CODE MAIN PROC MOV AH, 1 ;Nhập một kí tự INT 21h PUSH AX ;Cất kí tự vào ngăn xếp CALL Writeln ;Đưa con trỏ về đầu dòng tiếp theo POP DX ;Lấy kí tự từ ngăn xếp đặt vào DL MOV AH, 2 ;Hiển thị kí tự INT 21h MOV AH, 4Ch ;Kết thúc INT 21h MAIN ENDP Writeln PROC ;Thủ tục đưa con trỏ về đầu dòng tiếp theo MOV AH, 2 MOV DL, 0Dh INT 21h MOV DL, 0Ah INT 21h RET Writeln ENDP ENDBộ môn MAIN Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 78
- Quan hệ giữa thủ tục và ngăn xếp Khi lệnh Call gọi một thủ tục thì các lệnh của thủ tục đó sẽ thi hành. Vậy làm cách nào để quay trở về chương trình chính sau khi thủ tục thi hành xong? Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 79
- Trình tự thực hiện lệnh của bộ vi xử lý 8086: Đoạn mã lệnh có địa chỉ segment nằm trong thanh ghi CS, còn offset của các lệnh sẽ được đặt vào thanh ghi con trỏ lệnh IP (Instruction Pointer). Như vậy cặp thanh ghi CS:IP chứa địa chỉ của ô nhớ nào thì lệnh tại ô nhớ đó sẽ được thi hành. Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 80
- Khi sử dụng lệnh Call thì các công việc sau đây được thực hiện: Cất địa chỉ của lệnh đứng sau lệnh Call (trong chương trình chính) vào ngăn xếp. Nạp địa chỉ lệnh đầu tiên của thủ tục vào cặp thanh ghi CS:IP (tức là thi hành lệnh này). Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 81
- Lần lượt các lệnh trong thủ tục sẽ được thi hành cho tới khi gặp lệnh RET. Lệnh RET sẽ lấy địa chỉ lệnh từ ngăn xếp (do lệnh Call cất trước đó) rồi nạp vào các thanh ghi CS:IP. Như vậy quyền điều khiển đã được trả về chương trình chính (xem sơ đồ trang sau) Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 82
- Call Lệnh tiếp theo Chương trình chính Lệnh đầu tiên Thủ tục RET Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 83
- Hết Phần 2.3 Bộ môn Kỹ thuật máy tính & mạng – Khoa CNTT Kiến trúc máy tính 2 - 84