1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

BỘ THỰC HÀNH VI XỬ LÝ MTS86C

120 28 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 120
Dung lượng 6,79 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • 1 Giới thiệu tổng quát về phần cứng

  • 2 Bản đồ của bộ nhớ và địa chỉ các cổng vào - ra

    • 2.1 Bản đồ của bộ nhớ

    • 2.2 Địa chỉ các cổng vào ra

  • 3 Bộ vi xử lý 8086 của Intel

    • 3.1 Sơ đồ khối của 8086

    • 3.2 Các thanh ghi của 8086

      • 3.2.1 Các thanh ghi đa năng

      • 3.2.2 Các thanh ghi đoạn

      • 3.2.3 Thanh ghi con trỏ và chỉ số

      • 3.2.4 Thanh ghi cờ F

    • 3.3 Sơ đồ chân và chức năng các chân của 8086

  • 4 Lập trình hợp ngữ

    • 4.1 Tổng quan về lập trình hợp ngữ

      • 4.1.1 Cú pháp của hợp ngữ

      • 4.1.2 Dữ liệu chương trình

      • 4.1.3 Biến và hằng

      • 4.1.4 Khung của một chương trình hợp ngữ

      • 4.1.5 Cách tạo và chạy một chương trình hợp ngữ

    • 4.2 Các chế độ địa chỉ của họ vi xử lý 80x86

      • 4.2.1 Chế độ địa chỉ thanh ghi (Register Addressing Mode)

      • 4.2.2 Chế độ địa chỉ tức thời (Immediate Addressing Mode)

      • 4.2.3 Chế độ địa chỉ trực tiếp (Direct Addressing Mode)

      • 4.2.4 Chế độ địa chỉ gián tiếp qua thanh ghi (Register Direct Addressing Mode)

      • 4.2.5 Chế độ địa chỉ tương đối cơ sở (Based Relative Addressing Mode)

      • 4.2.6 Chế độ địa chỉ tương đối chỉ số (Indexed Relative Addressing Mode)

      • 4.2.7 Chế độ địa chỉ tương đối chỉ số cơ sở (Based Indexed Relative Addressing Mode)

    • 4.3 Một số hàm của ngắt 21H

      • 4.3.1 Lệnh INT

      • 4.3.2 Hàm 1

      • 4.3.3 Hàm 4CH

      • 4.3.4 Hàm 2

      • 4.3.5 Hàm 9

    • 4.4 Các nhóm lệnh của 8086

      • 4.4.1 Nhóm lệnh dịch chuyển dữ liệu

      • 4.4.2 Nhóm lệnh số học

      • 4.4.3 Nhóm lệnh điều khiển rẽ nhánh

      • 4.4.4 Nhóm lệnh xử lý bit

      • 4.4.5 Nhóm lệnh xử lý điều khiển

      • 4.4.6 Nhóm lệnh xử lý chuỗi

    • 4.5 Ngăn xếp và thủ tục

      • 4.5.1 Ngăn xếp

      • 4.5.2 Thủ tục

  • 5 Chức năng cơ bản của các phím

    • 5.1 Các phím chức năng

    • 5.2 Các phím HEXADECIMAL

  • 6 Hoạt động của các phím chức năng

    • 6.1 Kiểm tra và thay đổi nội dung của địa chỉ nhớ

    • 6.2 Kiểm tra và thay đổi nội dung thanh ghi

    • 6.3 Thực hiện chương trình

  • 7 Debug bằng bàn phím của MTS-86C

    • 7.1 Sử dụng phím ST để thực hiện bước đơn

    • 7.2 Sử dụng phím ER kiểm tra và thay đổi nội dung thanh ghi

    • 7.3 Kiểm tra nội dung thanh ghi [ER] khi đang sử dụng bước đơn [ST]

    • 7.4 Kiểm tra và thay đổi nội dung thanh ghi bằng phím REG và ER

    • 7.5 Địa chỉ bắt đầu định dạng bước đơn

  • 8 Dịch từ file .asm sang file .hex , tải file .hex xuống RAM hoặc ROM, chạy chương trình

    • 8.1 Dịch từ file .asm sang file .hex

    • 8.2 Tải file .hex xuống Ram hoăc Rom

    • 8.3 Chạy chương trình

    • 8.4 Khảo sát nội dung của bộ nhớ

    • 8.5 Khảo sát nội dung của các thanh ghi

    • 8.6 Chương trình từ bàn phím MCS -8086C

  • 9 Một số chương trình cơ bản

    • 9.1 Xuất ffh ra 8 led đơn

    • 9.2 Chương trình nhấp nháy 8 led

    • 9.3 Chương trình led 7 đoạn

    • 9.4 Chương trình điều khiển động cơ bước

    • 9.5 Chương trình điều khiển bàn phím

    • 9.6 Chương trình điều khiển LCD

  • 10 Phụ lục: Sơ đồ nguyên lý bộ thí nghiệm

    • 10.1 KIT MTS – 86C

    • 10.2 Các module đi kèm

      • 10.2.1 MTS86 CONN BOARD

      • 10.2.2 Lò nhiệt

      • 10.2.3 DC MOTOR

      • 10.2.4 STEP MOTOR

      • 10.2.5 RELAY BOARD

Nội dung

Bản đồ của bộ nhớ

Bảng 2.1 – Bản đồ của bộ nhớ

Chương trình điều khiển hệ thống 64KB EPROM Bộ nhớ hệ thống 27256x2 Các chương trình mô phỏng

Vùng nhớ lựa chọn ROM, RAM ( lựa chọn)

Chương trình và dữ liệu 64KB SRAM bộ nhớ chương trình 62256x2Vec tơ ngắt

Địa chỉ các cổng vào ra

Bảng 2.2 – Địa chỉ các cổng vào ra Địa chỉ các cổng Chức năng các cổng Ghi chu

8255-1: từ điều khiển 8255-1: cổng C 8255-1: cổng B 8255-1: cổng A

Cổng vào ra 1, PPI- 1

8255-2: từ điều khiển 8255-2: cổng C 8255-2: cổng B 8255-2: cổng A

Cổng vào ra 1, PPI- 2

8251-1: thanh ghi lệnh 8251-1: thanh ghi dữ liệu

Cổng nối tiếp RS232

8279: thanh ghi từ điều khiển lệnh 8279: thanh ghi dữ liệu

8253: thanh ghi lệnh 8253: thanh ghi của bộ đếm 2 8253: thanh ghi của bộ đếm 1 8253: thanh ghi của bộ đếm 0

Bộ đếm và bộ định thời

8251-2: thanh ghi lệnh 8251-2: thanh ghi dữ liệu

Cổng nối tiếp RS232

8259: thanh ghi lệnh 2 8259: thanh ghi lệnh 1 Điều khiển ngắt

LCD : địa chỉ thanh ghi dữ liệu LCD: địa chỉ cho phép đọc lệnh LCD: địa chỉ cho phép ghi

3FD8H Địa chỉ biến đổi D/A

8255-3: từ điều khiển 8255-3: Cổng C 8255-3: Cổng B 8255-3: Cổng A

Cổng C: loa Cổng B: nối led đơn Cổng A: phím bấm

Biến đổi A/D vào IN3 hoặc IN7Biến đổi A/D vào IN2 hoặc IN6Biến đổi A/D vào IN1 hoặc IN5Biến đổi A/D vào IN0 hoặc IN4

3 Bộ vi xử lý 8086 của Intel

Sơ đồ khối của 8086

Cấu truc bên trong của 8086 được mô tả một cách đơn giản thông qua sơ đồ khối trên hình 3.1.

Hình 3.1 - Sơ đồ khối của 8086

Có thể coi 8086 gồm hai khối chính: a Khối thực hiện lệnh

Khối thực hiện lệnh (EU − Execution Unit) là nơi giải mã và thi hành các lệnh EU bao gồm:

− Bộ xử lý số học và logic (ALU − Arithmatic Logical Unit) là nơi thực hiện các lệnh số học và lệnh logic

− Các thanh ghi 16 bit chứa toán hạng.

Khối điều khiển (CU - Control Unit) có nhiệm vụ tạo các tín hiệu điều khiển cho các bộ phận bên trong và bên ngoài CPU Bên trong khối điều khiển có mạch giải mã lệnh, nơi mã lệnh được đọc từ bộ nhớ và đưa vào đầu vào của bộ giải mã Thông tin từ đầu ra của mạch giải mã sẽ được chuyển đến mạch tạo xung điều khiển, từ đó tạo ra các dãy xung khác nhau tùy theo mã lệnh, nhằm điều khiển hoạt động của các bộ phận bên trong và bên ngoài CPU.

Khối giao tiếp bus (BIU - Bus Interface Unit) có vai trò quan trọng trong việc đảm bảo việc trao đổi thông tin giữa vi xử lý 8086 và các linh kiện bên ngoài như vi mạch nhớ, vi mạch ghép nối vào/ra BIU bao gồm các thành phần thiết yếu để thực hiện chức năng này.

- Một bộ cộng để tạo địa chỉ vật lý 20 bit từ các thanh ghi 16 bit

- Bốn thanh ghi đoạn 16 bit gồm CS, DS, SS và ES để giup 8086 truy cập tới các đoạn trên bộ nhớ.

- Mạch logic điều khiển bus có nhiệm vụ đảm bảo giao tiếp giữa 8086 với các thiết bị bên ngoài (thông qua bus ngoài)

Hàng đợi lệnh, hay còn gọi là bộ đệm lệnh, có độ dài 6 byte, chứa các mã lệnh sẵn có để chờ EU xử lý Đây là một cấu trúc mới được Intel đưa vào bộ vi xử lý 8086 nhằm thực hiện kỹ thuật xử lý xen kẽ liên tục dòng mã lệnh (kỹ thuật pipeline), giúp cải thiện tốc độ xử lý của CPU.

Thông thường trong các bộ vi xử lý ở các thế hệ trước, hoạt động của CPU để thực hiện một lệnh gồm 3 giai đoạn:

- Đọc mã lệnh (fetch, viết tắt là F)

- Giải mã lệnh (decode, viết tắt là D)

- Thực hiện lệnh (execute, viết tắt là E)

Trong bộ vi xử lý 8086, CPU hoạt động tuần tự với ba giai đoạn: đọc mã lệnh, giải mã lệnh và thực thi lệnh Tuy nhiên, để khắc phục nhược điểm khi CPU chỉ thực hiện một công việc tại một thời điểm, Intel đã áp dụng cơ chế xử lý xen kẽ liên tục giữa các dòng mã lệnh CPU được chia thành hai khối chức năng: khối BIU đảm nhiệm việc đọc mã lệnh và khối EU thực hiện giải mã và thi hành lệnh Cả hai khối này có khả năng làm việc đồng thời, cho phép bus được sử dụng liên tục Trong khi EU giải mã hoặc thực hiện các thao tác nội bộ, BIU có thể đọc mã lệnh tiếp theo từ bộ nhớ chính và đưa vào hàng đợi lệnh theo kiểu FIFO (First In First Out) Sự phối hợp hiệu quả giữa hai khối này giúp cải thiện tốc độ hoạt động của CPU.

Các thanh ghi của 8086

Các thanh ghi đa năng

Trong khối EU, có bốn thanh ghi đa năng 16 bit là AX, BX, CX và DX Đặc biệt, khi cần lưu trữ dữ liệu 8 bit, mỗi thanh ghi này có thể được chia thành hai thanh ghi 8 bit độc lập, cụ thể là các cặp thanh ghi AH và AL.

Các thanh ghi BH, BL, CH, CL, DH, và DL (trong đó H chỉ phần cao, L chỉ phần thấp) có khả năng chứa nhiều loại dữ liệu khác nhau Tuy nhiên, một số công việc cụ thể chỉ sử dụng một vài thanh ghi nhất định Do đó, các thanh ghi thường được gán cho những tên gọi đặc biệt và có ý nghĩa riêng.

AX (Accumulator register) là thanh ghi lưu trữ các kết quả của các thao tác, thường được sử dụng trong các phép toán Nếu kết quả là 8 bit, thanh ghi AL sẽ được sử dụng để chứa thông tin này.

− BX (Base register): thanh ghi cơ sở, thường chứa địa chỉ cơ sở của một bảng khi dùng lệnh XLAT.

CX (thanh ghi đếm) là một thanh ghi quan trọng, thường được sử dụng để lưu trữ số lần lặp trong các lệnh LOOP Trong khi đó, CL thường chứa số lần dịch hoặc quay trong các lệnh liên quan đến dịch hoặc quay thanh ghi.

DX (thanh ghi dữ liệu) là một thành phần quan trọng trong các phép toán nhân và chia số 16 bit, cùng với AX Ngoài ra, DX còn được sử dụng để lưu trữ địa chỉ của các cổng trong các lệnh vào/ra dữ liệu trực tiếp.

Các thanh ghi đoạn

Khối BIU của bus 8086 sử dụng địa chỉ 20 bit, cho phép phân biệt 2^20 = 1.048.576 ô nhớ, tương đương với 1Mbyte Trong không gian bộ nhớ 1Mbyte này, cần phải chia thành các vùng khác nhau để sử dụng hiệu quả.

− Chứa mã chương trình.

− Chứa dữ liệu và kết quả trung gian của chương trình.

− Tạo ra một vùng nhớ đặc biệt gọi là ngăn xếp dùng vào việc quản lý các thông số của bộ vi xử lý.

Bộ vi xử lý 8086 có các thanh ghi 16 bit được gọi là thanh ghi đoạn, bao gồm thanh ghi đoạn mã CS (code segment), thanh ghi đoạn dữ liệu DS (data segment), thanh ghi đoạn ngăn xếp SS (stack segment) và thanh ghi đoạn dữ liệu phụ ES (extra segment) Những thanh ghi này chỉ ra địa chỉ đầu của bốn đoạn trong bộ nhớ, với dung lượng lớn nhất của mỗi đoạn là 64Kbyte.

Nội dung của thanh ghi đoạn xác định địa chỉ ô nhớ ở đầu đoạn, được gọi là địa chỉ cơ sở Địa chỉ của các ô nhớ khác trong đoạn được tính bằng cách cộng thêm vào địa chỉ cơ sở một giá trị gọi là địa chỉ lệch Địa chỉ lệch này được xác định bởi một thanh ghi 16 bit khác, đóng vai trò là thanh ghi lệch Để xác định địa chỉ vật lý 20 bit của một ô nhớ trong đoạn bất kỳ, vi xử lý 8086 sử dụng hai thanh ghi 16 bit Công thức tạo ra địa chỉ vật lý từ nội dung của hai thanh ghi là: Địa chỉ vật lý = Nội dung thanh ghi đoạn x 16 + Nội dung thanh ghi lệch Việc sử dụng hai thanh ghi để ghi nhớ thông tin về địa chỉ thực chất tạo ra một loại địa chỉ gọi là địa chỉ logic, ký hiệu là thanh ghi đoạn: thanh ghi lệch hay segment: offset.

Thanh ghi con trỏ và chỉ số

Trong 8086 còn có ba thanh ghi con trỏ và hai thanh ghi chỉ số 16 bit là:

Thanh ghi con trỏ lệnh IP (Instruction Pointer) luôn chỉ vào lệnh tiếp theo sẽ được thực hiện trong đoạn mã CS Địa chỉ đầy đủ của lệnh này được biểu thị là CS: IP.

Thanh ghi con trỏ cơ sở BP (Base Pointer) là một thành phần quan trọng trong kiến trúc máy tính, luôn trỏ đến một phần tử dữ liệu nằm trong đoạn ngăn xếp SS Địa chỉ đầy đủ của phần tử này được biểu diễn dưới dạng SS:BP, giúp quản lý và truy xuất dữ liệu hiệu quả trong quá trình thực thi chương trình.

Thanh ghi con trỏ ngăn xếp (Stack Pointer) luôn chỉ vào đỉnh hiện thời của ngăn xếp trong đoạn ngăn xếp SS Địa chỉ đầy đủ của đỉnh ngăn xếp được biểu diễn dưới dạng SS: SP.

− Thanh ghi chỉ số nguồn SI (Source Index): SI chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ đầy đủ là DS: SI.

− Thanh ghi chỉ số đích DI (Destination Index): chỉ vào dữ liệu trong đoạn dữ liệu DS mà địa chỉ đầy đủ là DS: DI.

Ngoài các chức năng trên, các thanh ghi này đều có thể được dùng như các thanh ghi đa năng.

Thanh ghi cờ F

Thanh ghi cờ là một thành phần quan trọng trong CPU, với mỗi bit đại diện cho một trạng thái cụ thể của kết quả phép toán do ALU thực hiện hoặc trạng thái hoạt động của EU Các lập trình viên dựa vào các cờ này để xác định các lệnh tiếp theo cho bộ vi xử lý Thanh ghi cờ có kích thước 16 bit, nhưng chỉ 9 bit được sử dụng để biểu thị các cờ cụ thể như O, D, I, T, S, Z, A, P, và C, trong khi phần còn lại không được định nghĩa.

Hình 3.2 - Sơ đồ thanh ghi cờ của bộ 8086

− C hoặc CF (Carry Flag): Cờ nhớ, CF = 1 khi có nhớ hoặc mượn.

Cờ chẵn lẻ (PF) là một tín hiệu phản ánh tính chẵn lẻ của tổng số bit 1 trong kết quả Khi tổng số bit 1 là chẵn, cờ PF sẽ có giá trị bằng 1.

Cờ nhớ phụ (AF) là một chỉ số quan trọng khi làm việc với các số BCD, cho biết tình trạng mượn hoặc nhớ Cụ thể, AF sẽ bằng 1 khi có sự mượn từ một số BCD thấp (4 bit thấp) sang một số BCD cao (4 bit cao).

− Z hoặc ZF (Zero Flag): Cờ rỗng (cờ không), ZF = 1 khi kết quả bằng 0.

− S hoặc SF (Sign Flag): Cờ dấu, SF = 1 khi kết quả âm.

− OF (Overflow Flag): Cờ tràn, OF = 1 khi kết quả là một số bù 2 vượt ra ngoài giới hạn biểu diễn dành cho nó.

Bài viết đề cập đến 6 bit cờ trạng thái phản ánh các trạng thái khác nhau của kết quả sau một thao tác Trong số đó, 5 bit cờ đầu thuộc byte thấp của thanh ghi cờ tương tự như bộ vi xử lý 8085 của Intel Bên cạnh đó, bộ vi xử lý 8086 còn có thêm các cờ điều khiển khác.

− T hoặc TF (Trap Flag): Cờ bẫy, TF = 1 thì CPU làm việc ở chế độ chạy từng lệnh một.

Cờ IF (Interrupt Flag) cho phép CPU quản lý các yêu cầu ngắt Khi IF = 1, CPU cho phép các yêu cầu ngắt có thể bị che đậy tác động; ngược lại, khi IF = 0, CPU sẽ cấm các yêu cầu ngắt này, ngoại trừ ngắt không thể che đậy (NMI - Non Maskable Interrupt).

− D hoặc DF (direction flag): Cờ hướng (cờ lùi), IF = 1 khi CPU làm việc với chuỗi ký tự theo thứ tự từ phải qua trái.

Sơ đồ chân và chức năng các chân của 8086

Hình 3.3 - Sơ đồ chân của 8086

Vi xử lý 8086 được thiết kế để hoạt động ở một trong hai chế độ, tuỳ thuộc vào mức điện áp đặt ở chân số 33 (chân ):

Chế độ tối thiểu (chế độ MIN) được thiết lập khi điện áp chân số 33 đạt 5V Đây là chế độ trong hệ thống chỉ bao gồm vi xử lý 8086 cùng với các vi mạch nhớ và các vi mạch ghép nối vào/ra.

Chế độ tối đa (chế độ MAX) được thiết lập khi điện áp chân số 33 là 0V, áp dụng cho hệ thống đa xử lý với nhiều vi xử lý 8086 và đồng xử lý 8087 Trong chế độ này, bộ vi xử lý có khả năng sử dụng vi mạch điều khiển bus bên ngoài để giải mã các tín hiệu trạng thái /S0, /S1 và /S2, đồng thời cung cấp tất cả các tín hiệu điều khiển bus cần thiết.

Tùy thuộc vào chế độ hoạt động được thiết lập, các chân từ số 24 đến số 31 của vi xử lý 8086 có chức năng xác định khác nhau Chẳng hạn, chân số 25 trong chế độ MAX được gọi là QS0, trong khi ở chế độ MIN, nó có tên là ALE Bài viết này sẽ xem xét chi tiết chức năng của các chân này trong vi xử lý 8086.

* Các chân mang thông tin địa chỉ:

Vi xử lý 8086 có 20 đường địa chỉ từ A0 đến A19, trong đó 16 đường địa chỉ thấp từ A0 đến A15 được ghép kênh với các đường dữ liệu từ D0 đến D15 trên các chân từ AD0 đến AD15 Bốn đường địa chỉ cao nhất từ A16 đến A19 cũng được ghép kênh, nhưng kết hợp với các tín hiệu trạng thái từ S3 đến S6 trên các chân từ A16/S3 đến A19/S6 Trong chu kỳ bus địa chỉ, các đường dây này mang thông tin địa chỉ đến bộ nhớ hoặc các cổng vào/ra Mặc dù bus địa chỉ của 8086 có độ rộng 20 bit, chỉ có 16 đường dây từ A0 đến A15 được sử dụng khi truy cập các cổng vào/ra, tạo ra không gian địa chỉ độc lập 64Kbyte cho 8086.

* Các chân mang thông tin về dữ liệu:

Vi xử lý 8086 có 16 đường dây dữ liệu từ D0 đến D15, kết hợp với 16 đường địa chỉ thấp từ A0 đến A15 Trong chu kỳ bus dữ liệu, các đường dây này truyền tải thông tin về dữ liệu, bao gồm dữ liệu đọc ra hoặc ghi vào bộ nhớ và thiết bị vào/ra, cũng như các mã liên quan đến các loại ngắt từ bộ điều khiển ngắt 8259.

* Các chân tín hiệu trạng thái:

Bốn đường dây địa chỉ cao nhất từ A16 đến A19 của 8086 được ghép kênh với các tín hiệu trạng thái từ S3 đến S6 Các bit trạng thái này được truyền đồng thời với dữ liệu trên các chân AD0 – AD15.

Bit S3 và S4 kết hợp với nhau tạo ra 2 bit mã nhị phân, giúp xác định thanh ghi đoạn nào được sử dụng để tạo ra địa chỉ vật lý đưa lên bus địa chỉ trong chu kỳ bus hiện tại, theo bảng 3.1.

Bảng 3.1 Mối quan hệ giữa mã của S4, S3 với thanh ghi được sử dụng

S4 S3 Tên thanh ghi đoạn được sử dụng

Đường dây trạng thái S5 phản ánh trạng thái của một tính chất khác bên trong vi xử lý, cụ thể là mức logic của bit cờ cho phép ngắt bên trong (IEF).

Tín hiệu READY được cung cấp bởi thiết bị phát xung bên ngoài hoặc bộ nhớ/hệ thống vào/ra, thông báo cho CPU khi dữ liệu có thể được truyền đi Tín hiệu này cho phép chèn thêm các trạng thái chờ vào chu kỳ bus, kéo dài chu kỳ đồng hồ, rất hữu ích khi cần trao đổi thông tin giữa 8086 và thiết bị ngoài có tốc độ chậm hơn.

* Các chân tín hiệu điều khiển:

Các tín hiệu điều khiển được cung cấp nhằm hỗ trợ cho vi xử lý 8086 giao tiếp với bộ nhớ và thiết bị vào/ra Vi xử lý 8086 sử dụng bus điều khiển bên ngoài để điều khiển hoạt động của các linh kiện khác.

Tín hiệu ALE (Address Latch Enable) là một xung nâng lên mức 1, cho phép thông báo cho mạch ngoài rằng có một địa chỉ hợp lệ trên bus Tín hiệu này được sử dụng để điều khiển một vi mạch chốt bên ngoài, nhằm tách các bit địa chỉ từ A0 đến A15 ra khỏi đường dây ghép kênh địa chỉ - dữ liệu từ AD0 đến AD15.

Tín hiệu Data Enable cho phép dữ liệu hợp lệ trên bus, với mức logic 0 thường được gửi đến điều khiển vi mạch để đệm dữ liệu trên bus dữ liệu.

Tín hiệu này thông báo cho các mạch bên ngoài về trạng thái kết nối của bộ nhớ hoặc thiết bị với bus Mức logic 0 tại đầu ra cho biết thiết bị vào/ra đang sử dụng bus, trong khi mức logic 1 cho thấy bộ nhớ đang hoạt động trên bus.

Tín hiệu được sử dụng để báo hiệu hướng truyền dữ liệu trên bus Khi tín hiệu bằng 1, bus dữ liệu hoạt động ở chế độ truyền, cho phép dữ liệu được ghi vào bộ nhớ hoặc xuất ra thiết bị Ngược lại, mức logic 0 tại chân báo hiệu rằng bus đang ở chế độ nhận, nghĩa là dữ liệu đang được đọc từ bộ nhớ hoặc được đưa vào từ một cổng vào.

Tín hiệu Bank High Enable (cho phép băng cao) được sử dụng để thông báo về việc truy cập vào băng cao hoặc băng thấp của bộ nhớ Khi tín hiệu này bằng 0, nó cho biết đang truy cập vào băng cao của bộ nhớ, trong khi mức logic 1 ở chân này cho thấy đang truy cập vào băng thấp.

Tổng quan về lập trình hợp ngữ

Cú pháp của hợp ngữ

Khi sử dụng bất kỳ ngôn ngữ lập trình nào, việc nắm vững cú pháp là rất quan trọng Các chương trình viết bằng hợp ngữ cần tuân thủ đúng cú pháp để được trình biên dịch hợp ngữ (MASM) chuyển đổi thành mã máy Do đó, mã nguồn phải được viết phù hợp với các khuôn mẫu của trình biên dịch Lưu ý rằng hợp ngữ không phân biệt chữ hoa và chữ thường.

Chương trình hợp ngữ bao gồm các dòng lệnh, trong đó mỗi lệnh được viết trên một dòng riêng biệt Mỗi dòng lệnh có thể là lệnh thực thi hoặc hướng dẫn cho trình biên dịch.

Lệnh thật sẽ được hợp ngữ dịch ra mã máy, trong khi hướng dẫn biên dịch không được chuyển đổi thành mã máy mà chỉ để hỗ trợ trình dịch thực hiện công việc Ví dụ, hướng dẫn có thể dành chỗ cho một biến nhớ hoặc khai báo một chương trình con.

Mỗi một lệnh bao gồm có bốn trường:

Tên: Mã_lệnh Toán_hạng; Chú_giải

Các trường trong lệnh phải được phân tách bằng ít nhất một ký tự trống hoặc TAB Không nhất thiết phải có đủ bốn trường trong mỗi lệnh; ví dụ, trường tên hoặc trường chú giải có thể được bỏ qua Tuy nhiên, các trường phải xuất hiện theo đúng thứ tự quy định.

Ví dụ một lệnh:

NHAP: MOV AX,0; Chuyển 0 vào thanh ghi AX

Trong ví dụ này, trường tên được gọi là NHAP, mã lệnh là MOV, có chức năng dịch chuyển dữ liệu Toán hạng được sử dụng là AX và 0, với chu giải thực hiện việc chuyển giá trị 0 vào thanh ghi AX.

Tên trường được sử dụng để làm nhãn lệnh, tên các thủ tục và tên biến Chương trình dịch sẽ gán tên bằng các địa chỉ cụ thể của ô nhớ Các quy định khi đặt tên cần được tuân thủ để đảm bảo tính nhất quán và dễ hiểu trong mã nguồn.

− Không được dài quá 31 ký tự

− Bao gồm các chữ cái, chữ số và một số ký tự đặc biệt (! @ % _ $)

− Không được đứng đầu bằng một chữ số

− Không chứa khoảng trống hoặc dấu gạch ngang

− Nếu có dấu (.) thì phải đặt ở vị trí đầu tiên của tên

− Không phân biệt chữ thường, chữ hoa

Trường tên cách với trường mã lệnh bởi dấu (:)

Ví dụ một số tên hợp lệ:

Ví dụ một số tên không hợp lệ:

BAI TAP ; Chứa khoảng trống

BAITAP−1 ; Chứa dấu gạch ngang

1BAI ; Bắt đầu bằng một chữ số

BAI.1 ; Dấu chấm không đứng đầu

BAI&1 ; Chứa một ký tự không hợp lệ b Trường mã lệnh

Trường mã lệnh bao gồm các ký hiệu như MOV, ADD, SHL, biểu thị chức năng thao tác và được chuyển đổi thành mã máy.

Trong mỗi lệnh, toán hạng xác định dữ liệu sẽ được các lệnh tác động lên Một lệnh có thể không có, có một hoặc có hai toán hạng.

NOP ; Không có toán hạng nào

DEC CX ; Có một toán hạng là CX

MOV AX,1 ; Có hai toán hạng là AX và 1

Khi sử dụng lệnh có hai toán hạng, cần phải phân cách chúng bằng dấu phẩy (,) Toán hạng đầu tiên là toán hạng đích, nơi chứa kết quả, trong khi toán hạng thứ hai là toán hạng nguồn, thường không bị thay đổi bởi các lệnh Để lệnh hợp lệ, các toán hạng phải có cùng độ lớn hoặc cùng kiểu.

MOV AX,BX ; Hai toán hạng có cùng kiểu

MOV AX,BL ; Hai toán hạng không cùng kiểu d Trường chu giải

Trường chu giải thích mục đích sử dụng lệnh của chương trình, giúp người đọc dễ hiểu hơn Lời giải thích được phân tách bằng dấu chấm phẩy (;), và chương trình dịch sẽ bỏ qua khi gặp dấu này Do đó, người dùng thường sử dụng dấu chấm phẩy để loại bỏ một dòng lệnh nào đó.

Khi viết chương trình ta không nên đưa ra một lời chu giải như:

MOV CX,5 ; Chuyển 5 vào thanh ghi CX

Giả sử muốn khởi tạo cho một vòng lặp thực hiện năm lần, ta chu giải như sau:

MOV CX,5 ; Khởi tạo đếm bằng 5

Dữ liệu chương trình

Trong một chương trình hợp ngữ, dữ liệu có thể được biểu diễn dưới dạng nhị phân, thập phân, hexa hoặc ký tự Chương trình dịch sẽ chuyển đổi tất cả các dạng dữ liệu khác nhau thành số nhị phân Dữ liệu cần phải được ghi kèm theo đuôi tương ứng với hệ thống mà nó thuộc về.

Một số thuộc hệ nhị phân là một chuỗi các bit kết thuc bằng chữ ‘B’ hay ‘b.

Một số thuộc hệ hexa là chuỗi số bắt đầu bằng số thập phân và kết thúc bằng chữ 'H' hoặc 'h', ví dụ như 0AH hoặc 12C5H Nếu số bắt đầu bằng một chữ cái từ A đến F hoặc từ a đến f, cần thêm số 0 vào trước số đó để chương trình dịch không nhầm lẫn với tên hoặc nhãn khác.

Riêng đối với một số thuộc hệ thập phân có thể kết thuc số đó bằng chữ

‘D’ hay ‘d’ (hoặc không có) Ví dụ: 12 hay 12D là như nhau.

Biến và hằng

Trong hợp ngữ, mỗi biến được gán một kiểu dữ liệu và địa chỉ cụ thể trong bộ nhớ, tương tự như các ngôn ngữ lập trình bậc cao Để định nghĩa các kiểu dữ liệu, chúng ta thường sử dụng các lệnh giả được liệt kê dưới đây Mỗi toán tử giả có khả năng thiết lập một hoặc nhiều dữ liệu thuộc kiểu đã được chỉ định.

DB Định nghĩa 1 byte

DW Định nghĩa 1 từ

DD Định nghĩa từ kép

DQ Định nghĩa 4 từ

DT Định nghĩa 10 byte a Biến kiểu byte

Một biến kiểu byte được định nghĩa như sau:

Tên DB giá_trị_khởi_tạo

Biến byte X1 được định nghĩa với kích thước 1 byte trong bộ nhớ, có giá trị khởi đầu là 0AH.

Khi đặt dấu chấm hỏi (?) tại vị trí giá trị khởi tạo của biến X2, biến này sẽ chiếm một byte trong bộ nhớ nhưng không được gán giá trị khởi đầu.

Giá trị khởi tạo cho biến kiểu byte từ −128 đến 127 với kiểu có dấu và từ

0 đến 255 với kiểu không dấu b Biến kiểu từ

Khi khai báo, một biến kiểu từ sẽ được dành hai byte nhớ để chứa giá trị của biến

Tên DB giá_trị_khởi_tạo

Ví dụ trên định nghĩa một biến kiểu từ có tên là W1 và giá trị khởi đầu là 0FFFH

Nếu đặt dấu chấm hỏi (?) ở vị trí giá trị khởi tạo của biến W2, biến đó sẽ không được gán giá trị khởi đầu Giá trị khởi tạo cho biến kiểu từ trong khoảng.

− 32768 đến 32767 với kiểu có dấu và trong khoảng 0 đến 65535 đối với kiểu không dấu c Biến kiểu mảng

Biến mảng là một tập hợp các phần tử có cùng kiểu giá trị, thường được sử dụng trong lập trình hợp ngữ Trong ngữ cảnh này, mảng được hiểu là chuỗi các byte nhớ hoặc các từ nhớ, cho phép lưu trữ và quản lý dữ liệu hiệu quả.

Ví dụ để định nghĩa một mảng bốn byte có tên là MANG và có giá trị lần lượt là 0, 1, 2, 3 ta khai báo như sau:

Trong ví dụ này, tên MANG đại diện cho byte đầu tiên có giá trị 0, MANG+1 cho byte thứ hai với giá trị 1, MANG+2 cho byte thứ ba có giá trị 2 và MANG+3 cho byte thứ tư với giá trị 3 Một mảng kiểu từ cũng có thể được định nghĩa tương tự.

Nếu phần tử đầu tiên của mảng bắt đầu tại địa chỉ 0200H trong bộ nhớ, thì các phần tử còn lại của mảng sẽ nằm trong các ô nhớ có địa chỉ tiếp theo.

Phần tử Địa chỉ Giá trị (nội dung)

Khi chung ta muốn khởi đầu cho các phần tử của mảng cùng một giá trị ta dùng toán tử DUP Ví dụ: M1 DW 100 DUP(0)

Biến mảng M1 được định nghĩa với kích thước 200 byte, cho phép lưu trữ 100 phần tử, trong đó mỗi phần tử được khởi tạo với giá trị ban đầu là 0.

Biến kiểu chuỗi ký tự là một trường hợp đặc biệt của biến mảng, trong đó một chuỗi ký tự có thể được khởi tạo từ một biến mảng.

Ví dụ: M2 DB ‘Hello’ tương đương với: M2 DB 48H,65H,6CH,6CH,6FH d Hằng có tên

Các hằng trong hợp ngữ có thể là kiểu số hoặc kiểu ký tự và thường được gán tên Để gán tên cho hằng, người ta sử dụng toán tử giả EQU với cú pháp cụ thể.

Ví dụ: LF EQU 0AH

Trong ví dụ này, mã ASCII của ký tự xuống dòng (0AH) được gọi là LF, trong khi ký tự trở về đầu dòng (0DH) được gọi là CR Ngoài ra, hằng số cũng có thể được biểu diễn dưới dạng một chuỗi ký tự.

Ví dụ hai lệnh sau: TRUYEN EQU “ME VANG NHA”

TR DB TRUYEN tương đương với lệnh: TR DB “ME VANG NHA”

Khung của một chương trình hợp ngữ

Một chương trình hợp ngữ dịch ra đuôi *.exe có dạng như sau:

stack dung_lượng_ngăn_xếp

; khai báo các hằng, biến số

; các lệnh chương trình chính main endp

; các hàm và thủ tục end main a Khai báo kiểu bộ nhớ (.model)

Các chương trình khác nhau yêu cầu kích thước bộ nhớ khác nhau, với chương trình dài chiếm dung lượng bộ nhớ lớn hơn và chương trình ngắn chiếm dung lượng nhỏ hơn Bộ nhớ thường được tổ chức thành các vùng khác nhau để chứa dữ liệu, mã lệnh và vùng nhớ dùng làm ngăn xếp Bảng 4.1 mô tả đầy đủ các kiểu bộ nhớ.

Bảng 4.1 - Mô tả khai báo các kiểu bộ nhớ

Kiểu kích thước Mô tả

Tiny Mã lệnh và dữ liệu được chứa trong một đoạn Small Mã lệnh cũng nằm trong một đoạn, trong khi dữ liệu nằm trong một đoạn Medium Mã lệnh không nằm trong một đoạn, nhưng dữ liệu lại nằm trong một đoạn Compact Mã lệnh nằm trong một đoạn, còn dữ liệu không nằm trong một đoạn Cuối cùng, Large Mã lệnh không nằm trong một đoạn, dữ liệu cũng không nằm trong một đoạn, và không có mảng nào lớn hơn 64KB.

Mã lệnh lớn không thể nằm trong một đoạn, và dữ liệu cũng không thể nằm trong một đoạn, trong khi các mảng có thể lớn hơn 64KB Do đó, cần khai báo kích thước ngăn xếp (.stack) một cách hợp lý.

Kích thước khi khai báo ngăn xếp sẽ quyết định số byte dành cho ngăn xếp

Khi khai báo ngăn xếp với stack 100H, chương trình sẽ cấp phát 256 byte cho ngăn xếp Nếu không khai báo, dung lượng ngăn xếp mặc định sẽ là 1Kbyte Đoạn dữ liệu (.data) chứa toàn bộ định nghĩa cho các biến số và hằng số trong chương trình Ví dụ, chúng ta có thể khai báo các biến trong đoạn dữ liệu như sau:

Đoạn mã (.code) trong chương trình CR EQU 0DH chứa toàn bộ các câu lệnh của chương trình chính và các chương trình con Các lệnh này cần được tổ chức một cách hợp lý, đúng cú pháp và được chương trình dịch chuyển sang ngôn ngữ máy.

Dưới đây là ví dụ về một chương trình hiển thị dòng chữ "Hello world, I’m learning Assembly !!!" lên màn hình:

The provided Assembly code initializes a message variable containing "Hello world, I’m learning Assembly !!!" and sets up the data segment It then uses an interrupt to display the message on the screen before terminating the program.

Cách tạo và chạy một chương trình hợp ngữ

Để tạo và chạy một chương trình hợp ngữ trên máy IBM PC ta thực hiện các bước như sau:

Bước 1: Soạn thảo chương trình bằng các phần mềm như NCedit, SK, hoặc chức năng soạn thảo của Turbo Pascal, để tạo ra một chương trình gốc File chương trình này cần được gán đuôi ASM.

Bước 2: Sử dụng trình dịch MASM để chuyển đổi file ASM thành mã máy dưới định dạng file OBJ Nếu trong quá trình dịch gặp lỗi cú pháp, bạn cần quay lại bước 1 để chỉnh sửa chương trình gốc.

Bước 3: Dùng chương trình LINK để nối một hay nhiều tệp OBJ lại với nhau thành một tệp chương trình với đuôi exe

Bước 4: Cho chạy chương trình vừa dịch.

Các chế độ địa chỉ của họ vi xử lý 80x86

Chế độ địa chỉ thanh ghi (Register Addressing Mode)

Chế độ địa chỉ thanh ghi cho phép các toán hạng của lệnh sử dụng các thanh ghi để chứa dữ liệu cần thao tác, giúp tăng tốc độ truy cập so với các lệnh truy cập bộ nhớ.

Trong lập trình assembly, các lệnh như "mov AX, BX" dùng để chuyển nội dung của thanh ghi BX vào AX Tương tự, "mov DL, AL" chuyển dữ liệu từ AL sang DL Lệnh "mov SI, DX" chuyển nội dung từ DX sang SI, trong khi "mov SP, BP" chuyển dữ liệu từ BP vào SP Cuối cùng, lệnh "add AL, BH" thực hiện phép cộng giữa BH và AL, với kết quả được lưu trong AL.

Trong các chế độ địa chỉ, toán hạng đích và nguồn cần phải có cùng độ lớn Ví dụ, nếu toán hạng nguồn là một thanh ghi 16 bit, thì toán hạng đích phải là một thanh ghi 16 bit, không thể là một thanh ghi 8 bit.

MOV CL,BX ;Lệnh này sẽ báo lỗi vì đích và nguồn không cùng kiểu

Chế độ địa chỉ tức thời (Immediate Addressing Mode)

Trong chế độ địa chỉ này, toán hạng đích là một thanh ghi hoặc ô nhớ, trong khi toán hạng nguồn là hằng số Chế độ địa chỉ cho phép nạp dữ liệu cần thao tác vào bất kỳ thanh ghi nào (trừ thanh ghi đoạn) hoặc ô nhớ nào nằm trong đoạn dữ liệu.

Trong lập trình Assembly, các lệnh như "mov AH, 12" dùng để chuyển giá trị 12 vào thanh ghi AH Tương tự, "mov DL, 0AH" chuyển giá trị 10 (0AH) vào thanh ghi DL Lệnh "mov AH, 01000010B" chuyển giá trị nhị phân 01000010B (tương đương 66) vào thanh ghi AH, trong khi "mov CL, 'A'" chuyển ký tự 'A' (65) vào thanh ghi CL Cuối cùng, lệnh "mov [BX], 100" chuyển giá trị 100 vào ô nhớ tại địa chỉ DS:BX.

Hằng số có thể được biểu diễn dưới dạng thập phân, nhị phân, hexa hoặc dưới dạng ký tự.

Chế độ địa chỉ trực tiếp (Direct Addressing Mode)

Chế độ địa chỉ trực tiếp là một phương thức trong đó toán hạng của lệnh là thanh ghi, trong khi toán hạng còn lại chứa địa chỉ lệch của ô nhớ chứa dữ liệu.

MOV AL, [012H] ;chuyển nội dung ô nhớ DS:[012H]vào AL MOV AL, ES:[22];chuyển nội dung ô nhớ ES:[012H]vào AL MOV [16H], AX ;chuyển nội dung của AX vào hai ô nhớ

;liên tiếp có địa chỉ DS:[16H]và DS:[17H] MOV BX,[5678H] ;chuyển nội dung của hai ô nhớ có địa ;chỉ DS:[5678H]và DS:[5679h]vào BX

Hình 4.1 - Mô tả lệnh MOV AL,[012H]

Hình 4.2 - Mô tả lệnh MOV AL,ES:[22]

Hình 4.3 - Mô tả lệnh MOV BX,[5678H]

Chế độ địa chỉ gián tiếp qua thanh ghi (Register Direct Addressing Mode) 29

Trong chế độ địa chỉ, một toán hạng đóng vai trò là thanh ghi chứa dữ liệu, trong khi toán hạng còn lại là thanh ghi chứa địa chỉ lệch của ô nhớ chứa dữ liệu.

Ví dụ: MOV AX,[BX] ; Chuyển nội dung của hai ô nhớ có địa

; chỉ DS:[BX]và DS:[BX+1]vào AX MOV AH,[BX] ; Chuyển nội dung của ô nhớ có địa chỉ

; DS:[BX] vào AL MOV [BP],AL ; Chuyển nội dung của AL vào ô nhớ có địa

Hình 4.4 - Mô tả lệnh MOV AX,[BX]

Chế độ địa chỉ tương đối cơ sở (Based Relative Addressing Mode) 30

Trong chế độ địa chỉ này, một toán hạng là thanh ghi, trong khi các toán hạng còn lại là địa chỉ lệch của ô nhớ chứa dữ liệu Địa chỉ lệch này được lưu bởi một thanh ghi cơ sở BX hoặc BP cùng với các hằng số biểu diễn giá trị dịch chuyển.

Hình 4.5 - Mô tả lệnh MOV [BP+2],AL

MOV [BP+2],AL ; Chuyển nội dung của AL vào ô nhớ có địa

MOV AX,[BX+4] ; Chuyển nội dung của hai ô nhớ có địa chỉ

; DS:[BX+4]và DS:[BX+5]vào AX Lệnh này có thể viết như sau: MOV AX,4[BX]

Chế độ địa chỉ tương đối chỉ số (Indexed Relative Addressing Mode) 31

Trong chế độ địa chỉ này, một toán hạng được sử dụng làm thanh ghi, trong khi toán hạng còn lại là địa chỉ lệch của ô nhớ chứa dữ liệu Địa chỉ lệch này được lưu bởi một thanh ghi chỉ số (SI) hoặc thanh ghi chỉ số đích (DI), cùng với các hằng số biểu diễn giá trị dịch chuyển.

Ví dụ: MOV [SI+2],AL ; chuyển nội dung của AL vào ô nhớ

MOV AX,[DI+4];chuyển nội dung của hai ô nhớ có địa chỉ

; DS:[BX+4]và DS:[BX+5]vào AX

Chế độ địa chỉ tương đối chỉ số cơ sở (Based Indexed Relative

Trong chế độ địa chỉ này, toán hạng đầu tiên là thanh ghi, trong khi các toán hạng còn lại đại diện cho địa chỉ lệch của ô nhớ chứa dữ liệu Địa chỉ lệch này được lưu trữ bởi một thanh ghi chỉ số và một thanh ghi cơ sở, với việc cộng thêm các hằng số để biểu diễn giá trị dịch chuyển.

Ví dụ: MOV AX,[BX+SI+disp]; disp là hằng số

Hình 4.6 - Mô tả lệnh MOV AH,[BX+SI+2]

Một số hàm của ngắt 21H

Lệnh INT

Lệnh ngắt được dùng để gọi các hàm của DOS và BIOS Cu pháp lệnh ngắt như sau: int N

Số hiệu ngắt N, chẳng hạn như int 21H, được sử dụng để gọi nhiều hàm của DOS Mỗi hàm được thực hiện bằng cách đưa số hiệu của hàm vào thanh ghi AH, sau đó gọi int 21H.

Hàm 1

Hàm 1 thực hiện việc đọc một ký tự từ thiết bị đầu vào (bàn phím), sau đó lưu mã ASCII của ký tự đã nhập vào trong AL.

Ra: AL = Mã ASCII của ký tự nhập vào

AL = 0 nếu một phím điều khiển hay một phím chức năng được nhấn Ví dụ về một chương trình nhập vào một ký tự từ bàn phím:

; nhập vào một ký tự mov ah,1 int 21h mov BL,AL ; cất mã ASCII của ký tự được nhập vào BL

; trở về dos mov ah,4ch int 21h main endp end main

Hàm 4CH

Hàm 4CH kết thuc chương trình hiện tại và trả điều khiển cho chương trình gọi nó

Hàm 2

Hàm hiển thị ký tự lên màn hình hoặc thi hành các chức năng điều khiển Vào: AH = 2

DL = Mã ASCII của ký tự muốn hiển thị hoặc điềukhiển. Ra: AL = Mã ASCII của ký tự vừa hiển thị hoặc điềukhiển.

Để hiển thị một ký tự trên màn hình, cần sử dụng mã ASCII của ký tự đó trong thanh DL Ví dụ, để hiển thị chữ A, ta sử dụng đoạn lệnh sau: `mov AH, 2` và `mov DL, 'A'` sau đó gọi ngắt `int 21H`.

Sau khi ký tự hiển thị, con trỏ sẽ di chuyển đến vị trí tiếp theo cạnh ký tự đó Nếu thanh ghi DL chứa mã ASCII của ký tự điều khiển, hàm 2 sẽ thực hiện các chức năng điều khiển Dưới đây là mã ASCII của một số ký tự điều khiển quan trọng, và chúng ta có thể tra cứu thêm trong bảng mã ASCII.

Mã ASCII Ký hiệu Chức năng

7 Bel Phát tiếng bíp

0AH LF Xuống dòng

0DH CR Về đầu dòng

Muốn phát ra tiếng bíp của máy tính ta sử dụng các lệnh sau: mov AH,2 mov DL,7 int 21H

Ví dụ: Viết chương trình nhập vào một ký tự và hiển thị ký tự đó ở đầu dòng tiếp theo

The provided assembly code snippet demonstrates how to read a character input from the user, store it, and then output it along with a newline It utilizes DOS interrupt calls to handle input and output operations The process begins by setting up the necessary registers to read a character, followed by displaying a line break and then the character itself Finally, the program concludes with a termination call.

Sau khi nhập một ký tự từ bàn phím, ký tự đó cần được lưu trữ vào một thanh ghi khác, vì AL sẽ chứa mã ASCII của ký tự điều khiển hoặc ký tự hiển thị sau khi sử dụng hàm 2.

Hàm 9

Hàm 9 hiển thị chuỗi ký tự lên màn hình

DS:DX = địa chỉ của chuỗi ký tự

Hàm 9 yêu cầu DS:DX chứa địa chỉ của chuỗi ký tự Để thực hiện điều này chung ta sẽ dùng lệnh sau:

Trong lập trình, thanh ghi công dụng chung được gọi là đích, trong khi ô nhớ được xem là nguồn Lệnh LEA có chức năng lấy địa chỉ và sao chép dữ liệu từ nguồn sang đích Ví dụ, để hiển thị chuỗi có tên MANG lên màn hình, chúng ta sử dụng lệnh: mov AH, 9.

Lệnh LEA DX,MANG sẽ nhập địa chỉ tương đối của biến MANG vào

Ký tự ‘$’ trong ngôn ngữ lập trình DX đánh dấu sự kết thúc của chuỗi ký tự và không được hiển thị Nếu chuỗi ký tự chứa mã ASCII của ký tự điều khiển, chức năng điều khiển sẽ được thực hiện Để chương trình hoạt động đúng, nó cần bắt đầu với hai lệnh sau: `mov AX,@data` và `mov DS,AX`.

@data là tên đoạn dữ liệu được định nghĩa bởi đoạn data chương trình dịch sẽ dịch @data thành địa chỉ

Ví dụ dưới đây cho phép nhập vào một ký tự thường, sau đó chuyển đổi thành chữ hoa và hiển thị ở dòng dưới cùng với hai thông báo.

“moi ban nhap vao mot ky tu thuong: a”

“doi thanh chu hoa va hien thi: A”

Khi khai báo chuỗi thứ hai, chúng ta sử dụng mã ASCII của ký tự xuống dòng và về đầu dòng Điều này giúp chuỗi thứ hai được hiển thị chính xác bằng hàm 9, từ đó chức năng điều khiển sẽ được thực thi hiệu quả.

data bien1 DB “moi ban nhap vao mot ky tu thuong:$” bien1 DB 10,13,“doi thanh chu hoa va hien thi:$” code main proc

;khởi tạo thanh ghi DS mov AX,@data mov DS,AX

;hiển thị chuỗi thứ nhất mov AH,9

;nhập vào 1 ký tự và đổi thành chữ hoa mov AH,1 int 21H mov BL,AL sub BL,AL

;hiển thị chuỗi thứ hai ở dòng dưới mov AH,9

;hiển thị dạng chữ hoa của ký tự ban đầu mov AH,2 mov DL,BL int 21H

;trở về DOS mov AH,4CH int 21H main endp end main

Các nhóm lệnh của 8086

Nhóm lệnh dịch chuyển dữ liệu

Phần này sẽ giới thiệu một số lệnh cơ bản thường được sử dụng để di chuyển dữ liệu giữa các thanh ghi trong bộ vi xử lý, cũng như giữa bộ nhớ hoặc thiết bị ngoài với bộ vi xử lý Một trong những lệnh quan trọng là lệnh MOV (MOVE), cho phép chuyển đổi dữ liệu một cách hiệu quả giữa các thành phần của hệ thống.

Dạng lệnh: MOV đích, nguồn

Lệnh MOV được sử dụng để chuyển dữ liệu từ toán hạng nguồn vào toán hạng đích Ví dụ: MOV AL,BL

Giả sử trước khi thực hiện lệnh MOV, thanh ghi AL và BL có nội dung:

Sau khi thực hiện lệnh MOV, nội dung thanh ghi AL và BL:

Một bản sao của thanh ghi BL sẽ được chuyển vào thanh ghi AL, trong khi nội dung của BL vẫn được giữ nguyên Giá trị trước đó của AL sẽ bị ghi đè.

Khả năng kết hợp giữa toán hạng nguồn với toán hạng đích được chỉ ra ở bảng 4.2

Bảng 4.2 Khả năng kết hợp giữa các toán hạng của lệnh MOV

Toán hạng đích Toán hạng nguồn

Thanh ghi công cụ chung

Thanh ghi đoạn Ô nhớ Hằng số

Thanh ghi công cụ chung có thể và không thể thực hiện nhiều chức năng khác nhau Thanh ghi đoạn có thể sử dụng trong một số trường hợp nhất định, nhưng cũng có những hạn chế Ô nhớ có thể lưu trữ thông tin, tuy nhiên cũng có những tình huống mà nó không thể hoạt động hiệu quả.

Hằng số Có thể Không thể Có thể Không thể

Một vài ví dụ về các lệnh không hợp lệ:

MOV DS,ES ;chuyển nội dung từ thanh ghi đoạn đến

;thanh ghi đoạn MOV DS,0AH ;chuyển hằng số vào thanh ghi đoạn

MOV [BX],0AH ;chuyển hằng số vào ô nhớ b Lệnh OUT

Dạng lệnh: OUT cổng,thanh_chứa

Lệnh OUT cho phép xuất dữ liệu từ thanh ghi AL ra cổng, có thể là một hằng số cố định hoặc cổng dữ liệu thay đổi DX.

Cờ: Không bị ảnh hưởng c Lệnh IN

Dạng lệnh: IN thanh_chứa, cổng

Lệnh IN cho phép đọc dữ liệu từ cổng vào thanh ghi AL, trong đó cổng có thể là một hằng số cố định hoặc một giá trị thay đổi từ thanh ghi DX.

Cờ: Không bị ảnh hưởng d Lệnh XCHG (exchange)

Dạng lệnh: XCHG đích, nguồn

Thao tác: Toán hạng đích và toán hạng nguồn được đổi lẫn cho nhau Cờ: Không bị ảnh hưởng e Lệnh XTAT (translate byte to all)

Dạng lệnh: XLAT nhãn_nguồn

BX phải chứa địa chỉ offset của bảng nguồn với chiều dài tối đa 256 byte AL cần lưu trữ chỉ số của các phần tử trong bảng Lệnh sẽ thay thế nội dung của AL bằng nội dung của các phần tử trong bảng được định địa chỉ thông qua (BX + AL).

Cờ: Không bị ảnh hưởng f Lệnh LAHF (Load AH from Flags)

Dạng lệnh: LAHF

Thao tác: 8 bit thấp của thanh ghi cờ được chuyển vào AH

Cờ: Không bị ảnh hưởng g Lệnh LDS (Load Data Segment register)

Nạp vào thanh ghi DS địa chỉ đoạn và thanh ghi công dụng chung địa chỉ lệch để truy cập dữ liệu

Dạng lệnh: LDS đích, nguồn

Toán hạng nguồn là một ô nhớ có độ dài 2 từ, trong đó từ thấp được lưu trữ trong thanh ghi đích và từ cao được lưu trữ trong thanh ghi DS.

Cờ: Không bị ảnh hưởng h Lệnh LES (Load Etra Segment register)

Nạp vào thanh ghi ES địa chỉ đoạn và một thanh ghi công dụng chung địa chỉ lệch để có thể truy cập dữ liệu

Dạng lệnh: LES đích, nguồn

Thao tác: Toán hạng nguồn là ô nhớ có độ dài 2 từ Từ thấp được đặt vào thanh ghi đích, từ cao đặt vào thanh ghi ES

Cờ: Không bị ảnh hưởng i Lệnh SAHF (Store AH in Flag register)

Dạng lệnh: SAHF

Thao tác lưu 5 bit thấp của thanh ghi AH vào byte thấp của thanh ghi cờ chỉ thực hiện với các bit tương ứng với cờ Các cờ được xác định trong byte thấp của thanh ghi cờ bao gồm: SF tại bit 7, ZF tại bit 6, AF tại bit 4, PF tại bit 2 và CF tại bit 0.

Cờ: Bị ảnh hưởng AF, PF, ZF, SF, CF.

Nhóm lệnh số học

Các lệnh ADD, SUB được sử dụng để cộng hoặc trừ nội dung của hai toán hạng

Dạng lệnh: ADD đích, nguồn

Lệnh ADD và SUB được sử dụng để thực hiện phép cộng hoặc trừ giữa toán hạng đích và toán hạng nguồn, với kết quả được lưu vào toán hạng đích mà không làm thay đổi giá trị của toán hạng nguồn.

Khả năng kết hợp giữa toán hạng nguồn với toán hạng đích trong các phép cộng và phép trừ được chỉ ra ở bảng 4.3

Bảng 4.3 Khả năng kết hợp giữa các toán hạng của lệnh ADD, SUB

Toán hạng đích Toán hạng nguồn

Thanh ghi công cụ chung Ô nhớ Hằng số

Thanh ghi công cụ chung Có thể Có thể Không thể Ô nhớ Có thể Không thể

Hằng số Có thể Có thể Không thể b Lệnh ADC

Cờ nhớ được cộng vào tổng của toán hạng nguồn và toán hạng đích Dạng lệnh: ADC đích,nguồn

Thao tác: Nếu CF = 1 thì đích = nguồn + đích + 1

Nếu CF = 0 thì đích = nguồn + đích

Cờ: Bị ảnh hưởng: AF, CF, OF, SF, ZF, PF c Lệnh CBW Đổi số có dấu 8 bit trong AL thành số có dấu 16 bit trong AX

Dạng lệnh: CBW

Thao tác: Nếu bit 7 của AL bằng 1 thì AH = FFH

Nếu bit 7 của AL bằng 0 thì AH = 00H

Cờ: Không ảnh hưởng d Lệnh DEC

Thực hiện phép cộng có nhớ

Dạng lệnh: Dec đích

Thao tác: Giảm toán hạng đích đi 1

Cờ: Bị ảnh hưởng AF, OF, PF, SF, ZF

Lệnh này tương đương với lệnh ADD đích,1 e Lệnh DIV

Thực hiện phép chia không dấu

Dạng lệnh: Div nguồn

Trong phép chia, số chia là toán hạng nguồn có thể được lưu trữ trong ô nhớ hoặc thanh ghi Đối với phép chia cho byte (toán hạng nguồn 8 bit), số bị chia được lưu trong AX, kết quả thương số nằm trong AL, và số dư được trả về trong AH Khi thực hiện phép chia cho word (toán hạng nguồn 16 bit), số bị chia 32 bit được lưu trong DX:AX, với 16 bit cao trong DX và 16 bit thấp trong AX Kết quả thương số sẽ được lưu trong AX, trong khi số dư sẽ được trả về trong DX.

Cờ: Không xác định AF, OF, CF, ZF, SF, PF

Hiện tượng tràn số xảy ra khi số bị chia quá lớn so với số chia Nếu thương số vượt quá 8 bit trong phép chia cho byte (16 bit trong phép chia cho word) hoặc số chia bằng 0, sẽ tạo ra ngắt INT O Lệnh IDIV được sử dụng trong trường hợp này.

Thực hiện phép chia có dấu

Dạng lệnh: IDIV nguồn

Trong thao tác chia, số chia là toán hạng nguồn có thể là một ô nhớ hoặc một thanh ghi Đối với phép chia byte (toán hạng nguồn 8 bit), số bị chia được lưu trong thanh ghi AX, trong khi đó, với phép chia word (toán hạng nguồn 16 bit), số chia được lưu trong DX:AX Thương số sẽ được lưu trong AL (hoặc AX trong trường hợp chia cho word), và số dư, luôn cùng dấu với số bị chia, sẽ được trả về trong AH (DX cho phép chia cho word) Nếu thương số lớn hơn 127 hoặc nhỏ hơn -127 trong phép chia byte (hoặc lớn hơn 32767 hoặc nhỏ hơn -32767 trong phép chia word), hoặc số chia bằng

0 thì ngắt INT O được tạo ra

Cờ: Không xác định AF, OF, CF, ZF, PF g Lệnh IMUL

Thực hiện phép nhân có dấu giữa hai toán hạng

Dạng lệnh: IMUL nguồn

Lệnh Imul thực hiện nhân nội dung của thanh ghi AL với toán hạng nguồn nếu toán hạng nguồn là một byte, kết quả sẽ được lưu trong thanh ghi AX Nếu toán hạng nguồn là một từ, lệnh này sẽ nhân nội dung của AX với toán hạng nguồn và lưu kết quả trong DX:AX Các cờ CF và OF sẽ bằng 0 nếu nửa cao của tích là phần mở rộng dấu của nửa thấp Lưu ý rằng toán hạng nguồn không được là hằng số.

Cờ: Bị ảnh hưởng CF, OF h Lệnh MUL

Thực hiện phép nhân không dấu

Dạng lệnh: MUL nguồn

Lệnh MUL thực hiện phép nhân nội dung của thanh ghi AX với toán hạng nguồn Nếu toán hạng nguồn là một byte, kết quả sẽ được lưu trong AX; nếu là một từ, kết quả sẽ được lưu trong DX:AX Các cờ CF và OF sẽ bằng 0 nếu nửa cao của tích là phần mở rộng dấu của nửa thấp Lưu ý rằng toán hạng nguồn không được là hằng số.

Cờ: Bị ảnh hưởng CF, OF i Lệnh NEG

Dạng lệnh: NEG đích

Trong thao tác toán học, giá trị của toán hạng đích sẽ bị trừ đi từ số toàn chữ số 1 (0FFH đối với byte và 0FFFFH đối với word) Sau đó, kết quả thu được trong toán hạng đích sẽ được cộng thêm 1.

Cờ: Bị ảnh hưởng AF, OF, CF, SF, ZF j Lệnh SBB

Dạng lệnh: SBB đích,nguồn

Để thực hiện thao tác trừ toán hạng đích cho toán hạng nguồn, nếu CF = 1, cần trừ kết quả nhận được đi 1 Kết quả sẽ được lưu trữ trong toán hạng đích.

Cờ: Bị ảnh hưởng AF, CF, OF, PF, SF, ZF.

Nhóm lệnh điều khiển rẽ nhánh

Trong lập trình hợp ngữ, việc thực hiện cấu trúc chọn lựa và cấu trúc lặp yêu cầu sử dụng các lệnh nhảy và lệnh lặp.

Cu pháp chung của các lệnh nhảy như sau: Mã_lệnh Nhãn_lệnh a Nhóm lệnh nhảy có điều kiện

Khi sử dụng lệnh nhảy có điều kiện, nếu điều kiện được thỏa mãn, nhãn lệnh sẽ được thực hiện Ngược lại, nếu điều kiện không được thỏa mãn, lệnh sẽ được thực hiện ngay sau lệnh nhảy Nhãn lệnh có thể được đặt trước hoặc sau lệnh nhảy.

Phạm vi của lệnh nhảy có điều kiện là 128 byte trước và 127 byte sau lệnh nhảy Một ví dụ về lệnh nhảy có điều kiện sẽ giúp minh họa rõ hơn về cách hoạt động của nó.

1) Lệnh JNZ (Jump if Not Zero) Điều kiện của JNZ (nhảy nếu khác 0) là kết quả của lệnh trước đó khác 0 Dạng lệnh: JNZ nhãn_đích

Nếu kết quả của lệnh trước đó khác 0, lệnh có tên là nhãn_đích sẽ được thực hiện Ngược lại, nếu kết quả bằng 0, lệnh ngay sau lệnh nhảy sẽ được thực hiện.

Có nhiều lệnh nhảy có điều kiện được liệt kê trong bảng 3.4 Một số lệnh nhảy, chẳng hạn như JL (nhảy nếu nhỏ hơn) và JNGE (nhảy nếu không lớn hơn hoặc bằng), có mã lệnh giống nhau khi mã hóa kết quả.

Bảng 4.4 Các lệnh nhảy có điều kiện

Thông thường các lệnh nhảy được cung cấp bởi lệnh so sánh (compare)

Lệnh CMP so sánh hai toán hạng bằng cách thực hiện phép trừ nhưng không lưu lại kết quả

Dạng lệnh: CMP đích, nguồn

Lệnh Nhảy nếu Điều kiện Mã lệnh

JA Above CF = 0 AND ZF = 0 77 Disp

JAE Above or Equal CF = 0 73 Disp

JBE Below or Equal CF = 1 OR ZF = 1 76 Disp

JCXZ CX=0 (CF OR ZF) = 0 E3 Disp

JG Greater ZF = 0 AND SF = OF 7F Disp

JGE Greater Equal ZF = OF 7D Disp

JL Less (SF XOR OF) = 1 7C Disp

JLE Less or Equal (SF XOR OF) OR ZF = 1 7E Disp

JNA Not Above CF = 1 OR ZF = 1 76 Disp

JNB Not Below CF = 0 73 Disp

JNC Not Carry CF = 0 73 Disp

JNE Not Equal ZF = 0 75 Disp

JNG Not Greater (SF XOR OF) OR ZF = 1 7E Disp

JNL Not Less SF = OF 7D Disp

ZF = 0 Và SF = OF 7F Disp

JNO Not Over flow OF = 0 71 Disp

JNP Not Parity PF = 0 7B Disp

JNS Not Sign SF = 0 79 Disp

JNZ Not Zero ZF = 0 75 Disp

JPE Parity Even PF = 1 7A Disp

JPO Parity Odd PF = 0 7B Disp

Thao tác trừ toán hạng đích cho toán hạng nguồn và thiết lập các cờ dựa trên kết quả của phép tính, trong khi các toán hạng vẫn giữ nguyên không thay đổi.

Cờ: Bị ảnh hưởng AF, CF, OF, PF, EF, ZF

3) Lệnh nhảy không điều kiện (JuMP)

Dạng lệnh: JMP nhãn_đích

Thao tác: Nếu gặp lệnh JMP thì chương trình chuyển ngay tới lệnh nhãn_đích để thi hành mà không cần điều kiện gì

Cờ: Không bị ảnh hưởng b Các cấu truc lập trình

Cấu trúc tuần tự là một trong những cấu trúc phổ biến và đơn giản nhất trong lập trình Trong cấu trúc này, chương trình bao gồm một chuỗi các lệnh được sắp xếp và thực hiện theo thứ tự từ trên xuống dưới.

Begin công_việc_1 công_việc_2

Cu pháp: if điều_kiện then công_việc end_if

Nếu điều kiện thoả mãn thì thực hiện công việc, nếu không thì bỏ qua sau đó thực hiện các lệnh kế tiếp

Cu pháp: if điều_kiện then công_việc_1 else công_việc_2 end_if

Nếu điều kiện đúng, thực hiện công việc 1; nếu điều kiện sai, thực hiện công việc 2 Đôi khi, điều kiện của "if" có thể bao gồm các điều kiện bổ sung như AND hoặc OR.

Trong lập trình, cấu trúc điều kiện AND và OR được sử dụng để xác định kết quả dựa trên hai điều kiện Cụ thể, điều kiện AND yêu cầu cả hai điều kiện phải đúng; nếu một trong hai điều kiện sai, kết quả sẽ là sai Ngược lại, điều kiện OR cho phép chỉ cần một trong hai điều kiện đúng; chỉ khi cả hai điều kiện đều sai thì kết quả mới là sai Cấu trúc này giúp tối ưu hóa quy trình ra quyết định trong lập trình.

Cu pháp: case biểu_thức k1: công_việc_1 k2: công_việc_2 kn: công_việc_n end_case

Case là một cấu truc lựa chọn một trong nhiều nhánh Nếu giá trị của biểu thức bằng ki thì thực hiện công việc thứ i

Cấu trúc lặp for trong lập trình được sử dụng để thực hiện một công việc với số lần lặp đã được xác định trước Cú pháp của vòng lặp for là: for số_lần_lặp do thân for end_for Để thực hiện cấu trúc lặp for, ta sử dụng lệnh lặp loop với cú pháp: Loop Nhãn_đích.

Lệnh loop hoạt động bằng cách nạp số lần lặp vào thanh ghi CX Mỗi khi lệnh loop được thực hiện, giá trị trong CX tự động giảm đi 1 và sau đó so sánh CX với 0.

Khi giá trị CX bằng 0, vòng lặp sẽ kết thúc Để thực hiện vòng lặp, nhãn đích cần được đặt trước lệnh lặp và không được vượt quá 126 byte Cú pháp của vòng lặp được khởi tạo bằng cách gán giá trị cho CX, xác định số lần lặp mong muốn.

; Thân vòng lặp loop Lable

Khi giá trị của thanh ghi CX bằng 0 trước vòng lặp, sau khi thực hiện vòng lặp một lần, CX sẽ tự động giảm xuống 1, dẫn đến nội dung trong CX trở thành 0FFFFH Điều này có nghĩa là vòng lặp sẽ được thực hiện thêm 65535 lần nữa Để tránh việc thực hiện vòng lặp khi CX đã bằng 0, ta có thể sử dụng lệnh JCXZ (Jump if CX is Zero) đặt trước vòng lặp.

CX bằng số lần lặp JCXZ exit

; Thân vòng lặp LOOP Lable

Cu pháp: while điều_kiện do công_việc end_while

Vòng lặp while kiểm tra điều kiện trước khi thực hiện thân vòng lặp Nếu điều kiện được thỏa mãn, thân vòng lặp sẽ được thực hiện, sau đó điều kiện lại được kiểm tra và tiếp tục thực hiện cho đến khi điều kiện không còn thỏa mãn Nếu điều kiện sai ngay từ đầu, công việc trong vòng lặp sẽ không được thực hiện.

Cu pháp: do công_việc while điều_kiện end_do_while

Vòng lặp do while kiểm tra điều kiện sau khi thực hiện thân vòng lặp, nghĩa là công việc trong vòng lặp sẽ được thực hiện ít nhất một lần Nếu điều kiện sai ngay từ lần đầu tiên, vòng lặp sẽ kết thúc; ngược lại, nếu điều kiện đúng, vòng lặp sẽ tiếp tục thực hiện.

Nhóm lệnh xử lý bit

Các lệnh logic, dịch và quay có khả năng tác động đến từng bit trong một byte hoặc một từ, cho phép thiết lập và kiểm tra từng bit trong thanh ghi hoặc ô nhớ mà không làm ảnh hưởng đến các bit khác.

1) Các lệnh AND, OR, XOR và TEST

Trong các phép toán OR, XOR và TEST, mỗi bit của toán hạng nguồn được kết hợp logic với bit tương ứng của toán hạng đích theo bảng chân lý 4.5 Kết quả của phép toán sẽ được lưu trữ trong toán hạng đích, trong khi các cờ CF và OF sẽ bị xóa.

Cờ: Bị ảnh hưởng: PF, SF, ZF

Cờ AF không xác định.

Bảng 4.5: Bảng chân lý của các phép toán logic

Nguồn Đích Đích

(Kết quả) Nguồn Đích Đích

Lệnh TEST thực hiện các thao tác tương tự như lệnh AND nhưng không lưu lại kết quả trong toán hạng đích Thông thường, lệnh TEST được sử dụng làm điều kiện cho các lệnh nhảy.

Có thể sử dụng các lệnh logic để thay đổi và chọn lọc các bit của toán hạng đích Để thực hiện điều này, chúng ta tạo ra một mẫu bit gọi là mặt nạ (MASK) Các bit của mặt nạ được chọn sao cho các bit tương ứng của toán hạng đích được thay đổi đúng như mong muốn khi lệnh logic được thực hiện Để tìm được mặt nạ, từ bảng trên có thể rút ra một số kết luận sau.

Lệnh AND được sử dụng để xóa các bit cụ thể của toán hạng đích trong khi vẫn giữ nguyên các bit còn lại Cụ thể, bit 0 trong mặt nạ sẽ xóa bit tương ứng, trong khi bit 1 sẽ giữ nguyên bit tương ứng của toán hạng đích.

Lệnh OR được sử dụng để thiết lập các bit xác định của toán hạng đích mà vẫn giữ nguyên các bit còn lại Cụ thể, bit 1 của mặt nạ sẽ thiết lập bit tương ứng trong khi bit 0 sẽ giữ nguyên bit tương ứng của toán hạng đích.

Lệnh XOR được sử dụng để đảo các bit xác định của toán hạng đích, trong khi vẫn giữ nguyên các bit còn lại Bit 1 trong mặt nạ sẽ đảo bit tương ứng, trong khi bit 0 giữ nguyên bit tương ứng của toán hạng đích Ngoài ra, XOR còn có khả năng xóa nội dung của thanh ghi hoặc ô nhớ.

NOT đích Thao tác: Tạo dạng bù 1 của toán hạng, xem bảng 3.5

Cờ: Không bị ảnh hưởng b Các lệnh dịch và quay

Các lệnh dịch thực hiện việc dịch chuyển các bit trong toán hạng sang trái hoặc sang phải một hoặc nhiều vị trí Những bit bị dịch ra ngoài sẽ được lưu trữ vào cờ nhớ.

+ Lệnh SAL/SHL (Shift Arithmethic Left/SHift logical Left)

SHL/SAL là thao tác dịch các bit trong toán hạng đích sang trái một hoặc nhiều vị trí Trong quá trình này, bit bên trái nhất sẽ được di chuyển vào cờ nhớ, trong khi bit bên phải nhất sẽ được thay thế bằng 0.

Khi thực hiện lệnh dịch trái với bộ đếm CL = 1, nếu MSB của toán hạng đích thay đổi, cờ OF sẽ được thiết lập là 1; nếu không thay đổi, cờ OF sẽ bị xóa Đối với các trường hợp bộ đếm CL khác 1, cờ OF không được xác định và giá trị của CL sẽ không thay đổi khi lệnh hoàn tất.

Lệnh SAL và SHL tạo ra cùng một mã máy

Cờ: Bị ảnh hởng CF, OF, PF, SF, ZF

Không xác định AF

+ Lệnh SHR (SHift logical Right)

Dạng lệnh: SHR đích,1

Thao tác: Dịch các bit trong toán hạng đích sang phải một hay nhiều vị trí.

CF nhận được bit LSB và 0 được dịch vào bit MSB

Khi dịch một vị trí, ta sử dụng lệnh thứ nhất để thực hiện nhiều lần dịch theo số lần đã đặt trong CL Nếu bộ đếm bằng 1 và 2 bit trái nhất của toán hạng đích giống nhau, thì cờ OF sẽ bị xóa Ngược lại, nếu chúng khác nhau, cờ OF sẽ được thiết lập.

Bộ đếm khác 1, OF không xác định, CL không thay đổi

Cờ: Bị ảnh hưởng CF, OF, PF, SF, ZF

Không xác định AF

+ Lệnh SAR (Shift Arithmetically Right)

Dạng lệnh: SAR đích,1

Thao tác dịch toán hạng được thực hiện một lần, trong đó CF nhận bit LSB và bit MSB được giữ nguyên Để thực hiện nhiều lần dịch, số lần dịch sẽ được xác định trong quá trình thao tác.

CL OF luôn bằng 0, CL không thay đổi

Cờ: Bị ảnh hưởng CF, OF, PF, SF, ZF

Không xác định AF

Khi thực hiện phép chia bằng phép dịch, cần phân biệt giữa việc chia các số không dấu và các số có dấu Đối với phép chia số không dấu, ta sử dụng lệnh SHL, trong khi phép chia với số có dấu yêu cầu sử dụng lệnh SAR để giữ nguyên dấu Nếu sử dụng lệnh SHR, dấu của toán hạng sẽ bị mất.

Lệnh quay thực hiện việc dịch chuyển tất cả các bit của toán hạng sang trái hoặc phải một hoặc nhiều vị trí Các bit bị dịch ra khỏi toán hạng sẽ được đưa vào cờ nhớ và đồng thời trả lại.

+ Lệnh ROL (ROtate Left)

Dạng lệnh: ROL đích,1

Lệnh ROL thực hiện việc dịch tất cả các bit của toán hạng đích sang trái một hoặc nhiều vị trí Bit MSB sẽ được đưa ra khỏi toán hạng và lưu vào cờ nhớ, đồng thời bit LSB sẽ được đưa trở lại vị trí đầu tiên.

Nhóm lệnh xử lý điều khiển

Bộ vi xử lý 8086 không thực hiện các thao tác chung như các bộ vi xử lý khác, chẳng hạn như 8087, mà chỉ thực hiện việc lấy các toán hạng từ bộ nhớ cho các bộ xử lý khác.

Dạng lệnh: ESC extenal_opcode, soure

Cờ: Không b HLT Đưa bộ vi xử lý vào trạng thái dừng để chờ ngắt ngoài

Dạng lệnh: HLT

Khoá bus trong môi trường có nhiều bộ vi xử lý

Dạng lệnh : LOCK

Khóa có thể được sử dụng như một tiền tố đặt trước bất kỳ lệnh nào Trong quá trình thực hiện lệnh, bus sẽ bị khóa để ngăn chặn các bộ vi xử lý khác truy cập vào bộ nhớ.

Cờ: Không ảnh hưởng d NOP

Dạng lệnh: NOP

Thao tác: Không thực hiện một thao tác nào

Cờ: Không bị ảnh hưởng e STI

Dạng lệnh: STI

Thao tác: IF được thiết lập 1

Cờ: Bị ảnh hưởng IF f WAIT

Dạng lệnh: WAIT

Thao tác: Bộ vi xử lý ở trạng thái chờ cho đến khi được kích hoạt bằng một lệnh ngắt ngoài

Cờ: Không bị ảnh hưởng.

Nhóm lệnh xử lý chuỗi

Chuyển dữ liệu trong bộ nhớ tại địa chỉ DS: SI vào ô nhớ có địa chỉ ES:

DI bằng cách dùng tiền tố REP, có thể chuyển đồng thời nhiều byte hay word

MOVS chuỗi_đích, chuỗi_nguồn hoặc MOVSB hoặc MOVSW

Khi thực hiện thao tác, chuỗi byte (hoặc word) sẽ được chuyển tới toán hạng đích Cả DI và SI sẽ tăng lên 1 (hoặc 2 đối với word) nếu DF bằng 0; ngược lại, chúng sẽ giảm đi 1 (hoặc 2 đối với word) nếu DF bằng 1.

Cờ: Không bị ảnh hưởng b Lệnh CMPS/CMPSB/CMPSW

So sánh hai toán hạng là một chuỗi byte hay word

CMPS chuỗi_đích, chuỗi_nguồn hoặc CMPSB hoặc CMPSW

Trong quá trình thao tác, ta trừ các thành phần của chuỗi nguồn (chỉ số bằng DS: SI) cho các thành phần chuỗi đích (chỉ số bằng ES: SI) Các cờ trạng thái được thiết lập dựa trên kết quả của phép tính Nếu cờ định hướng DF bằng 0, thì cả SI và DI đều tăng sau mỗi phép tính (tăng 1 khi so sánh byte và tăng 2 khi so sánh word) Ngược lại, trong các trường hợp khác, cả SI và DI đều giảm (giảm 1 khi so sánh byte và giảm 2 khi so sánh word).

Cờ: Bị ảnh hưởng, ngoại trừ AF, CF, SF, ZF, PF, OF c Lệnh LODS/LODSB/LODSW

Chuyển nội dung của byte hay word từ bộ nhớ được chỉ ra bởi SI vào thanh chứa

Dạng lệnh: LODS chuỗi_nguồn hoặc LODSB hoặc LODSW

Thao tác: Byte (hay word) được nạp vào AL (hay AX) SI tăng lên 1 hay 2 nếu DF = 0; ngược lại SI giảm đi 1 (hay 2) nếu DF = 1

Cờ: Không bị ảnh hưởng.

Ngăn xếp và thủ tục

Các module đi kèm

Ngày đăng: 23/09/2021, 11:32

HÌNH ẢNH LIÊN QUAN

Hình 3. 1- Sơ đồ khối của 8086 - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 3. 1- Sơ đồ khối của 8086 (Trang 10)
Hình 3.3 - Sơ đồ chân của 8086 - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 3.3 Sơ đồ chân của 8086 (Trang 14)
Hình 3.4 – Mạch tạo xung đồng hồ cho 8086 - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 3.4 – Mạch tạo xung đồng hồ cho 8086 (Trang 18)
Hình 3.6 – Sơ đồ ghép nối 8086 ở chế độ MAX với bộ điềukhiển bus 8288 - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 3.6 – Sơ đồ ghép nối 8086 ở chế độ MAX với bộ điềukhiển bus 8288 (Trang 19)
Hình 3.5 –Mối quan hệ giữa CLK, PCLK và OSC - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 3.5 –Mối quan hệ giữa CLK, PCLK và OSC (Trang 19)
Hình 4. 1- Mô tả lệnh MOV AL,[012H] - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 4. 1- Mô tả lệnh MOV AL,[012H] (Trang 28)
Hình 4. 2- Mô tả lệnh MOV AL,ES:[22] - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 4. 2- Mô tả lệnh MOV AL,ES:[22] (Trang 29)
Hình 4.4 - Mô tả lệnh MOV AX,[BX] - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 4.4 Mô tả lệnh MOV AX,[BX] (Trang 30)
Hình 4. 5- Mô tả lệnh MOV [BP+2],AL - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 4. 5- Mô tả lệnh MOV [BP+2],AL (Trang 30)
Hình 4. 6- Mô tả lệnh MOV AH,[BX+SI+2] 4.3 Một số hàm của ngắt 21H   - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 4. 6- Mô tả lệnh MOV AH,[BX+SI+2] 4.3 Một số hàm của ngắt 21H (Trang 31)
Hình 4. 6- Ngăn xếp khi chưa sử dụng - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 4. 6- Ngăn xếp khi chưa sử dụng (Trang 49)
Hình 4.8 - Ngăn xếp sau lệnh PUSH AX (trước lệnh POP BX) - BỘ THỰC HÀNH VI XỬ LÝ MTS86C
Hình 4.8 Ngăn xếp sau lệnh PUSH AX (trước lệnh POP BX) (Trang 50)

TỪ KHÓA LIÊN QUAN

w