---
# System prepended metadata

title: Lecture Computer System_Part 03
tags: [Computer Systems, Lecture HCMUS]

---

## :keyboard: Chapter :six: : ASSEMBLY LANGUAGE PROGRAMMING (Cont.)

### II. MIPS

#### 14. MIPS Control Flow Instructions

* Other Control Flow Instructions
    * MIPS also has an unconditional branch instruction or **jump** instruction:
    ```p=
    j    label    # go to label
    ```
    * Instruction Format (J Format):
        <center>
            <img src = https://scontent.fsgn2-7.fna.fbcdn.net/v/t1.15752-9/412654655_912822130225983_2440668174959048058_n.png?_nc_cat=100&ccb=1-7&_nc_sid=8cd0a2&_nc_ohc=-fLNofx2kS0AX_pWCt_&_nc_ht=scontent.fsgn2-7.fna&oh=03_AdTXd_VAJPRx0aWyyhn10e3e8X0Rgqq-mP1DXg-W-6_How&oe=65AFC507>
        </center>

* Branching Far Away
    * What if the branch destination is further away than can be captured in 16 bits?
        * The assembler comes to the rescue – it inserts an unconditional jump to the branch target and inverts the condition
            ```p=
            beq    $s0, $s1, L1
            ```

            becomes

            ```p=
                bne $s0, $s1, L2
                j L1
            l2 :
            ```
#### 15. Instructions for Accessing Procedures
* MIPS **procedure call** instruction:
```p=
jal    ProcedureAddress    #jump and link
```
* Save PC + 4 in register $ra to have a link to the next instruction for the procedure return
* Machine format (J format):
    <center>
        <img src = https://scontent.fsgn2-8.fna.fbcdn.net/v/t1.15752-9/411373345_1026482968652376_102654219615004345_n.png?_nc_cat=102&ccb=1-7&_nc_sid=8cd0a2&_nc_ohc=L8us8vGUW9MAX--COaD&_nc_ht=scontent.fsgn2-8.fna&oh=03_AdTgHdnHpKtPnCx07L0t6PWzXfEC_mGHD4MuTZ_QF0MffQ&oe=65AFCC0A>
    </center>
* Then can do procedure **return** with a
    ```p=
    jr    $ra    # return
    ```
* Instruction format (R format)
    <center>
        <img src = https://scontent.fsgn2-11.fna.fbcdn.net/v/t1.15752-9/410202638_680384837575805_8693212784879997584_n.png?_nc_cat=105&ccb=1-7&_nc_sid=8cd0a2&_nc_ohc=q_FQU-8OZnwAX_hDxHk&_nc_ht=scontent.fsgn2-11.fna&oh=03_AdR4lxCXvMCX1NwYg7_LPYsH4yLyHV1QafWO_WTfO5Ud5w&oe=65AFD2E7>
    </center>

#### 16. MIPS - First Look

<center>
    <img src = https://scontent.fsgn2-7.fna.fbcdn.net/v/t1.15752-9/409749583_729736162088260_1778789606800165138_n.png?_nc_cat=108&ccb=1-7&_nc_sid=8cd0a2&_nc_ohc=kbihaBuzau8AX8PC_Qu&_nc_ht=scontent.fsgn2-7.fna&oh=03_AdThNSHc_4k9dNOyaxNvFSlYAm-LJwK01i-9XCAJrKpUqQ&oe=65AFEDC0>
</center>

--- 

# ĐỀ CUỐI KỲ MÔN ==COMPUTER SYSTEMS== 2023

## :100: ĐỀ KHÓA HK3_CLC_22CLC04 2022-2023

### I. PHẦN TRẮC NGHIỆM

:::info
:warning: **PHẦN TRẮC NGHIỆM** 
- Chọn phát biểu **++KHÔNG CÙNG TÍNH ĐÚNG SAI++** với các phát biểu còn lại.
:::

* **Câu 01** *(2 điểm)*: Từ **COMPUTER** đã từng có nghĩa là 
    | a. Người làm toán | b. Máy tính toán | ==c. Máy đếm tiền== | d. Máy tính điện tử |
    | ----------------- | ---------------- | ------------------- | ------------------- |
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation** 
            * Câu **(a), (b), (d) đúng**
            * Câu **(c) sai**
        $\Rightarrow$ **Chủ Đề**: chương 01 (Computer Systems Overview)
        :::
* **Câu 02** *(2 điểm)* : **Hệ thống Máy tính** *(Computer Systems)*
    a. là sự kết hợp của nhiều computer chuyên biệt, trong đó có màn hình, bàn phím, đĩa, ...
    ==b. muốn hoạt động được thì phải có hardware, OS, các app và các data của người dùng==
    c. có kiến trúc phần mềm được đại diện bởi ISA (kiến trúc bộ lệnh)
    d. có kiến trúc phần cứng được đại diện bởi CPU và GPU.
    
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Câu **(a) đúng**bởi vì theo định nghĩa: Computer + System: often is the system of many computers to perform general functions, as known as a **“complete”** computer (**general** computer system). A “complete” computer including hardware, software, humanware.
            * Câu **(b) sai** vì Computer Systems vẫn hoạt động được khi không nhất thiết phải cần có data của người dùng.
            * Câu **( c ) đúng** vì kiến trúc phần mềm được đại diện là ISA (The format and behavior of a machine - level program is ddefined by the instruction set architecture (ISA).) Đồng thời, software cũng bao gồm:
                * Data Representation : mentioned in Chapter 02
                * Operating Systems (OS) & Apps $\to$ soul of computer
                * ISA - Programming
            * Câu **(d) đúng** vì hardware bao gồm:
                * Processing:
                    * CPU = ALU + CU $\to$ xử lý tính toán bộ nhớ
                    * GPU = ALU + CU $\to$ xử lý tính toán đồ họa
                * Memory / Storage:
                * I/O Devices 
        $\Rightarrow$ **Chủ Đề**: chương 01 (Computer Systems Overview)
        :::

* **Câu 03** *(2 điểm)* : Các thanh ghi (**Registers**)
    a. có tốc độ truy xuất nhanh hơn nhiều so với RAM và nhanh hơn cả Cache
    ==b. chỉ tồn tại trong CPU, các chip xử lý khác không có==
    c. có kích thước rất nhỏ, tính theo bit chứ không tới Kb
    d. chứa các thông tin / dữ liệu tạm thời phục vụ cho hoạt động ở thời điểm hiện tại của chip
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Câu **(a) đúng** vì thứ tự sắp xếp nhanh nhất về tốc độ truy xuất : Register > Cache > RAM > ROM
                * **RAM (Random-Access Memory)** is the main memory with big size (usually, in GB). It can be read and written anytime by CPU. The data in RAM is lost when the computer is shut off or restart.
                * **ROM (Read-Only Memory)** is typically used to store the computer's initial start-up instructions.
                * **Registers** are the smallest and the fastest storage. They are organized inside the CPU and provide the fastest way to access data.
                * (CPU) **Cache** is a type of cache memory that a processor uses to access data and programs much more quickly than through host RAM. It enables storing and providing access to frequently used programs and data.
            * Câu **(b) sai** vì register không chỉ nằm trong CPU mà còn nằm trong GPU (xử lý đồ họa).
            * Câu **( c ) đúng** vì Thanh ghi thường được đo bằng các bit nó có thể chứa, ví dụ, một thanh ghi "8-bit" hay thanh ghi "32-bit". Các thanh ghi hiện nay thường được xem như file thanh ghi - register file, nhưng chúng cũng được dùng riêng rẽ các flip-flop, tốc độ cao core memory, thin film memory, và các cách khác trong nhiều máy móc.
            * Câu **(d) đúng** vì trong kiến trúc máy tính, một thanh ghi (registers) là một bộ nhớ dung lượng nhỏ và rất nhanh được sử dụng để tăng tốc độ xử lý của các chương trình máy tính bằng cách cung cấp các truy cập trực tiếp đến các giá trị cần dùng. Hầu hết, nhưng không phải tất cả, các máy tính hiện đại hoạt động theo nguyên lý chuyển dữ liệu từ bộ nhớ chính vào các thanh ghi, tính toán trên chúng, sau đó chuyển kết quả vào bộ nhớ chính.
        $\Rightarrow$ **Chủ Đề**: chương 01 (Computer Systems Overview)
        :::
* **Câu 04** *(2 điểm)* : ISA mô tả
    a. Mô hình bộ nhớ trong (Đúng)
    ==b. Mô hình bộ nhớ ngoài (Sai)==
    c. Các chế độ, kiểu và định dạng lệnh
    d. Địa chỉ dữ liệu, các kiểu toán hạng, thanh ghi (Đúng)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Câu **(a) dúng** vì mô hình bộ nhớ trong (internal memory model) là một thuộc tính của kiến trúc hệ thống máy tính, đồng thời ISA là kiến trúc bộ lệnh - tập trung vào instruction set và interface giữa hardware và software $\to$ ISA mô tả cách hệ thống quản lý và tổ chức bộ nhớ trong hoạt động.
            * Câu **(b) sai** vì mô hình bộ nhớ ngoài (external memory model) thường liên quan đến cách dữ liệu được truy cập và lưu trữ ngoài bộ nhớ chính, và không là một phần chính của ISA $\to$ ISA không mô tả external memory model.
            * Câu **( c ) đúng** vì ISA mô tả tập lệnh dành cho những bộ vi xử lý có kiến trúc tương tự nhau.
            * Câu **(d) đúng** vì ISA thường mô tả cách mà địa chỉ dữ liệu được xác định, cũng như các kiểu toán hạng mà lệnh hỗ trợ và thanh ghi sẵn có trong CPU.
        $\Rightarrow$ **Chủ Đề**: chương 01 (Computer Systems Overview)
        :::
* **Câu 05** *(2 điểm)* : Mạch đếm chương trình (Program Counter) trong CPU là
    a. để đếm số chương trình đang chạy
    b. để kết nối tới biến đếm của vòng lặp trong chương trình
    ==c. một thanh ghi có kết nối với mạch đếm, dùng để lưu địa chỉ lệnh kế tiếp==
    d. mạch kết nối với các thanh ghi đa dụng phục vụ cho tác vụ tăng hoặc giảm một đơn vị
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu **(a) sai** vi PC (Program Counter) không phải là để đếm số chương trình đang chạy mà thay vào đó nó giữ địa chỉ của lệnh hiện tại mà CPU đang thực hiện.
            * Câu **(b) sai** vì PC không liên quan trực tiếp đến biến đếm của vòng lặp trong chương trình. Việc kiểm soát vòng lặp thường được thực hiện bằng cách sử dụng thanh ghi hoặc biến đếm khác.
            * Câu **( c ) đúng** vì PC là một thanh ghi đặc biệt trong CPU. Nó giữ địa chỉ của lệnh tiếp theo mà CPU sẽ thực hiện. Khi một lệnh được thực hiện, giá trị của PC sẽ tăng lên để trỏ đến lệnh kế tiếp trong bộ nhớ.
            * Câu **(d) sai** vì PC không thường liên quan trực tiếp đến các thanh ghi đa dụng để thực hiện tác vụ tăng hoặc giảm một đơn vị. Thông thường, PC chỉ chịu trách nhiệm lưu trữ và quản lý địa chỉ của lệnh tiếp theo.
        $\Rightarrow$ **Chủ Đề**: chương 01 (Computer Systems Overview)
        :::
* **Câu 06** *(2 điểm)* Biểu diễn số bằng phương pháp bù hai sẽ đạt hiệu quả tốt khi
    ==a. cộng hoặc trừ hai số nguyên==
    b. cộng hoặc trừ hai số thực
    c. nhân hoặc chia hai số nguyên
    d. dịch bit (shift)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer A**==
        * **Explanation**
            * Câu **(a) đúng** vì phương pháp bù hai thường được sử dụng để biểu diễn số nguyên và thực hiện các phép toán cộng và trừ hiệu quả. Các phép toán này có thể thực hiện mà không cần sự thay đổi đặc tính của các phép toán.
            * Câu **(b) sai** vì phương pháp bù hai chủ yếu được sử dụng cho số nguyên. Đối với số thực, phương pháp biểu diễn bù hai có thể không phù hợp do sự động chấp và sự chênh lệch giữa số thực và biểu diễn bảo trì.
            * Câu **( c ) sai** vì phương pháp bù hai không được sử dụng trực tiếp cho phép nhân và chia. Thay vào đó, nó thường được áp dụng cho phép cộng và trừ.
            * Câu **(d) sai** vì phương pháp bù hai không đặc biệt được thiết kế để thực hiện các phép dịch bit (shift). Các phép dịch bit thường được thực hiện trong phạm vi của toán hạng bình thường.
        :::
* **Câu 07** *(2 điểm)* : Khi chương trình trong máy tính được khởi chạy, các lệnh được nạp từ bộ nhớ ngoài vào và thực hiện theo cơ chế:
    a. nạp toàn bộ vào Cache, sau đó CPU thực hiện từng lệnh một từ Cache
    b. nạp từng phần vào Cache, sau đó CPU thực hiện từng lệnh một đến khi hết Cache thì lại nạp vào tiếp
    ==c. nạp từng phần vào RAM rồi CPU lấy chúng đem vào Cache và thực hiện các lệnh trong Cache, quá trình này cứ thế tiếp diễn cho đến khi chương trình chạy xong==
    d. nạp toàn bộ vào RAM, sau đó CPU lấy từng phần vào Cache (nếu có thể dùng được Cache) và thực hiện từng lệnh một đến khi hoàn thành chương trình
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Khi một chương trình được khởi chạy trên máy tính, quá trình thực hiện các lệnh thường diễn ra theo các bước sau:
                1.  **Nạp từ bộ nhớ ngoại vào RAM:** Ban đầu, toàn bộ chương trình không được nạp vào bộ nhớ RAM mà chỉ một phần nhỏ của nó được nạp từ bộ nhớ ngoại vào bộ nhớ RAM. Điều này giảm độ trễ khi khởi chạy chương trình và tiết kiệm tài nguyên bộ nhớ.
                2.  **Nạp từng phần vào RAM:** Hệ điều hành sẽ quản lý việc nạp từng phần nhỏ của chương trình vào RAM. Điều này thường được thực hiện theo mô hình "paging" hoặc "segmentation", tùy thuộc vào cách bộ nhớ ảo của hệ điều hành được tổ chức.
                3.  **CPU lấy từng phần và đưa vào Cache:** CPU không thực hiện lệnh trực tiếp từ RAM mà thường sử dụng bộ nhớ cache, vì cache có tốc độ truy cập nhanh hơn so với RAM. Khi CPU cần một phần của chương trình, nó lấy từ RAM và đưa vào bộ nhớ cache.
                4.  **Thực hiện các lệnh trong Cache:** CPU thực hiện các lệnh từ bộ nhớ cache. Quá trình này giúp giảm độ trễ do tốc độ truy cập cao của cache so với RAM.
                5.  **Lặp lại quá trình:** Quá trình này được lặp lại khi chương trình chạy. Khi một phần của chương trình đã được thực hiện xong, các phần tiếp theo sẽ được nạp vào RAM và cache theo nhu cầu.
            * Cơ chế này giúp tối ưu hóa việc sử dụng bộ nhớ và giảm độ trễ trong quá trình thực hiện chương trình. Mô hình này phản ánh sự kết hợp giữa bộ nhớ RAM và bộ nhớ cache để cung cấp hiệu suất cao cho CPU khi thực hiện các lệnh từ chương trình.
        :::
* **Câu 08** *(2 điểm)*
    a. Mỗi bộ xử lý có một tập lệnh xác định, nhưng nhiều OS khác nhau có thể chạy được trên đó.
    b. Mỗi lệnh của tập lệnh là một chuỗi bit mà bộ xử lý hiểu được, dùng để thực hiện một thao tác nhất định.
    c. Tập lệnh của CPU thường chỉ chứa được vài chục đến vài trăm lệnh.
    ==d. Tập lệnh của CPU nằm trong firmware và có thể được upgrade (nâng cấp) qua internet khi cần thiết.==
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer D**==
        * **Explanation**
            * Câu **(a) đúng** vì mỗi bộ xử lý có một ISA (Instruction Set Architecture) cụ thể, nhưng nhiều hệ điều hành khác nhau có thể chạy trên cùng một ISA.
            * Câu **(b) đúng** vì mỗi lệnh trong tập lệnh của CPU được biểu diễn dưới dạng một chuỗi bit cụ thể mà bộ xử lý hiểu để thực hiện một thao tác cụ thể.
            * Câu **( c ) đúng** vì tập lệnh của CPU thường chỉ được vài chục đến vài trăm lệnh.
            * Câu **(d) sai** vì tập lệnh của CPU thường được lưu trữ trong bộ nhớ ROM hoặc Flash memory và không thường xuyên được nâng cấp qua internet. Firmware của CPU có thể được nâng cấp, nhưng quá trình này thường phức tạp hơn và không phải là một thực tế phổ biến.
        :::
* **Câu 09** *(2 điểm)* Mạch CLC (combinational logic circuit - mạch tổ hợp) không thể
    a. có số đường ra nhiều hơn số đường vào
    ==b. có vòng lặp (tín hiệu ra ở 1 cổng sau khi qua các cổng khác lại là tín hiệu vào của cổng ban đầu)==
    c. chỉ dùng toàn cổng NAND hoặc cổng NOR
    d. kết nối với Register
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Câu **(a) sai** vì mạch CLC có thể có số đường ra nhiều hơn số đường vào (ví dụ như một bộ giảm độ nhiễu (decoder) hoặc một bộ tăng độ nhiễu (encoder).). Điều này là phổ biến trong các mạch tổ hợp.
            * Câu **(b) đúng** vì mạch CLC không thể có vòng lặp vì nếu có vòng lặp, tín hiệu sẽ không xác định được giá trị và có thể dẫn đến trạng thái không ổn định.
            * Câu **( c ) sai** vì mạch CLC có thể được thiết kế chỉ sử dụng cổng NAND hoặc cổng NOR để thực hiện chức năng logic cơ bản.
            * Câu **(d) sai** vì mạch CLC có thể kết nối với Register để lưu giữ trạng thái hoặc dữ liệu tạm thời. Tuy nhiên, sự kết nối với Register không xác định tính chất của mạch CLC mà chỉ là một phần của hệ thống lớn hơn.
        :::
* **Câu 10** *(2 điểm)* : Interrupt (Ngắt) là
    a. cơ chế cực kỳ quan trọng mà nhờ nó máy tính có sự thông minh và OS có thể chạy đa chương
    b. các chương trình xử lý cơ bản được lưu trong ROM và sẽ được nạp vào RAM khi bật máy (sau đó OS có thể nạp thêm một số ngắt bổ sung)
    ==c. tín hiệu phát sinh từ phần cứng khiến CPU sẽ tạm dừng chương trình đang chạy để chuyển qua chạy chương trình điều khiển tương ứng với tín hiệu ngắt cứng đó==
    d. tín hiệu ngắt phát sinh từ một phần mềm hệ thống khiến CPU sẽ tạm dừng chương trình đang chạy để chuyển qua chạy phần mềm hệ thống đó (sau đó CPU sẽ quay lại chạy tiếp chương trình đã tạm ngắt)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu **(a) sai** vì nó cũng là cơ chế quan trọng nhưng không đến mức cực kỳ quan trọng (vì interrupt không phải là đặc trưng cho toàn bộ hệ thống.)
            * Câu **(b) sai** vì đây không phải mô tả đặc trưng cho interrupt
            * Câu **( c ) đúng** vì interrupt xảy ra khi có tín hiệu ngắt từ phần cứng, và CPU tạm dừng chương trình hiện tại để xử lý chương trình điều khiển interrupt.
            * Câu **(d) sai** vì mô tả không phải là interrupt từ phần cứng, mà là từ phần mềm hệ thống (software interrupt hay còn gọi là trap).
        :::
* **Câu 11** *(2 điểm)* : RISC có
    a. số lượng lệnh ít (chỉ vài chục) và khó lập trình, chương trình chiếm ít bộ nhớ hơn CISC
    b. tập thanh ghi lớn nhưng cấu trúc CPU đơn giản, thời gian thực hiện mỗi lệnh là 01 xung nhịp
    ==c. số lượng khuôn dạng lệnh ít (<= 4 khuôn dạng lệnh) và có ít model địa chỉ (<= 4 models địa chỉ), CISC thì ngược lại==
    d. một thể hiện cụ thể là bộ lệnh x86
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu **(a) sai** vì RISC là bộ lệnh chỉ gồm các lệnh đơn giản $\to$ việc lập trình sẽ trở nên khó hơn (vì ít được hỗ trợ nên các chức năng phức tạp sẽ được xây dựng từ rất nhiều lệnh đơn giản) $\to$ số lượng lệnh sẽ nhiều mặc dù chương trình chiếm ít bộ nhớ hơn CISC.
            * Câu **(b) sai** vì RISC thường có tập thanh ghi ít hơn nhằm tối ưu hóa hiệu suất.
            * Câu **( c ) đúng** vì RISC thiên về số lượng lệnh và khuôn dạng lệnh ít, đơn giản hóa để tăng tốc độ thực hiện.
            * Câu **(d) sai** vì bộ lệnh x86 là một tập kiến trúc bộ lệnh rất lớn nên cần có một tập kiến trúc bộ lệnh đủ lớn từ đơn giản đến phức tạp $\to$ bộ lệnh x86 là một ví dụ cho kiến trúc CISC chứ không phải cho RISC.
        :::
* **Câu 12** *(2 điểm)* : Kiến trúc CISC của Intel (với bộ lệnh x86) vẫn sử dụng nhiều trên các máy PC (desktop, laptop) vì:
    a. dễ xây dựng trình dịch (compiler) hơn.
    b. phù hợp với nhiều ngôn ngữ lập trình cấp cao.
    ==c. chương trình sẽ chạy nhanh hơn hẳn so với RISC.==
    d. vấn đề tương thích, phần mềm có sẵn đang rất nhiều.
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu **(a) đúng** vì tùy trường hợp cụ thể, mặc dù kiến trúc CISC có thể có nhiều lệnh phức tạp, nhưng đôi khi có thể đơn giản hóa quá trình biên dịch do sự linh hoạt của lệnh và chức năng tích hợp sẵn.
            * Câu **(b) đúng** vì kiến trúc CISC thường được thiết kế để hỗ trợ nhiều ngôn ngữ lập trình cấp cao do CISC là bộ lệnh gồm rất nhiều lệnh, từ đơn giản đến phức tạp.
            * Câu **( c ) sai** vì điều đó là không chắc chắn, RISC thường có hiệu suất cao hơn (do RISC là bộ lệnh chỉ gồm các lệnh đơn giản) trong một số trường hợp nhất định do cấu trúc đơn giản và tối ưu.
            * Câu **(d) đúng** vì một trong những lợi ích chính của kiến trúc CISC là sự tương thích với nhiều phần mềm và hệ điều hành có sẵn đã được phát triển cho kiến trúc x86 (Intel) và AMD. 
        :::
* **Câu 13** *(2 điểm)* : Đơn vị biểu diễn dữ liệu **bit** là từ viết tắt của:
    a. binary integer
    b. bitcoin
    ==c. **b**inary dig**it**==
    d. basic unit of information technology
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu **(a), (b), (d) sai**.
            * Câu **( c ) đúng**.
        :::
* **Câu 14** *(2 điểm)* : Hiểu rõ về Hợp ngữ giúp lập trình viên có thể:
    a. lập trình ra các chương trình thực thi nhanh hơn đáng kể và ít chiếm dụng bộ nhớ.
    ==b. dễ dàng đưa ra được thuật toán giải quyết vấn đề và dễ dàng khắc phục được các lỗi phần mềm.==
    c. viết ra các chương trình ngắt và các trình thường trú để xử lý sâu trên các biến cố hardware / software.
    d. nắm rõ cách giao tiếp với OS, CPU, và BIOS, từ đó có thể lập trình tốt hơn trong các xử lý sâu.
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Câu **(a) đúng** vì hợp ngữ có thể giúp tối ưu hóa mã máy giúp chương trình thực thi nhanh hơn đáng kể và ít chiếm dụng bộ nhớ.
            * Câu **(b) sai** vì việc hiểu rõ về Hợp ngữ có thể giúp trong quá trình tối ưu hóa và debug, nhưng không đồng nghĩa với việc dễ dàng đưa ra thuật toán hoặc khắc phục lỗi (việc này phụ thuộc vào lập trình viên).
            * Câu **( c ) đúng** vì việc hiểu rõ về Hợp ngữ giúp lập trình viên có khả năng xử lý sâu trên cấp độ thấp, bao gồm việc viết các chương trình xử lý ngắt và các trình thường trú để tương tác với hardware và software.
            * Câu **(d) đúng** vì việc hiểu rõ về Hợp ngữ giúp lập trình viên hiểu cách tương tác với hệ điều hành (OS), bộ xử lý (CPU) và Basic Input/Output System (BIOS), từ đó có thể lập trình hiệu quả hơn trong các xử lý sâu.
        :::
* **Câu 15** *(2 điểm)* : Lệnh mã máy sẽ có các đặc điểm:
    a. là loại lệnh duy nhất mà máy tính hiểu.
    b. kích thước có thể biến động nếu kiến trúc processor là CISC.
    ==c. luôn có các bit đầu chứa operands.==
    d. phần opcode sẽ quyết định mạch xử lý tương ứng nào trong processor hoạt động.
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu **(a) đúng** vì nó là ngôn ngữ duy nhất mà bộ vi xử lý có thể hiểu.
            * Câu **(b) đúng** vì trong kiến trúc CISC (Complex Instruction Set Computing), kích thước của các lệnh có thể biến động và không cố định, phụ thuộc vào loại lệnh cụ thể.
            * Câu **( c ) sai** vì các lệnh có thể chứa operands trong các phần khác nhau của lệnh, không nhất thiết là các bit đầu.
            * Câu **(d) đúng** vì phần opcode (Operation Code) trong một lệnh máy sẽ xác định loại hoạt động hoặc thao tác nào sẽ được thực hiện bởi bộ xử lý.
        :::
### II. PHẦN TỰ LUẬN
:::info
:warning: **PHẦN TỰ LUẬN NGẮN**
* Trả lời ngắn (khoảng 3 dòng) sao cho đầy đủ ý câu hỏi.
:::
* **Câu 16** *(3 điểm)* : Phần cứng của một hệ thông máy tính đa dụng bao gồm 03 thành phần nào ?
    * **Đáp án tham khảo**
        :::spoiler
        * **Phần cứng** của một **hệ thống máy tính đa dụng** phải bao gồm **3 thành phần chính**:
            * Hệ thống **xử lý** *(Processing (CPU))*
            * Hệ thống **lưu trữ** *(Memory / Storage)*
            * Hệ thống **nhập / xuất** *(I/O Devices)*
        :::
* **Câu 17** *(3 điểm)* : CPU có phải là sự kết hợp của CU và PU không ? Nêu nhiệm vụ chính của CU ?
    * **Đáp án tham khảo**
        :::spoiler
        * **CPU** không phải là sự kết hợp của **CU** và **PU** mà là sự kết hợp của **ALU** và **CU**.
        * **Nhiệm vụ chính của CU *(Control System / Central Controller):*** đọc và phiên dịch (decodes - giải mã) những lệnh chỉ thị của chương trình, sau đó sẽ chuyển chúng thành tín hiệu điều khiển (control signals) để những tín hiệu này sẽ hoạt hóa các thành phần máy tính khác.
        :::
* **Câu 18** *(3 điểm)* : Sắp xếp theo thứ tự tốc độ truy xuất tăng dần của các thiết bị: RAM, HDD, SSD, Register, Cache. Cho biết một số thông tin cụ thể của các SSD phổ dụng những năm gần đây.
    * **Đáp án tham khảo**
        :::spoiler
        * Thứ tự về tốc độ truy xuất tăng dần của các thiết bị trên là: HDD < SSD < RAM < Cache < Register.
        * Một số thông tin cụ thể của các SSD phổ dụng trong những năm gần đây:
            * Giới thiệu chung về ổ cứng SSD: SSD (tên viết tắt của **Solid State Drive**) là thiết bị lưu trữ thể rắn. Đây là thiết bị lưu trữ thể rắn sử dụng các cụm mạch tích hợp để lưu trữ dữ liệu liên tục, thường sử dụng bộ nhớ flash và hoạt động như bộ nhớ thứ cấp trong hệ thống lưu trữ máy tính. Cũng như HDD, SSD cũng là loại bộ nhớ không thay đổi nhưng với tốc độ đọc ghi, xử lý dữ liệu nhanh hơn và hiệu suất cao hơn. SSD sử dụng các bộ nhớ bán dẫn như SRAM, DRAM hay FLASH để lưu trữ thay vì cơ học như HDD truyền thống.
            * Tốc độ ổ cứng SSD: Ổ cứng SSD có tốc độ truy xuất rất nhanh. Máy tính, laptop khởi động chỉ khoảng **10 giây** nếu được trang bị một ổ SSD. Với bộ nhớ, SSD có 2 loại, một là sử dụng bộ nhớ **flash NAND SLC** (Single level Cell) chứa 1 bit dữ liệu trên mỗi ô nhớ và một là **flash NAND MLC** (Multi-level Cell) chứa 2 bit hoặc nhiều hơn trên mỗi ô nhớ.**Flash SLC** có độ bền cao hơn, tốc độ truy xuất nhanh hơn so với **flash MLC**. **Flash SLC** thường được sử dụng trong SSD cao cấp và **flash MLC** sử dụng trong dòng phổ thông. Bên cạnh đó, các ổ cứng SSD được hỗ trợ **công nghệ** **TRIM**. Đây là công nghệ cải thiện tốc độ của các tác vụ ghi dữ liệu hiện tại chỉ có trên các ổ SSD, giúp ngăn ngừa sự suy giảm tốc độ đọc sau một thời gian sử dụng.Tốc độ truy xuất dữ liệu SSD đạt mức cao nhất có thể là **550MB/giây**; hiệu suất đọc ngẫu nhiên khoảng 80.000/65.000 lượt (4KB) dữ liệu vào/ra mỗi giây (IOPS).
            * Các chuẩn SSD phổ biến hiện nay:
                | Ổ cứng SSD (tên)          | Chuẩn giao tiếp | Tốc độ ghi        | Đặc điểm                                          |
                | ------------------------- | --------------- | ----------------- | ------------------------------------------------- |
                | SSD SATA 3                | SATA            | SATA III 600 Mb/s | Tương thích tốt với laptop, máy tính nhiều thế hệ |
                | SSD 2.5 SATA              | SATA            | SATA III 500 Mb/s | Nâng cấp SSD từ ổ đĩa HDD cũ một cách dễ dàng     |
                | SSD mSATA                 | mSATA           | SATA III 550 Mb/s | Cổng giao tiếp nhỏ, mini SATA                     |
                | SSD M2 SATA               | M2 SATA         | SATA III 550 Mb/s | Phù hợp cho những laptop mỏng, nhẹ                |
                | SSD M2 PCle (SSD M2 NVME) | M2 SATA         | PCle 3500 Mb/s    | Tốc độ nhanh và mạnh mẽ nhất hiện nay             |
        :::
* **Câu 19** *(3 điểm)* : Sắp xếp theo thứ tự số lượng tăng dần các thiết bị trong một hệ thống máy tính: chip, cổng logic, mạch logic, switch, transistor. Cho biết mối quan hệ giữa chúng.
    * **Đáp án tham khảo**
        :::spoiler
        * Thứ tự số lượng tăng dần các thiết bị trong một hệ thống máy tính: chip < cổng logic < mạch logic < switch < transistor.
        * Mối quan hệ giữa các thiết bị trên:
            -   Trong thiết kế vi mạch, mỗi switch thường được triển khai bằng cách sử dụng transistor. Transistor hoạt động như một công tắc điều khiển dòng điện, cho phép hoặc ngăn chặn dòng điện chạy qua mạch.
            -   Mạch logic được xây dựng từ nhiều switch (transistor), và từ đó có thể tạo ra các chức năng logic phức tạp.
            -   Các cổng logic là một cấp độ cao hơn trong phân cấp, được tạo thành từ các mạch logic để thực hiện các chức năng logic cơ bản như AND, OR, NOT.
            -   Cuối cùng, cấp độ cao nhất là mỗi chip xử lý hoặc chip nhớ, được thiết kế và kết hợp từ rất nhiều mạch logic và cổng logic để thực hiện các chức năng phức tạp hơn.
            <center>
                <img src = https://scontent.xx.fbcdn.net/v/t1.15752-9/410646009_245073808608209_8550469483892566352_n.png?stp=dst-png_p403x403&_nc_cat=107&ccb=1-7&_nc_sid=510075&_nc_ohc=RP26FaqLqtwAX_H4C72&_nc_ad=z-m&_nc_cid=0&_nc_ht=scontent.xx&oh=03_AdTcp7l4kfs4bTImoi0gFv97HcQuMLsFUoEnBlC9cq37xA&oe=65B2646B>
            </center>
        :::
* **Câu 20** *(3 điểm)* : Liệt kê 03 nội dung quan trọng trong **ROM** ?
    * **Đáp án tham khảo**
        :::spoiler
        * **Cấu trúc ROM** được chia thành 2 phần cơ bản là: Cổng OR và bộ giải mã. Tuy nhiên, ROM trong máy tính lại có cấu trúc phức tạp hơn với 3 phần gồm: Bộ giải mã địa chỉ, bộ nhớ đệm đầu ra và máng thanh phi. Cụ thể:
            -   **Bộ giải mã địa chỉ**: Gồm bộ giải mã hàng và bộ giải mã cột với vai trò quyết định thanh ghi nào được phép đặt từ dữ liệu 8 byte của nó vào đường truyền.
            -   **Bộ đệm đầu ra**: Thành phần này sử dụng mạch đệm 3 trạng thái, quyết định mức độ dữ liệu cao hay thấp để từ đó đưa những dữ liệu này vào đường truyền.
            -   **Máng thanh ghi**: Bộ phận này là nơi lưu trữ dữ liệu đã được lập trình sẵn vào ROM và có sự sắp xếp theo ma trận vuông. Người dùng không thể lưu trữ thêm bất cứ dữ liệu nào vào những thanh ghi này.
        * **Chương trình khởi động (Bootstrap Loader):**
            -   Trong ROM, có một phần quan trọng được gọi là chương trình khởi động, hay bootstrap loader. Chức năng của nó là khởi động hệ thống khi nguồn điện được kích hoạt. Chương trình này giúp máy tính hoặc thiết bị bắt đầu quá trình khởi động và tải hệ điều hành vào bộ nhớ chính.
        * **Hệ điều hành (Operating System):**
            -   Một số loại ROM chứa hệ điều hành, đặc biệt là trong các thiết bị nhúng hoặc những thiết bị không yêu cầu cài đặt hệ điều hành từ bên ngoài. Hệ điều hành trong ROM giúp quản lý tài nguyên hệ thống, quản lý bộ nhớ và cung cấp giao diện để tương tác với người dùng.
        * **Dữ liệu cố định (Firmware):**
            -   Trong nhiều trường hợp, ROM chứa firmware, là phần mềm được lưu trữ cố định trên thiết bị và thường không thay đổi theo thời gian. Firmware có thể chứa các hướng dẫn và quy tắc hoạt động cho các thành phần phần cứng cụ thể của thiết bị, như BIOS trong máy tính hay firmware của các thiết bị như máy ảnh kỹ thuật số, điều khiển từ xa, hoặc thiết bị lưu trữ.
        :::
* **Câu 21** *(3 điểm)* : Tốc độ USB4 gen 4 tối đa là 120 Gbps. Như vậy trong một phút sẽ truyền nhận được bao nhiêu Byte ? Bao nhiêu GiB ?
    * **Đáp án tham khảo**
        :::spoiler
        * Tốc độ v = 120 Gbps
        * Thời gian t = 1 min = 60s
            $\Rightarrow$ Dung lượng của USB4 gen 4 trong một phút truyền được là : d = 120 Gbps x 60s = 7200 Gb = 7200 x $10^9$ = 72 x $10^{11}$ b
            Mà 1 Byte = 8 bits 
            $\Rightarrow$ d = 9 x $10^{11}$ Bytes
            $\Rightarrow$ d_1 = $\frac{9.10^{11}}{2^{30}}$ $\approx838,19$ GiB (GibiBytes)
    
        Vậy trong một phút, tốc độ truyền nhận được $9.10^{11}$ Bytes và $838,19$ GiB 
        :::
:::warning
:bulb: Gọi **A** là số ứng với **2 chữ số cuối cùng trong Mã SV** của bạn và **B = -A - 300**, **C = B / 100**
(ví dụ nếu mã SV là **22345678** thì **A = 78** và **B = -78 - 300 = -378d**, **C = -378 / 100 = -3.78d**)

:bulb: **Gợi ý** này áp dụng cho các câu **22** và **23**.
:::
* **Câu 22** *(3 điểm)* : Nếu lưu số nguyên B bằng 4 byte dạng quá 22C4h Little - Edian thì nội dung thập lục phân của mỗi byte ra sao ? Lý giải.
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * MSSV của em là 22127322
            $\to$ A = 22d
            $\to$ B = -22 - 300 = -322d
            $\to$ C = -322 / 100 = -3.22d
        * Vì số nguyên B là số âm nên ta chọn N = 322d = 00000142h và K = 22C4h 
            $\Rightarrow$ Số quá K là: K - N = 00002182h
            Mà theo đề bài yêu cầu thì số nguyên B phải được lưu dưới dạng Little Edian nên ta có số nguyên B quá 22C4h là : 82210000h
            | Offset 1 | Offset 2 | Offset 3 | Offset 4 |
            | -------- | -------- | -------- | -------- |
            | 82       | 21       | 00       | 00       |
        :::
* **Câu 23** *(3 điểm)* : Xác định dãy bit của biểu diễn số thực C dạng chấm động IEEE chính xác đơn.
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * Vì số nguyên C = -3.22d là số âm nên ta có bit_sign = 1
        * Ta cần đổi 3.22 sang dạng (1.$f_1$ $f_2$ ... $f_{23}$) * $2^E$ tức là cần 24 bits cho phần định trị (mantissa) - mà $3_d$ $(= 11_b)$ đã chiếm 2 bits nên ta nhân thêm $2^{22}$:
            3.22 = 3.22 * $\frac{2^{22}}{2^{22}}$ = 3.22 * 4194304 * $2^{-22}$ = 13505659 * $2^{-22}$ = $00CE147B_h$ * $2^{-22}$ = $1100'1110'0001'0100'0111'1011_b$ * $2^{-22}$ = $1.100'1110'0001'0100'0111'1011_b$ * $2^{23}$ * $2^{-22}$ = $1.100'1110'0001'0100'0111'1011_b$ * $2^1$
            Số mũ E = 1 nên 8 bits tương ứng với phần Exponent là : $E + 127 = 128_d$ = $10000000_b$
            Vậy dãy 32 - bit tương ứng sẽ là: $1100'0000'0100'1110'0001'0100'0111'1011_b$ = $C04E147B_h$
        :::
:::warning
:bulb: Xét **dãy byte lưu chuỗi mã SV** của bạn **(8 ký tự)** ở dạng **UTF16**. Giả định trật tự byte là **Little Endian**.

:bulb: **Gợi ý** này áp dụng cho các câu **24** và **25**.
:::
* **Câu 24** *(3 điểm)* : Xác định giá trị thập phân của số nguyên 2 byte dạng bù 2 tại offset 2 (có lý giải).
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * Xét dãy byte lưu chuỗi mã SV = 22127322 là : 
            32 00 32 00 31 00 32 00 37 00 33 00 32 00 32 00
        * Tại offset 2 của dãy byte trên, 2 byte có giá trị là $00 32_h$ = $0000'0000'0011'0010_b$ (vì các số nguyên được lưu trữ có thứ tự ngược theo byte)
            Sau đó ta sẽ chuyển dãy bit trên qua dạng bù 2 tức là: 
        $(1111'1111'1111'1111_b - 0000'0000'0011'0010_b) + 0000'0000'0000'0001_b$
        $= 1111'1111'1100'1101_b + 0000'0000'0000'0001_b$
        $= 1111'1111'1100'1110_b = 65486_d$ 
        Vậy giá trị thập phân của số nguyên 2 bytes dạng bù 2 tại offset 2 là $65486_d$
        :::
* **Câu 25** *(3 điểm)* : Xác định giá trị tại offset C của số thực 04 byte (dạng chấm động IEEE - có lý giải).
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * Xét dãy byte lưu chuỗi mã SV = 22127322 là : 
            32 00 32 00 31 00 32 00 37 00 33 00 32 00 32 00
        * Tại offset C của dãy byte trên, vì các con số được lưu trữ ngược theo byte nên dãy 4 byte tương ứng với dãy byte lưu chuỗi mã SV là $00 32 00 32_b =$ **++0++==000'0000'0==011'0010'0000'0000'0011'0010$_b$**
        * Ở chuẩn IEEE, giá trị thực R được biểu diễn dưới dạng: $R = (-1)^S * (1.f_1 f_2 ... f_n) * 2^E$ = $(-1)^S * (1 + f_1 * 2^{-1} + ... + f_n * 2^{-n}) * 2^E$
        * Với dãy bit đã cho, ta có:
            * S (bit dấu hay còn gọi là bit cao nhất) = 0 $\to$ số thực này là số dương
            * E = $0000'0000_b$ - 127 = 0 - 127 = $-127_d$
            * M = $1.011'0010'0000'0000'0011'0010_b$ = $1.011'0010'0000'0000'0011'001_b$
            * Ta có: $R = (-1)^S * (1.f_1 f_2 ... f_n) * 2^E$
                $\Rightarrow$ $R = (-1)^0 * (1.011'0010'0000'0000'0011'001_b) * (10_b)^{-127}$
                $\Rightarrow$ $R = (1011'0010'0000'0000'0011'001_b) * (10_b)^{-149}$
                $\Rightarrow$ $R = 5832729_d * 2^{-149} = 8,173394191 * 10^{-39}$
        :::
:::info
:warning: **PHẦN TỰ LUẬN DÀI**
* Trả lời dài (khoảng 30 dòng) sao cho đầy đủ ý câu hỏi.
:::
* **Câu 26** *(20 điểm)* : Thiết kế một mạch tính m = 2n + P(n), trong đó n là số nguyên không dấu 5 bit và P(n) = 1 khi số bit 1 của n là số lẻ, P(n) = 0 khi số bit 1 của n là số chẵn.
    * **Đáp án tham khảo**
        :::spoiler
        :::
* **Câu 27** *(20 điểm)*
    a. Viết đoạn lệnh Hợp ngữ nhập 2 số nguyên M, N (0 < M, N < 10) và xuất ra M dòng chữ "22CLC04" sau đó xuất tiếp N dòng "CSC10009" (tự do lựa chọn kiến trúc)
    * **Đáp án tham khảo**
        :::spoiler
        ```p=
        .Model Small
        .Stack 100h
        .Data
            ; Declare variables
            M dw ?
            N dw ?
            NewLine db 13, 10, "$"

        .Code
        Main proc
            ; Initialize data segment
            mov ax, @data
            mov ds, ax

            ; Input M and N
            mov ah, 01h ; Function code for input
            int 21h     ; Call interrupt 21h to input a character
            sub al, 30h ; Convert ASCII character to integer
            mov M, al   ; Store the value in M

            mov ah, 01h ; Function code for input
            int 21h     ; Call interrupt 21h to input a character
            sub al, 30h ; Convert ASCII character to integer
            mov N, al   ; Store the value in N

            ; Output "22CLC04" M times
            mov cx, M   ; Set loop counter to M
            mov si, offset NewLine ; Load the newline characters
        Print22CLC04:
            mov ah, 09h ; Function code for output string
            lea dx, msg22CLC04 ; Load offset of the string to be printed
            int 21h     ; Call interrupt 21h to output the string
            int 21h     ; Output newline characters
            loop Print22CLC04 ; Loop M times

            ; Output "CSC10009" N times
            mov cx, N   ; Set loop counter to N
            mov si, offset NewLine ; Load the newline characters
        PrintCSC10009:
            mov ah, 09h ; Function code for output string
            lea dx, msgCSC10009 ; Load offset of the string to be printed
            int 21h     ; Call interrupt 21h to output the string
            int 21h     ; Output newline characters
            loop PrintCSC10009 ; Loop N times

            ; Terminate program
            mov ah, 4Ch ; Function code for program termination
            int 21h     ; Call interrupt 21h to terminate the program

        Main endp

            ; Declare strings
        msg22CLC04 db '22CLC04$'
        msgCSC10009 db 'CSC10009$'

            ; other procs
        End Main
        ```
        :::
    b. Viết lại đoạn mã giả sau bằng lệnh Hợp ngữ tương ứng:
    ```p=
    AH = BX
    CX = DL
    if (AL < 22CL + C4)
        Xuất số nguyên không dấu trong CL
    ```
    * **Đáp án tham khảo**
        :::spoiler
        ```p=
        .Model Small
        .Stack 100h
        .Data
            ; Declare variables
            AL db ?
            BX dw ?
            DL db ?
            CL dw ?
        .Code
        Main proc
            ; Initialize data segment
            mov ax, @data
            mov ds, ax

            ; Assign values to registers
            mov ah, BX   ; AH = BX
            mov cx, DL   ; CX = DL

            ; Compare AL with "22CL + C4"
            mov al, CL   ; Load AL with CL
            add al, '2'  ; Add ASCII value of '2' to AL
            add al, '2'  ; Add ASCII value of '2' to AL
            add al, 'C'  ; Add ASCII value of 'C' to AL
            add al, 'L'  ; Add ASCII value of 'L' to AL
            add al, 'C'  ; Add ASCII value of 'C' to AL
            add al, '4'  ; Add ASCII value of '4' to AL

            ; Compare AL with 22CL + C4
            cmp AL, '9'  ; Compare with ASCII '9'
            jbe LessThan9 ; Jump if AL is less than or equal to '9'

            ; If AL is greater than '9', output AL as an unsigned integer
            mov ah, 09h  ; Function code for output string
            lea dx, [AL] ; Load offset of AL as a string
            int 21h      ; Call interrupt 21h to output the string
            jmp EndProg  ; Jump to the end of the program

        LessThan9:
            ; If AL is less than or equal to '9', output AL as a character
            mov ah, 02h  ; Function code for output character
            mov dl, AL   ; Load DL with AL
            int 21h      ; Call interrupt 21h to output the character

        EndProg:
            ; Terminate program
            mov ah, 4Ch  ; Function code for program termination
            int 21h      ; Call interrupt 21h to terminate the program

        Main endp

            ; other procs
        End Main
        ```
        :::
        
--- 

## :100: ĐỀ KHÓA HK3_CLC_21CLC 2021-2022

### I. PHẦN TRẮC NGHIỆM

:::info
:warning: **PHẦN TRẮC NGHIỆM** 
- Chọn phát biểu **++KHÔNG CÙNG TÍNH ĐÚNG SAI++** với các phát biểu còn lại.
:::

* **Câu 01** *(1 điểm)* Máy tính (computer) là:
    a. máy được dùng vào việc tính toán, có khả năng tính toán rất nhanh và chính xác. (Sai)
    b. thiết bị điện tử không thể tự hoạt động độc lập được, phải kết hợp nhiều thiết bị lại thành một hệ thống máy tính (computer system) thì mới có thể hoạt động. (Sai)
    ==c. máy hoặc thiết bị thực hiện các xử lý, tính toán, và hoạt động dựa trên các lệnh từ chương trình. (Đúng)==
    d. hệ thống thiết bị được thiết kế để thực thi nhiều ứng dụng khác nhau dựa trên sự kết hợp các thành phần phần cứng và phần mềm. (Sai)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu (a) sai vì computer không phải chỉ được dùng vào việc tính toán.
            * Câu (b) sai vì máy tính là thiết bị hay máy có thể có khả năng độc lập được và vân có thể hoạt động.
            * Câu ( c ) đúng 
            * Câu (d) sai vì đây là khái niệm của computer system.
        :::
* **Câu 02** *(1 điểm)*
    a. Về mặt phần cứng, hệ thống máy tính (computer system) là sự kết hợp của nhiều computer chuyên biệt, trong đó có thể bao gồm các computer như màn hình, máy in, thẻ nhớ,… (Đúng)
    ==b. Computer system muốn hoạt động được thì phải có hardware (phần cứng), OS (hệ điều hành), các phần mềm ứng dụng và các dữ liệu của người dùng. (Sai)==
    c. Hardware, software và cả các firmware nhúng trong thiết bị sẽ cấu thành nên computer system. (Đúng)
    d. Xét tổng quát thì computer system sẽ bao gồm hardware, software và humanware. (Đúng)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Câu (a) đúng 
            * Câu (b) sai vì không nhất thiết phải cần dữ liệu từ người dùng.
            * Câu (c), (d) đúng.
        :::
* **Câu 03** *(1 điểm)* 
    a. Transistor giống như công tắc điện tử (switch) có thể bật /tắt dòng điện và nhờ đó có thể tạo ra các mạch số, trong một con chip nhỏ hiện nay có thể chứa nhiều tỷ Transistor. (Đúng)
    b. Kể từ khi Switch được thay thế từ bóng đèn chân không sang Transistor, sức mạnh của Computer ngày càng tăng trong khi giá thành và kích thước lại ngày càng giảm (Đúng)
    ==c. Số lượng Transistor trên mỗi đơn vị inch vuông sẽ tăng lên gấp đôi hoặc hơn sau mỗi năm. (Sai)== 
    d. Transistor là 1 loại linh kiện bán dẫn (semiconductor) có thể làm chủ yếu bằng Silicon và nhờ đó có chi phí nguyên liệu thấp, chế tạo tg đối đơn giản, phạm vi nhđộ làm việc rộng, có thể thu nhỏ kích thước đến nm. (Đúng)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Câu (a) đúng vì transistor thực sự giống như một công tắc điện tử có thể bật và tắt dòng điện, và chúng được sử dụng để tạo ra các mạch số trong các vi mạch điện tử. Chip hiện nay có thể chứa hàng tỷ transistor.
            * Câu (b) đúng vì sự thay thế của bóng đèn chân không bằng transistor đã đóng góp đáng kể vào sự tăng cường sức mạnh của máy tính. Sức mạnh của máy tính tăng lên, giá thành và kích thước giảm xuống, điều này phản ánh sự tiến bộ trong công nghệ điện tử.
            * Câu (c) sai vì tuyên bố này không chính xác. Theo đúng nguyên tắc của "Định luật Moore," được đề xuất bởi Gordon Moore, số lượng transistor trên một đơn vị diện tích (đơn vị inch vuông) trên một vi mạch tích hợp thường tăng gấp đôi mỗi 18 đến 24 tháng, không phải sau mỗi năm.
            * Câu (d) đúng vì transistor là một loại linh kiện bán dẫn được làm chủ yếu bằng Silicon, có chi phí nguyên liệu thấp, chế tạo tương đối đơn giản, và chúng cho phép thu nhỏ kích thước đến mức nano. Điều này đã đóng góp vào sự phát triển và minh bạch của công nghệ điện tử hiện đại.
        :::
* **Câu 04** *(1 điểm)* : Các thanh ghi (Registers)
    a. chứa các thông tin /dữ liệu tạm thời phục vụ cho hoạt động ở thời điểm hiện tại của CPU. (Đúng)
    b. có tốc độ truy xuất nhanh hơn nhiều so với RAM. (Đúng)
    ==c. chỉ tồn tại trong CPU, các chip xử lý khác không có. (Sai)==
    d. bao gồm 2 loại: lập trình được và không lập trình được. (Đúng)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Giống phần trên
        :::
* **Câu 05** *(1 điểm)* : ISA mô tả
    a. Mô hình bộ nhớ trong (Đúng)
    ==b. Mô hình bộ nhớ ngoài (Sai)==
    c. Địa chỉ dữ liệu, các kiểu toán hạng, thanh ghi. (Đúng)
    d. Các chế độ, kiểu và định dạng lệnh. (Đúng)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Giống phần trên
        :::
* **Câu 06** *(1 điểm)* : Mạch đếm chương trình (Program Counter) trong CPU
    a. Dùng để đếm số chương trình đang chạy. (sai)
    b. Là mạch phục vụ cho tác vụ tăng hoặc giảm 1 đơn vị trên một dữ liệu. (sai)
    ==c. Dùng để lưu địa chỉ lệnh kế tiếp. (đúng)==
    d. Dùng để kết nối tới biến đếm của vòng lặp trong chương trình. (sai)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Giống phần trên
        :::
* **Câu 07** *(1 điểm)* : Số nguyên có dấu biểu diễn ở dạng nhị phân nào sau đây sẽ thuận tiện cho việc cộng, trừ:
    | a. Bù 1 (Sai) | ==b. Bù 2== (Đúng) | c. Quá K (Sai) | d. Dấu – lượng (Sai) | 
    | ------------- | ------------------ | -------------- | -------------------- |
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Số bù 2 ra đời khi người ta gặp vấn đề với hai phương pháp dấu lượng và bù 1, đó là:
                * Có hai cách biểu diễn cho số 0 (+0 và -0) à không đồng nhất
                * Bit nhớ phát sinh sau khi đã thực hiện phép tính phải được cộng tiếp vào kết quả $\to$ dễ gây nhầm lẫn
                $\Rightarrow$ Phương pháp số bù 2 khắc phục hoàn toàn 2 vấn đề đó
            * Nhận xét:
                * Số bù 2 $\to$ lưu trữ số có dấu và các phép tính của chúng trên máy tính (thường dùng nhất)
                    * Không cần thuật toán đặc biệt nào cho các phép tính cộng và tính trừ
                    * Giúp phát hiện dễ dàng các trường hợp bị tràn.
                * Dấu lượng / Số bù 1 $\to$ dùng các thuật toán phức tạp và bất lợi vì luôn có hai cách biểu diễn của số 0 (+0 và -0).
                * Dấu lượng $\to$ phép nhân của số có dấu chấm động
                * Số thừa K $\to$ dùng cho số mũ của các số có dấu chấm động
        :::
* **Câu 08** *(1 điểm)* : Để con người có thể giao tiếp với MT, các thiết bị nhập xuất chuẩn xưa nay sử dụng ngôn ngữ:
    | a. nói (Sai) | ==b. viết== (Đúng) | c. cử chỉ (Sai) | d. máy (Sai) |
    | ------------ | ------------------ | --------------- | ------------ |
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Câu (b) đúng vì các thiết bị nhập xuất thường sử dụng ngôn ngữ viết để tương tác với máy tính. Ví dụ, bàn phím được sử dụng để nhập liệu thông qua việc gõ chữ và số, trong khi màn hình hiển thị (monitor) hiển thị thông tin dưới dạng văn bản. Các thiết bị này giúp người dùng truyền đạt thông tin và lấy thông tin từ máy tính bằng cách sử dụng ngôn ngữ viết.
        :::
* **Câu 09** *(1 điểm)* : Các thiết bị IoT là:
    ==a. các computer có khả năng kết nối qua Internet và có định danh (Id) riêng biệt. (Đúng)==
    b. các thiết bị có liên quan đến chất I ốt và trí tuệ. (Sai)
    c. các thiết bị liên quan đến Internet có khả năng suy nghĩ, và IoT là từ viết tắt của “Internet of Think”. (Sai)
    d. các thiết bị mỏng nhẹ có hỗ trợ Internet, và IoT là từ viết tắt của “Internet of Thin”. (Sai)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer A**==
        * **Explanation**
            * Câu (a) đúng
            * Câu (b) sai
            * Câu (c) sai
            * Câu (d) sai
        :::
* **Câu 10** *(1 điểm)* : Chương trình trong máy tính được thực hiện theo cơ chế:
    a. Các lệnh của chúng được nạp từ bộ nhớ ngoài vào Cache trong CPU, sau đó CPU thực hiện từng lệnh một. (Sai)
    b. Một số lệnh được nạp từ bộ nhớ ngoài vào RAM rồi CPU lấy chúng đem vào Cache và thực hiện từng nh một, quá trình này cứ thế tiếp diễn cho đến khi chương trình chạy xong. (Sai)
    ==c. Toàn bộ các lệnh được nạp từ bộ nhớ ngoài vào RAM, sau đó CPU lấy từng lệnh trên RAM đem vào CPU (hoặc đem 1 số lệnh vào Cache) và thực hiện từng lệnh một. (Đúng)==
    d. Một số lệnh được nạp từ bộ nhớ ngoài vào Cache, sau đó CPU lấy từng lệnh và thực hiện, hết Cache thì lại nạp các lệnh kế tiếp từ bộ nhớ ngoài vào và CPU lại chạy từng lệnh cho đến khi xong lệnh cuối cùng a chương trình. (Sai)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Trong cơ chế thực hiện chương trình trên máy tính, thường xuyên toàn bộ chương trình sẽ được nạp từ bộ nhớ ngoài (như ổ đĩa cứng) vào bộ nhớ chính (RAM).
            * CPU sau đó lấy từng lệnh từ RAM và thực hiện chúng một cách tuần tự.
            * Một số lệnh có thể được đưa vào bộ đệm (Cache) để giảm thời gian truy cập đến bộ nhớ chính, nhưng chúng vẫn được lấy từ RAM.
            * Quá trình thực hiện từng lệnh một tiếp tục cho đến khi chương trình chạy xong.
        :::
* **Câu 11** *(1 điểm)* 
    a. Mỗi bộ xử lý có một tập lệnh xác định, nhưng nhiều OS khác nhau có thể chạy được trên đó.
    b. Mỗi lệnh của tập lệnh là một chuỗi bit mà bộ xử lý hiểu được, dùng để thực hiện một thao tác x.định. 
    c. Tập lệnh của CPU thường chỉ chứa vài chục đến vài trăm lệnh.
    ==d. Tập lệnh của CPU nằm trong firmware và có thể được upgrade (nâng cấp) qua internet khi cần thiết.==
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer D**==
        * **Explanation
            * Giống phía trên.
        :::
* **Câu 12** *(1 điểm)* : Mạch CLC (combinational logic circuit - mạch tổ hợp) không thể:
    a. Có nhiều đường ra. (Sai)
    ==b. Có vòng lặp (tín hiệu ra ở 1 cổng sau khi qua các cổng khác lại là tín hiệu vào của cổng ban đầu) (Đúng)==
    c. Chỉ dùng toàn cổng NAND (Sai)
    d. Kết nối với Register. (Sai)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer B**==
        * **Explanation**
            * Giống phần trên
        :::
* **Câu 13** *(1 điểm)*
    a. Interrupt (Ngắt) là một cơ chế cực kỳ quan trọng, nhờ nó mà máy tính thông minh và OS có thể điều phối để máy chạy được nhiều chương trình cùng lúc. (Sai)
    b. Các chương trình xử lý ngắt cơ bản được lưu trong ROM và sẽ được nạp vào RAM khi bật máy, sau đó OS có thể nạp thêm một số ngắt bổ sung.
    c. Ngắt cứng là tín hiệu ngắt phát sinh từ phần cứng, CPU sẽ tạm dừng chương trình đang chạy để chuyển qua chạy chương trình điều khiển tương ứng với tín hiệu ngắt cứng đó.
    ==d. Ngắt mềm là tín hiệu ngắt phát sinh từ một phần mềm hệ thống, CPU sẽ tạm dừng phần mềm đang chạy chuyển qua chạy phần mềm hệ thống đó, sau khoảng thời gian nhất định CPU sẽ quay lại chạy phần mềm ban đầu.==
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer D**==
        * **Explantion**
            * Câu (a) sai vì interrupt (Ngắt) là một cơ chế quan trọng giúp máy tính xử lý nhiều công việc cùng một lúc, nhưng không phải là để máy tính "thông minh" hoặc để hệ điều hành có thể điều phối để máy chạy nhiều chương trình cùng lúc. Điều này thường liên quan đến khả năng xử lý đa nhiệm của máy tính và quản lý tài nguyên.
            * Câu (b) sai vì các chương trình xử lý ngắt không được lưu trong ROM mà thường được cài đặt trong hệ điều hành hoặc trong các trình điều khiển thiết bị. Chúng không được nạp vào RAM khi bật máy.
            * Câu (c) sai 
            * Câu (d) đúng
        :::
* **Câu 14** *(1 điểm)* : RISC có
    a. số lượng lệnh ít (chỉ vài chục) và khó lập trình, chương trình chiếm ít bộ nhớ hơn CISC.
    b. tập thanh ghi lớn nhưng cấu trúc CPU đơn giản, thời gian thực hiện mỗi lệnh là 01 xung nhịp.
    ==c. số lượng khuôn dạng lệnh ít (<=4) và có ít mode địa chỉ (<=4), CISC thì ngược lại==
    d. một thể hiện cụ thể là MIPS.
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Giống phần trên
        :::
* **Câu 15** *(1 điểm)* : Kiến trúc CISC của Intel (với bộ lệnh x86) vẫn sử dụng nhiều trên các máy PC, laptop vì:
    a. Vấn đề tương thích, phần mềm có sẵn đang rất nhiều. (đúng)
    b. Dễ xây dựng trình dịch (compiler) hơn. (đúng)
    c. Phù hợp với nhiều ngôn ngữ lập trình cấp cao. (đúng)
    ==d. Chương trình sẽ chạy nhanh hơn hẳn so với RISC (sai)==
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer D**==
        * **Explanation**
            * Giống phần trên
        :::
* **Câu 16** *(1 điểm)*
    a. Mỗi chip xử lý cũng như chip nhớ đều được thiết kế và kết hợp từ rất nhiều mạch logic 
    b. Mạch logic được cấu thành bởi nhiều cổng logic
    c. Cổng logic được cấu thành bởi nhiều switch 
    ==d. Switch được cấu thành bởi rất nhiều transistor==
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer D**==
        * **Explanation**
            * Trong thiết kế vi mạch, mỗi switch thường được triển khai bằng cách sử dụng transistor. Transistor hoạt động như một công tắc điều khiển dòng điện, cho phép hoặc ngăn chặn dòng điện chạy qua mạch.
            * Mạch logic được xây dựng từ nhiều switch (transistor), và từ đó có thể tạo ra các chức năng logic phức tạp.
            * Các cổng logic là một cấp độ cao hơn trong phân cấp, được tạo thành từ các mạch logic để thực hiện các chức năng logic cơ bản như AND, OR, NOT.
            * Cuối cùng, cấp độ cao nhất là mỗi chip xử lý hoặc chip nhớ, được thiết kế và kết hợp từ rất nhiều mạch logic và cổng logic để thực hiện các chức năng phức tạp hơn.
        :::
* **Câu 17** *(1 điểm)* : Đơn vị biểu diễn dữ liệu bit là từ viết tắt của:
    a. binary integer technology
    b. bitcoin 
    ==c. **b**inary dig**it**==
    d. basic unit of information
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Giống phần trên
        :::
* **Câu 18** *(1 điểm)* : Kích thước của kiểu **word** :
    ==a. luôn là 02 byte. (Sai)==
    b. được quy ước cố định bới CPU nếu là word cứng. (đúng)
    c. không cố định mà tùy thuộc vào từng phần mềm trong (01) máy tính nếu là word mềm.(đúng)
    d. có thể khác biệt giữa word cứng và word mềm.(đúng)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer A**==
        * **Explanation**
            * Câu (a) sai vì tùy theo hệ điều hành của một máy tính thì ta sẽ có kích thước kiểu **word** khác nhau:
                * Ví dụ: các máy 80386, 80486, Pentium I, II, III, IV đều dùng CPU 32bit – tức word truy xuất bởi phần cứng có kích thước 4 byte. Nhưng trên các máy này thì ngôn ngữ lập trình C chạy trên hệ điều hành MS DOS (ví dụ Borland C 3.1 for DOS) có word là 2 byte, còn ngôn ngữ lập trình C chạy trên hệ điều hành Windows (ví dụ Borland C 3.1 for Windows) thì word lại là 4 byte.
        :::
* **Câu 19** *(1 điểm)* : Hiểu biết về Hợp ngữ giúp lập trình viên:
    a. Nắm rõ cách các chương trình giao tiếp với OS, CPU và BIOS; từ đó có thể lập trình tốt hơn trong các xử lý sâu. (đúng)
    b. Có thể lập trình ra các chương trình thực thi nhanh hơn đáng kể và ít chiếm dụng bộ nhớ.(đúng)
    ==c. Có thể nhanh chóng đưa ra được th.toán gi/quyết vấn đề và dễ dàng khắc phục được các lỗi phần mềm. (sai)== 
    d. Có thể viết ra các ch.trình ngắt và các trình thường trú để xử lý sâu trên các biến cố hardware /software (đúng)
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer C**==
        * **Explanation**
            * Giống như phần trên.
        :::
* **Câu 20** *(1 điểm)* 
    a. Mỗi bộ xử lý có một tập lệnh xác định, nhưng nhiều Hệ điều hành khác nhau có thể chạy được trên đó. 
    b. Mỗi lệnh của tập lệnh là một chuỗi bit mà bộ xử lý hiểu được, dùng để thực hiện một thao tác xác định.
    c. Tập lệnh của CPU thường chỉ chứa vài chục đến vài trăm lệnh.
    ==d. Tập lệnh của CPU nằm trong firmware và có thể được upgrade (nâng cấp) qua internet khi cần thiết.==
    * **Đáp án tham khảo**
        :::spoiler
        * ==**Answer D**==
        * **Explanation**
            * Giống phần trên.
        :::
### II. PHẦN TỰ LUẬN
:::info
:warning: **PHẦN TỰ LUẬN NGẮN**
* Trả lời ngắn (khoảng 3 dòng) sao cho đầy đủ ý câu hỏi.
:::

* **Câu 21** *(1 điểm)* : Nếu số thành phần chính trong phần cứng của 1 HTMT đa dụng là 03, thì chúng là gì?
    * **Đáp án tham khảo**
        :::spoiler
        * Số thành phần chính trong phần cứng của 1 HTMT đa dụng bao gồm 03 thành phần:
            * Hệ thống xử lý (Processing (CPU))
            * Hệ thống lưu trữ (Memory / Storage)
            * Hệ thống nhập xuất (I/O Devices)
        :::
* **Câu 22** *(1 điểm)* : Nếu số thành phần chính trong KTMT của 1 computer là 03, thì chúng là gì?
    * **Đáp án tham khảo**
        :::spoiler
        * Số thành phần chính trong KTMT của 1 computer là
            * Hardware : Phần cứng
            * Software : Phần mềm
            * Humanware : Phần ứng dụng cho con người
        :::
* **Câu 23** *(1 điểm)* : Số lượng và khả năng của ALU trong GPU so với CPU như thế nào?
    * **Đáp án tham khảo**
        :::spoiler
        * Về số lượng ALU trong GPU so với CPU:
            * GPU ALUs : GPU thường có số lượng ALU cao hơn đáng kể so với CPU. Chúng có thể có hàng trăm đến hàng nghìn ALU, tùy thuộc vào mẫu GPU cụ thể.
            * CPU ALUs: CPU thường có ít ALU hơn, thường dao động từ vài đến chục hoặc hơn, tùy thuộc vào kiến trúc CPU.
        * Về khả năng của ALU trong GPU so với CPU:
            * Chức năng:
                * ALU trong GPU được thiết kế chủ yếu để xử lý song song và các tác vụ liên quan đến đồ họa như kết xuất, tạo bóng và các phép toán phức tạp được sử dụng trong đồ họa và tính toán khoa học.
                * ALU trong CPU có tính tổng quát hơn và xử lý nhiều tác vụ khác nhau, bao gồm các phép toán logic và số học có mục đích chung, quản lý hệ thống và chạy các ứng dụng.
            * Hiệu suất:
                * ALU trong GPU được tối ưu hóa để có thông lượng cao và xử lý song song. Chúng vượt trội trong việc xử lý đồng thời lượng lớn dữ liệu và rất phù hợp cho các tác vụ như kết xuất 3D và học máy.
                * ALU trong CPU được thiết kế cho mục đích điện toán đa năng và có thể bao gồm các tính năng như thực thi không theo thứ tự và dự đoán nhánh, khiến chúng trở nên linh hoạt nhưng thường chậm hơn đối với các tác vụ song song lớn.
            * Kích thước: 
                * Các ALU riêng lẻ trong GPU thường nhỏ hơn và đơn giản hơn các ALU trong CPU. Điều này cho phép mật độ ALU cao hơn trên chip GPU.
                * Các ALU trong CPU thường phức tạp hơn và có thể bao gồm các tính năng bổ sung, làm cho chúng lớn hơn trên cơ sở mỗi ALU so với ALU GPU.
            * Mức tiêu thụ điện năng:
                * Do số lượng lớn và tốc độ xử lý cao, ALU trong GPU có thể tiêu thụ một lượng điện năng đáng kể, đặc biệt là khi xử lý khối lượng công việc tính toán hoặc đồ họa nặng.
                * ALU trong CPU được thiết kế để tiết kiệm năng lượng cho các tác vụ thông thường và được tối ưu hóa để tiêu thụ điện năng thấp hơn trong môi trường di động và máy tính để bàn.
            * Tính xử lý song song:
                * GPU là bộ xử lý song song cao và ALU của chúng được thiết kế để hoạt động đồng thời trên nhiều thành phần dữ liệu, khiến chúng phù hợp cho các tác vụ song song dữ liệu.
                * GPU là bộ xử lý song song cao và ALU của chúng được thiết kế để hoạt động đồng thời trên nhiều thành phần dữ liệu, khiến chúng phù hợp cho các tác vụ song song dữ liệu.
        :::
* **Câu 24** *(1 điểm)* : Sắp xếp theo thứ tự tốc độ truy xuất tăng dần các thiết bị: Register, Cache. RAM, SSD, HDD.
    * **Đáp án tham khảo**
        :::spoiler
        * Thứ tự về tốc độ truy xuất tăng dần của các thiết bị trên là: HDD < SSD < RAM < Cache < Register.
        :::
* **Câu 25** *(1 điểm)* : Nêu 02 khác biệt lớn nhất giữa mạch tuần tự và mạch tổ hợp.
    * **Đáp án tham khảo**
        :::spoiler
        * 02 điểm khác biệt lớn nhất giữa mạch tuần tự (SLC) và mạch tổ hợp (CLC):
            * Điểm khác biệt thứ nhất:
                *  Mạch tổ hợp không mang tính ghi nhớ (ngõ ra chỉ phụ thuộc vào ngõ hiện tại, không xét đến những giá trị trong quá khứ).
                *  Trong khi đó, mạch tuần tự lại có khả năng "ghi nhớ các trạng thái trong quá khứ" (ngõ ra không chỉ phụ thuộc vào giá trị hiện thời của ngõ vào, mà còn phụ thuộc vào giá trị quá khứ)
            * Điểm khác biệt thứ hai:
                * Trong mạch tuần tự, thông tin được xử lý theo thứ tự, từng bước một. Mỗi bước xử lý tiếp theo đều phụ thuộc vào kết quả của bước trước đó. Do đó mạch tuần tự thường có thời gian phản ứng chậm hơn và có thể gặp nhiều khó khăn trong việc đáp ứng nhanh chóng với sự thay đổi đột ngột. 
                * Trái ngược với mạch tuần tự, mạch tổ hợp xử lý thông tin mà không cần lưu trữ trạng thái nội tại. Mọi thay đổi đầu vào đều ngay lập tức ảnh hưởng đến đẩu ra. Điều này làm cho mạch tổ hợp có thời gian phản ứng nhanh và thời gian trễ thấp hơn so với mạch tuần tự. 
        :::
* **Câu 26** *(1 điểm)* : Nêu 02 khác biệt lớn nhất giữa RISC và CISC.
    * **Đáp án tham khảo**
        :::spoiler
        * 02 điểm khác biệt lớn nhất giữa RISC và CISC là
            * Điểm khác biệt thứ nhất: Bộ chỉ thị (Instruction Set)
                * CISC: **:** CISC sử dụng bộ chỉ thị phong phú với nhiều lệnh phức tạp thực hiện nhiều công việc trong một lệnh duy nhất. Các lệnh CISC có thể có độ dài biến đổi và thường chứa nhiều tác vụ khác nhau. Điều này làm cho mỗi lệnh CISC mạnh mẽ hơn, nhưng cũng có thể dẫn đến tốn kém và không hiệu quả hóa việc xử lý.
                * RISC: RISC sử dụng bộ chỉ thị đơn giản và giảm thiểu số lượng loại lệnh có sẵn. Mỗi lệnh thường chỉ thực hiện một công việc cơ bản, và các lệnh này thường có độ dài cố định. Điều này giúp tăng tốc độ xử lý và làm cho việc thiết kế và điều khiển bộ xử lý trở nên hiệu quả.
            * Điểm khác biệt thứ hai: Kiến trúc bộ nhớ
                * CISC: CISC có thể sử dụng nhiều chế độ truy cập bộ nhớ và thường có lệnh trực tiếp để truy cập bộ nhớ. CISC thường hỗ trợ các chế độ truy cập bộ nhớ phức tạp hơn và có thể chứa các lệnh dành cho việc truy cập bộ nhớ một cách linh hoạt.
                * RISC: Trong RISC, các lệnh thường sử dụng bộ nhớ và thanh ghi gần như theo cách nhau, và chúng được thiết kế để tương tác trực tiếp với thanh ghi. RISC thường có mô hình truy cập bộ nhớ đồng nhất.
        :::
* **Câu 27** *(1 điểm)* : Mạch nào nào nhanh nhất / chậm nhất trong các mạch: cộng, dịch, mã hóa ? Lý giải ?
    * **Đáp án tham khảo**
        :::spoiler
        * Mạch Dịch là mạch nhanh nhất vì mạch dịch không qua cổng logic nào chỉ đơn giản việc nối dây nên mạch này nhanh nhất.
            <center>
                <img src = https://scontent.fsgn2-6.fna.fbcdn.net/v/t1.15752-9/410676721_1028174188468670_7761657787600765612_n.png?_nc_cat=110&ccb=1-7&_nc_sid=8cd0a2&_nc_ohc=izbBqlZNCKYAX-QozAd&_nc_ht=scontent.fsgn2-6.fna&oh=03_AdQL3ydxrlW5JVr3ZSBTDWb_E1rh52znxj850vqmfMIjNg&oe=65B389B5>
            </center>
        * Mạch Cộng là mạch chậm nhất vì mạch này đi qua cổng FA (Full Adder) nhiều nhất nên tốc độ và thời gian truyền là chậm nhất.
            <center>
                <img src = https://scontent.fsgn2-11.fna.fbcdn.net/v/t1.15752-9/412681015_874578594345971_6037987682127561345_n.png?_nc_cat=105&ccb=1-7&_nc_sid=8cd0a2&_nc_ohc=qipmwmq103MAX-eM_6T&_nc_ht=scontent.fsgn2-11.fna&oh=03_AdSQsSIt7oiHOO5_KhVn66XH7aTcHZff7ZrQ4r-aMs-Acw&oe=65B38C16>
            </center>
        :::
* **Câu 28** *(1 điểm)* : Sắp xếp tăng dần: **1 Mb < 1000 KB = 1 MB < 1000 KiB = 1024 KB < 1024 KiB = 1 MiB**
    * **Đáp án tham khảo**
        :::spoiler
        * **1 Mb < 1000 KB = 1 MB < 1000 KiB = 1024 KB < 1024 KiB = 1 MiB**
        :::
* **Câu 29** *(1 điểm)* : Nêu 02 khác biệt lớn nhất giữa Hợp ngữ và ngôn ngữ cấp cao.
    * **Đáp án tham khảo**
        :::spoiler
        * 02 khác biệt lớn nhất giữa hợp ngữ và ngôn ngữ cấp cao:
            * Điểm khác biệt thứ nhất:
                * Hợp ngữ: là một loại ngôn ngữ phụ thuộc vào máy.
                * Ngôn ngữ cấp cao: là loại ngôn ngữ độc lập với máy.
            * Điểm khác biệt thứ hai:
                * Hợp ngữ: rất gần với ngôn ngữ máy, điều này có nghĩa là nó có thể khá khó hiểu và khó đọc, đặc biệt là đối với người mới học lập trình. Mã hợp ngữ yêu cầu kiến thức chi tiết về kiến trúc máy tính và các lệnh máy.
                * Ngôn ngữ cấp cao: ược thiết kế để dễ đọc và dễ hiểu hơn. Cấu trúc của chúng thường phản ánh logic và cấu trúc của vấn đề lập trình mà không cần quá nhiều chi tiết về phần cứng. Điều này giúp giảm độ phức tạp và tăng tính tương tác của người lập trình.
        :::
* **Câu 30** *(1 điểm)* : Nêu 02 khác biệt lớn nhất giữa MT lượng tử và MT truyền thống.
    * **Đáp án tham khảo**
        :::spoiler
        * 02 điểm khác biệt lớn nhất giữa máy tính lượng tử và máy tính truyền thống là:
            * Điểm khác biệt thứ nhất: cách biểu diễn thông tin
                * Máy tính lượng tử: Sử dụng các qubit để biểu diễn thông tin. Các qubit có trạng thái superposition, tức có thể đồng thời mang các giá trị 0 và 1. Cung cấp sức mạng tính toán lớn hơn.
                * Máy tính truyền thống: Sử dụng hệ thống nhị phân để biễu diễn thông tin dưới dạng các bit 0 và 1.
            * Điểm khác biệt thứ hai: thao tác và lưu trữ thông tin
                * Máy tính lượng tử: Thông tin được xử lý bằng cách sử dụng các cổng lượng tử như cổng Hadamard, cổng CNOT, cổng Toffoli, … Ngoài ra, việc lưu trữ thông tin trong Quantum Computer rất khó khăn, do sự phân tán và mất mát thông tin trong quá trình xử lý.
                * Máy tính truyền thống: Thông tin được xử lý dưới dạng các phép toán logic cơ bản, thực hiện trên các bit.
        :::
:::warning
:bulb: Gọi **N** là số ứng với **4 chữ số cuối cùng trong Mã SV** của bạn và **M = -N - 1000**, **P = -N / 1000**
(ví dụ mã SV là **19123456** thì **N = 3456** và **M = – 3456 – 1000 = – 4456**, **P = –3456/1000 = –3.456**)

:bulb: **Gợi ý** này áp dụng cho các câu từ **31** đến **34**.
:::
* **Câu 31** *(2 điểm)* : Nếu lưu số nguyên N bằng 1 byte (8 bits) dạng bù 1 thì nội dung byte đó ntn? Lý giải.
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * MSSV của em là $22127322_d$
            $\to$ $N = 7322_d = 0001'1100'1001'1010_b$
            $\to$ $M = -7322 - 1000 = -8322_d$
            $\to$ $P = -7322 / 1000 = -7.322_d$
        * Vì N là số dương nên biểu diễn 1 byte (8 bits) dạng bù một của N cũng giống như biểu diễn 8 bits dạng bù 1 của số nguyên không dấu
            $\Rightarrow$ Giá trị được lưu số nguyên N bằng 1 byte (8 bits) dạng bù 1 thì nội dung byte đó là: $1001'1010_b = 9A_h$
        :::
* **Câu 32** (3 điểm): Nếu lưu số nguyên M bằng 2 byte (16 bits) dạng bù 2 LE thì nội dung từng byte ra sao?
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * Ta có: $M = -8322_d$
        * Số nguyên $-8322_d$ được biểu diễn bằng 2 bytes ở dạng không dấu là: $8332_d = 0010'0000'1000'0010_b$
        * Vì giá trị của $-8322_d$ là số âm nên biểu diễn 2 bytes (16 bits) dạng bù 1 của $-8322_d$ được xác định bangwf cách đảo ngược các bit của biểu diễn 2 bytes dạng không dấu số $8322_d$
            $Rightarrow$ Dạng bù 1 của $-8322_d$ là : $1101'1111'0111'1101_b$
        * Suy ra dạng bù 2 của $-8322_d$ được xác định bằng cách lấy biểu diễn 2 bytes dạng bù 1 của $-8322_d$ cộng thêm 1, ta được:
            $\Rightarrow$ $1101'1111'0111'1101_b + 1 = 1101'1111'0111'1110_b = DF7E_h$
            Mà M được lưu dưới dạng LE nên dãy byte cuối cùng là : $7EDF_h$
        :::
* **Câu 33** *(3 điểm)*: Nếu lưu số nguyên M bằng 3 byte theo dạng quá 12345 BE thì từng byte ra sao?
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * Ta có : $M = -8322_d$
        * Dạng quá $12345_d$: ta phải biểu diễn giá trị $(12345_d + (-8322_d))$ theo dạng không dấu 3 bytes (24 bits), do $-8322_d + 12345_d = 4023_d = 000FB7_h$ nên biểu diễn 3 bytes của số nguyên M theo dạng 12345 BE là: $000FB7_h$
        :::
* **Câu 34** *(3 điểm)*: Nếu lưu số thực P bằng 4 byte theo dạng IEEE thì 32bit (dạng hex) ra sao?
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * Ta có: $P = -7322 / 1000 = -7.322_d$
        * Ở chuẩn IEEE, giá trị thực R được biểu diễn dưới dạng: $R = (-1)^S * (1.f_1 f_2 ... f_n) * 2^E$ = $(-1)^S * (1 + f_1 * 2^{-1} + ... + f_n * 2^{-n}) * 2^E$
        * Vì số thực P là số âm nên bit dấu (sign_bit - 1 bit) của số thực P là: S = 1.
        * Ta cần đổi $7.322_d$ sang dạng $(1.f_1 f_2 ... f_n) * 2^E$, tức cần 24 bits cho phần định trị (mantissa) - mà $7_d$ ($= 111_b$) đã chiếm 3 bits nên ta nhân thêm  $2^{21}$, ta có:
            $7.322_d = 7.322_d * \frac{2^{21}}{2^{21}} = 7.322_d * 2097152_d * 2^{-21} = 15355347_d * 2^{-21}$
            $= EA4DD3_h * 2^{-21} = 1110'1010'0100'1101'1101'0011_b * 2^{-21}$
            $= 1.110'1010'0100'1101'1101'0011_b * 2^{-21} * 2^{23}$
            $= 1.110'1010'0100'1101'1101'0011_b * 2^2$
        $\Rightarrow$ Số mũ E = 2 nên 8 bits tương ứng với phần mũ là: $E + 127 = 2 + 127 = 129_d = 10000001_b$
        * Vậy dãy 32 bits tương ứng sẽ là: 
        **1**==10000001==++110'1010'0100'1101'1101'0011++$_b = C0EA4DD3_h$
        :::
:::warning
:bulb: Xét **dãy byte lưu chuỗi 8 ký tự UTF16** ứng với **mã SV** của bạn. Giả định trật tự byte là **LE** 
(vd mã SV là **19123456** thì dãy byte la: 31, 00, 39, 00, ... 36, 00)

:bulb: **Gợi ý** này áp dụng cho các câu từ **35** đến **38**.
::: 
* **Câu 35** *(3 điểm)*: Xác định giá trị thập phân của số nguyên 01 byte dạng quá 2 tại offset 3
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * MSSV của em là $22127322_d$ nên dãy byte lưu chuỗi 8 ký tự UTF16 ứng với Mã SV là:
            32 00 32 00 31 00 32 00 37 00 33 00 32 00 32 00
        * Tại offset 3 của dãy byte trên, giá trị của offset là $00_h = 0_d$
        * Dạng quá 2: ta biểu diễn giá trị $(2_d + 0_d)$ theo dạng không dấu 8 bit, do $0_d + 2_d = 2_d$ nên biểu diễn 8 bit dạng quá 2 của $0_d$ là $2_d$.
        :::
* **Câu 36** *(3 điểm)*: Xác định giá trị thập phân của số nguyên 02 byte dạng bù 2 tại offset 2.
    * **Đáp án tham khảo**
        :::spoiler
        * MSSV của em là $22127322_d$ nên dãy byte lưu chuỗi 8 ký tự UTF16 ứng với Mã SV là:
            32 00 32 00 31 00 32 00 37 00 33 00 32 00 32 00
        * Vì con số được lưu trữ ngược theo byte nên tại offset 2 của dãy byte trên, giá trị tương ứng với 2 bytes là: $00 32_h = 0000'0000'0011'0010_b = 50_d$
        * Dạng bù 2 tại offset 2: vì giá trị $50_d$ là số dương nên biểu diễn 16_bits dạng bù 2 của $50_d$ cũng giống như biểu diễn dạng 16_bits dạng không dấu: $50_d$
        :::
* **Câu 37** *(3 điểm)*: Xác định giá trị thập phân của số thực 04 byte tại offset 4 (dạng IEEE chấm động - có lý giải)
    * **Đáp án tham khảo**
        :::spoiler
        :::success
        * MSSV của em là $22127322_d$ nên dãy byte lưu chuỗi 8 ký tự UTF16 ứng với Mã SV là:
            32 00 32 00 31 00 32 00 37 00 33 00 32 00 32 00
        * Vì con số được lưu trữ ngược theo byte nên tại offset 4 của dãy byte trên, giá trị dạng 4 bytes tại offset 4 là: 
            $00 31 00 32_h =$ **0**++000'0000'0++==011'0001'0000'0000'0011'0010==$_b$
        * * Ở chuẩn IEEE, giá trị thực R được biểu diễn dưới dạng: $R = (-1)^S * (1.f_1 f_2 ... f_n) * 2^E$ = $(-1)^S * (1 + f_1 * 2^{-1} + ... + f_n * 2^{-n}) * 2^E$ 
        * Với bits trên, ta có:
            * S (bit dấu) = 0 $\to$ đây là số dương
            * E (exponent) = $0000'0000_b - 127_d = 0_d - 127_d = -127_d$
            * M $= 1.01100010000000000110010_b = 1.0110001000000000011001_b$
            $\Rightarrow R = (-1)^S * (1.f_1 f_2 ... f_n) * 2^E$
            $= (-1)^0 * 1.0110001000000000011001_b * (10_b)^{-127}$
            $= 10110001000000000011001_b * (10_b)^{-149}$
            $= 5799961_d * 2^{-149} = 8,127476442 * 10^{-39}$
        Vậy $R = 8,127476442 * 10^{-39}$
        :::
:::info
:warning: **PHẦN TỰ LUẬN DÀI**
* Trả lời dài (khoảng 30 dòng) sao cho đầy đủ ý câu hỏi.
:::
* **Câu 38** *(20 điểm)*: Xét bảng chân trị:

    <center>
        <img src = https://scontent.fsgn2-10.fna.fbcdn.net/v/t1.15752-9/412704037_228101597000210_8778862918418910267_n.png?_nc_cat=109&ccb=1-7&_nc_sid=8cd0a2&_nc_aid=0&_nc_ohc=rOVS1bN72lIAX8amXkj&_nc_ht=scontent.fsgn2-10.fna&oh=03_AdSALBIFTRFgivplduD2TAIfXOCH4UNn4qh-czDyMZ2bfQ&oe=65B35580>
    </center>
    
    1. Xác định phương trình biểu diễn F1, F2 theo dạng chuẩn tắc
        * **Đáp án tham khảo**
            :::spoiler
            :::success
            * Từ bảng chân trị trên, ta có phương trình hàm Boole dạng chuẩn tắc biểu diễn $F_1$ và $F_2$ là:
                * Phương trình Boole chuẩn tắc biểu diễn $F_1$ là:
                    $\overline{F_1} = A.\overline{B}.\overline{C} + A.B.\overline{C}$
                    $\Rightarrow F_1 = \overline{A.\overline{B}.\overline{C} + A.B.\overline{C}}$ 
                * Phương trình Boole chuẩn tắc biểu diễn $F_2$ là:
                    $F_2 = \overline{A}.\overline{B}.\overline{C} + \overline{A}.B.\overline{C} + A.\overline{B}.C + A.B.C$
            :::
    2. Rút gọn phương trình tính F2 theo hướng tối thiểu hóa số phép tính
        * **Đáp án tham khảo**
            :::spoiler
            :::success
            $F_2 = \overline{A}.\overline{B}.\overline{C} + \overline{A}.B.\overline{C} + A.\overline{B}.C + A.B.C$
            $F_2 = \overline{B}.(\overline{A}.\overline{C} + A.C) + B.(\overline{A}.\overline{C} + A.C)$
            $F_2 = (\overline{A}.\overline{C} + A.C).(\overline{B} + B)$
            $F_2 = \overline{A}.\overline{C} + A.C$
            $\Rightarrow$ Phương trình logic của $F_2$ là: $F_2 = A$ **XNOR** $C$
            :::
    3. Viết lại phương trình tính F1 từ 04 tín hiệu vào A, B, C, F2
        * **Đáp án tham khảo**
            :::spoiler
            :::success
            $\overline{F_1} = A.\overline{B}.\overline{C}.\overline{F_2} + A.B.\overline{C}.\overline{F_2}$
            $\Rightarrow F_1 = \overline{A.\overline{B}.\overline{C}.\overline{F_2} + A.B.\overline{C}.\overline{F_2}}$
            :::
    4. Vẽ 01 mạch logic xác định F1 & F2 từ 03 tín hiệu vào A, B, C trên tinh thần tiết kiệm cổng.
        * **Đáp án tham khảo**
            :::spoiler
            :::success
            Ta có:
            * $F_1 = \overline{A.\overline{B}.\overline{C} + A.B.\overline{C}} \Rightarrow F_1 = \overline{A} + C \to$ **NOT** $A$ **OR** $C$
            * $F_2 = \overline{A}.\overline{C} + A.C \to A$ **XNOR** $C$
            Vẽ mạch logic xác định F1 & F2 từ 03 tín hiệu vào A, B, C trên
            <center>
                <img src = https://scontent.fsgn2-7.fna.fbcdn.net/v/t1.15752-9/409650228_3582889955308894_1067485948459257307_n.png?_nc_cat=108&ccb=1-7&_nc_sid=8cd0a2&_nc_ohc=i4Xala1l54QAX9jw9Ua&_nc_ht=scontent.fsgn2-7.fna&oh=03_AdToFUeGuZMmsc2x_c0ymfxKAniDXpJ26BNW9iGWUrD7KA&oe=65B3B934>
            </center>
            :::
    
* **Câu 39** *(20 điểm)* 
    a. Viết đoạn lệnh Hợp ngữ xuất 2021 lần chuỗi “ASM” (tự do lựa chọn kiến trúc)
    * **Đáp án tham khảo**
        :::spoiler
        ```p=
        .Model Small
        .Stack 100h
        .Data
            Count dw 2021
            Message db 'ASM$'

        .Code
        Main proc
            ; Initialize data segment
            mov ax, @data
            mov ds, ax

            ; Initialize loop counter
            mov cx, Count

        PrintASM:
            ; Output the string "ASM"
            mov ah, 09h         ; Function code for output string
            lea dx, Message     ; Load offset of the string to be printed
            int 21h             ; Call interrupt 21h to output the string

            ; Output newline characters
            mov ah, 02h         ; Function code for output character
            mov dl, 13          ; ASCII code for carriage return
            int 21h             ; Output carriage return
            mov dl, 10          ; ASCII code for line feed
            int 21h             ; Output line feed

            ; Decrement loop counter
            dec cx

            ; Continue loop if counter is not zero
            jnz PrintASM

            ; Terminate program
            mov ah, 4Ch         ; Function code for program termination
            int 21h             ; Call interrupt 21h to terminate the program

        Main endp

        End Main
        ```
        :::
    b. Viết lại đoạn mã giả sau bằng đoạn lệnh Hợp ngữ tương ứng:
    ```p=
    DX = CX - BL * AH
    while (DX > 1234)
        DX = DX – CL
    if (DX là số chẵn)
        Xuất số nguyên không dấu trong DL
    ```
    * **Đáp án tham khảo**
        :::spoiler
        ```p=
        .Model Small
        .Stack 100h
        .Data
            CX dw ?
            BL db ?
            AH db ?
            CL db ?
        .Code
        Main proc
            ; Initialize data segment
            mov ax, @data
            mov ds, ax

            ; DX = CX - BL * AH
            movzx bx, bl    ; Zero-extend BL to BX
            movzx ax, ah    ; Zero-extend AH to AX
            imul bx, ax     ; Multiply BL by AH
            sub cx, bx      ; Subtract BL * AH from CX
            mov dx, cx      ; Copy result to DX

            ; Loop while DX > 1234
        WhileLoop:
            cmp dx, 1234    ; Compare DX with 1234
            jbe EndLoop     ; Jump to EndLoop if DX is less than or equal to 1234

            ; DX = DX - CL
            sub dx, cl      ; Subtract CL from DX
            jmp WhileLoop   ; Jump back to WhileLoop

        EndLoop:
            ; If DX is even, output unsigned integer in DL
            test dl, 1      ; Test the least significant bit of DL
            jnz NotEven      ; Jump to NotEven if DL is odd

            ; Output unsigned integer in DL
            mov ah, 09h     ; Function code for output string
            mov dl, dl      ; Move DL to AL for output
            add dl, '0'     ; Convert DL to ASCII
            int 21h         ; Call interrupt 21h to output the string

        NotEven:
            ; Terminate program
            mov ah, 4Ch     ; Function code for program termination
            int 21h         ; Call interrupt 21h to terminate the program

        Main endp

            ; other procs
        End Main
        ```
        :::