Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây:
Có thể xảy ra hiện tượng nạp thải đường ống
=> Sắp xếp lại để không xảy ra hiện tượng nạp thải
1 - MOV AX, 12h;
2 - MOV BX, 34h;
3 - MOV CX, 56h;
4 - MOV DX, 789h;
5 - ADD AX, BX;
Có 5 giai đoạn cơ bản khi CPU thực hiện một lệnh mã máy:
1. Fetch (nạp lệnh),
2. Decode (giải mã)
3. Execute(thực thi)
4. Memory access (truy cập bộ nhớ)
5. Write-back. (ghi kết quả)
Kỹ thuật xử lý song song mức lệnh (Instruction-level parallelism - ILP) là kỹ thuật tăng tốc độ xử lý bằng cách thực hiện nhiều lệnh cùng một lúc. Kỹ thuật này được thực hiện trên các CPU hiện đại bằng cách sử dụng nhiều đơn vị thực hiện lệnh trong cùng một chu kỳ xung nhịp.
Các kỹ thuật ILP bao gồm:
- Pipelining (đường ống): Tách một lệnh thành nhiều giai đoạn khác nhau và thực hiện các giai đoạn đó cùng một lúc trên nhiều lệnh khác nhau. Kỹ thuật này giúp tăng tốc độ xử lý bằng cách loại bỏ thời gian chờ đợi giữa các lệnh.
- Superscalar processing: Sử dụng nhiều đơn vị thực hiện lệnh cùng một lúc để thực hiện nhiều lệnh khác nhau trong một chu kỳ xung nhịp. Kỹ thuật này tận dụng tốt hơn tài nguyên phần cứng của CPU và cải thiện hiệu suất xử lý.
- Out-of-order execution: Thực hiện các lệnh không theo thứ tự trình tự trong chương trình để tận dụng tối đa tài nguyên phần cứng và loại bỏ thời gian chờ đợi giữa các lệnh.
- Speculative execution: Thực hiện các lệnh dự đoán trước để tối ưu hiệu suất xử lý. Kỹ thuật này được sử dụng trong các CPU hiện đại để tăng tốc độ xử lý và cải thiện hiệu suất của CPU.
B2:
a. Chế độ định vị toán hạng: bộ chỉ thị 16-bit với chế độ địa chỉ có giản lược. Ý nghĩa: Di chuyển dữ liệu từ địa chỉ bộ nhớ có giá trị là [SI+9876h] vào thanh ghi AX. Giá trị ban đầu của [SI] là 10h.
b. Chế độ định vị toán hạng: trực tiếp. Ý nghĩa: Di chuyển giá trị của con trỏ ngăn xếp (stack pointer) vào thanh ghi AX.
Có hai phương pháp định vị bộ nhớ: định vị trực tiếp và định vị gián tiếp.
1. Định vị trực tiếp: trong phương pháp này, địa chỉ của mỗi ô nhớ được trực tiếp lưu trữ trong câu lệnh máy. Khi CPU thực hiện lệnh truy cập bộ nhớ, nó sẽ truy cập trực tiếp đến địa chỉ được lưu trữ trong câu lệnh.
Phương pháp này đơn giản và nhanh chóng nhưng có hạn chế là giới hạn số lượng ô nhớ mà CPU có thể truy cập trực tiếp.
2. Định vị gián tiếp: phương pháp này sử dụng một thanh ghi hoặc một ô nhớ để lưu trữ địa chỉ của ô nhớ cần truy cập. CPU sử dụng giá trị của thanh ghi hoặc ô nhớ này để truy cập đến ô nhớ cần thiết.
Phương pháp này linh hoạt hơn định vị trực tiếp và cho phép truy cập đến nhiều ô nhớ hơn. Tuy nhiên, nó có thể tốn nhiều thời gian và tài nguyên hơn để tính toán địa chỉ cần truy cập.
Để tính địa chỉ vật lý của ô nhớ, ta cần biết cách chuyển đổi địa chỉ logic sang địa chỉ vật lý. Công thức chuyển đổi như sau:
Địa chỉ vật lý = (Đoạn * 10h) + Địa chỉ offset
Trong đó:
+ Đoạn: là số hiệu của đoạn bộ nhớ, có kích thước là 64KB, được chỉ định bởi thanh ghi CS (Code Segment Register).
+ Địa chỉ offset: là địa chỉ của ô nhớ trong đoạn bộ nhớ đó, được chỉ định bởi thanh ghi IP (Instruction Pointer Register) hoặc thanh ghi trong lệnh truy cập bộ nhớ.
Áp dụng công thức trên với địa chỉ logic 9876:ABCD, ta có:
+ Đoạn: 9876h
+ Địa chỉ offset: ABCDh
Địa chỉ vật lý = (9876h * 10h) + ABCDh = 9876ABCDh
Vậy địa chỉ vật lý của ô nhớ 9876:ABCD là 9876ABCDh.
Để tìm 5 cặp địa chỉ logic tương ứng, ta có thể sử dụng công thức chuyển đổi địa chỉ vật lý sang địa chỉ logic như sau:
Đoạn = Địa chỉ vật lý div 10h
Địa chỉ offset = Địa chỉ vật lý mod 10h
Áp dụng công thức trên với 5 địa chỉ vật lý khác nhau, ta có các cặp địa chỉ logic tương ứng như sau:
+ Địa chỉ vật lý: 12345678h -> Địa chỉ logic: 1234:5678
+ Địa chỉ vật lý: 9ABCDEF0h -> Địa chỉ logic: 9ABC:DEF0
+ Địa chỉ vật lý: 11223344h -> Địa chỉ logic: 1122:3344
+ Địa chỉ vật lý: FFFFFFFFh -> Địa chỉ logic: FFFF:FFFF
+ Địa chỉ vật lý: 5555AAAAh -> Địa chỉ logic: 5555:AAAA
Lưu ý: Địa chỉ vật lý là số nguyên dương có 8 chữ số hexa, còn địa chỉ logic là cặp số hexa, mỗi số có 4 chữ số.
Trong kiến trúc CPU x86, thanh ghi cờ FLAGS được sử dụng để lưu trữ trạng thái của CPU và kết quả của các phép tính. Thanh ghi này có 16 bit, trong đó các bit từ 0 đến 11 và bit 14 được sử dụng để lưu trữ các bit cờ, các bit còn lại không được sử dụng.
Dưới đây là ý nghĩa của từng bit cờ trong thanh ghi FLAGS:
1. Carry Flag (CF): Bit này được sử dụng để lưu trữ trạng thái dư ra của phép tính toán, ví dụ như phép cộng hoặc phép trừ. Nếu kết quả của phép tính toán vượt quá kích thước của thanh ghi thì bit CF sẽ được thiết lập thành 1.
2. Parity Flag (PF): Bit này được sử dụng để lưu trữ trạng thái của kết quả phép tính, xác định xem kết quả có chẵn hay lẻ. Nếu kết quả là số chẵn thì bit này sẽ được thiết lập thành 1.
3. Auxiliary Carry Flag (AF): Bit này được sử dụng để lưu trữ trạng thái của dấu nhớ ở bit thấp nhất (bit 4) của phép tính toán.
4. Zero Flag (ZF): Bit này được sử dụng để lưu trữ trạng thái của kết quả phép tính, xác định xem kết quả có bằng 0 hay không. Nếu kết quả là 0 thì bit này sẽ được thiết lập thành 1.
5. Sign Flag (SF): Bit này được sử dụng để lưu trữ trạng thái của kết quả phép tính, xác định xem kết quả có là số âm hay không. Nếu kết quả là số âm thì bit này sẽ được thiết lập thành 1.
6. Trap Flag (TF): Bit này được sử dụng để bật chế độ debug trong CPU, cho phép các trình debug có thể giám sát các phép tính.
7. Interrupt Flag (IF): Bit này được sử dụng để bật hoặc tắt chế độ ngắt (interrupt) của CPU. Khi được thiết lập thành 1, CPU sẽ cho phép các tín hiệu ngắt được phép thực hiện.
8. Direction Flag (DF): Bit này được sử dụng để xác định hướng di chuyển của các phép tính chuỗi (string), ví dụ như chuỗi ký tự.
9. Overflow Flag (OF): Bit này được sử dụng để lưu trữ trạng thái của tràn số (overflow) trong phép tính toán
- Thanh ghi Segment Registers (CS, DS, ES, SS): Độ dài của các thanh ghi này là 16 bit. Các thanh ghi này được sử dụng để chỉ định các đoạn (segment) của bộ nhớ được sử dụng để lưu trữ các dữ liệu và chương trình.
- Thanh ghi Extended Registers (EIP, EBP, ESP, EBX, ESI, EDI): Độ dài của các thanh ghi này là 32 bit. Các thanh ghi này là các phiên bản mở rộng của các thanh ghi trên và được sử dụng trong các kiến trúc x86 mới hơn.
Trong kiến trúc CPU x86, có 3 nhóm thanh ghi chính:
- Nhóm thanh ghi Điều khiển (Control Registers):
+ Thanh ghi Instruction Pointer (IP) chỉ định vị trí của lệnh tiếp theo trong bộ nhớ.
+ Thanh ghi Flags (FLAGS) chứa các bit cờ để lưu trữ trạng thái của CPU sau mỗi lệnh thực hiện.
+ Thanh ghi Segment Registers (CS, DS, SS, ES, FS, GS) chứa thông tin về các đoạn bộ nhớ (segments) trong bộ nhớ.
- Nhóm thanh ghi Trạng thái (Status Registers):
+ Thanh ghi Flags (FLAGS) chứa các bit cờ để lưu trữ trạng thái của CPU sau mỗi lệnh thực hiện.
- Nhóm thanh ghi Dữ liệu (Data Registers):
+ Thanh ghi Accumulator (AX) có thể được sử dụng để thực hiện các phép tính toán số học và logic.
+ Thanh ghi Base Register (BX) có thể được sử dụng như một con trỏ cơ sở (base pointer) cho các khối dữ liệu trong bộ nhớ.
+ Thanh ghi Counter Register (CX) có thể được sử dụng để lặp lại các lệnh hoặc để đếm các sự kiện.
+ Thanh ghi Data Register (DX) có thể được sử dụng để lưu trữ dữ liệu đầu vào hoặc đầu ra của các hoạt động đọc/ghi vào các thiết bị ngoại vi.
+ Thanh ghi Stack Pointer (SP) được sử dụng để lưu trữ địa chỉ của đỉnh (top) của bộ đệm ngăn xếp.
+ Thanh ghi Base Pointer (BP) được sử dụng để lưu trữ địa chỉ cơ sở của một khối dữ liệu trên bộ đệm ngăn xếp (stack).
Các thanh ghi trong nhóm thanh ghi Điều khiển và Trạng thái được sử dụng để điều khiển luồng xử lý của CPU và lưu trữ các thông tin quan trọng về trạng thái của CPU, trong khi các thanh ghi trong nhóm thanh ghi Dữ liệu được sử dụng để lưu trữ và xử lý các dữ liệu và địa chỉ trong bộ nhớ và bộ đệm ngăn xếp.
Trong kiến trúc CPU x86, có một số thanh ghi đa năng có thể được sử dụng cho nhiều mục đích khác nhau. Các thanh ghi đa năng bao gồm:
1. Thanh ghi Accumulator (AX): Độ dài của thanh ghi này là 16 bit. Thanh ghi AX có thể được sử dụng để thực hiện các phép tính toán số học và logic.
2. Thanh ghi Base Register (BX): Độ dài của thanh ghi này là 16 bit. Thanh ghi BX có thể được sử dụng như một con trỏ cơ sở (base pointer) cho các khối dữ liệu trong bộ nhớ.
3. Thanh ghi Counter Register (CX): Độ dài của thanh ghi này là 16 bit. Thanh ghi CX có thể được sử dụng để lặp lại các lệnh hoặc để đếm các sự kiện.
4. Thanh ghi Data Register (DX): Độ dài của thanh ghi này là 16 bit. Thanh ghi DX có thể được sử dụng để lưu trữ dữ liệu đầu vào hoặc đầu ra của các hoạt động đọc/ghi vào các thiết bị ngoại vi.
5. Thanh ghi Stack Pointer (SP): Độ dài của thanh ghi này là 16 bit. Thanh ghi SP được sử dụng để lưu trữ địa chỉ của đỉnh (top) của bộ đệm ngăn xếp.
6. Thanh ghi Base Pointer (BP): Độ dài của thanh ghi này là 16 bit. Thanh ghi BP được sử dụng để lưu trữ địa chỉ cơ sở của một khối dữ liệu trên bộ đệm ngăn xếp (stack).
7. Thanh ghi Flags (FLAGS): Độ dài của thanh ghi này là 16 bit. Thanh ghi FLAGS chứa các bit cờ để lưu trữ trạng thái của CPU sau mỗi lệnh thực hiện.
3. HOLD (Hold Request): Được sử dụng bởi các thiết bị ngoại vi để giữ CPU và giảm tải các thao tác xử lý. Khi một tín hiệu HOLD được kích hoạt, CPU đáp ứng bằng cách dừng các hoạt động hiện tại và truyền điều khiển cho thiết bị ngoại vi.
4. HLDA (Hold Acknowledge): Được sử dụng bởi CPU để xác nhận rằng nó đã dừng hoạt động của mình và truyền điều khiển cho thiết bị ngoại vi. Sau khi nhận được tín hiệu HLDA, thiết bị ngoại vi có thể truy cập các tài nguyên của hệ thống.