Thanh ghi nằm ở đầu trong máy tính

  • Hoạt động xử lý chủ yếu liên quan đến xử lý dữ liệu. Những dữ liệu này có thể được lưu trữ trong bộ nhớ và được truy cập từ đó. Tuy nhiên, việc đọc và lưu trữ dữ liệu vào bộ nhớ lại làm chậm tiến trình vì nó phải gửi yêu cầu dữ liệu thông qua bus điều khiển.
  • Để tăng tốc độ hoạt động xử lý, các bộ vi xử lý có chứa 1 vài bộ nhớ trong để lưu trữ gọi là thanh ghi. Số lượng giới hạn thanh ghi được xây dựng trong con chip vi xử lý.
  • Có 10 thanh ghi 32-bit và 6 thanh ghi 16-bit trong kiến trúc IA-32. Những thanh ghi này được nhóm thành 3 loại:

    1. Những thanh ghi đa năng (General registers)
    2. Những thanh ghi điều khiển (Control registers)
    3. Những thanh ghi phân đoạn (Segment registers)
  • Những thanh ghi đa năng lại được chia thành các nhóm:

    1. Thanh ghi dữ liêu
    2. Thanh ghi con trỏ
    3. Thanh ghi chỉ số (Index)
  • Có 4 thanh ghi dữ liệu 32-bit được dùng cho số học,logic,và hoạt động khác. Những thanh ghi này được dùng theo 3 cách.
    1. Ghi dữ liệu: EAX,EBX,ECX,EDX.
    2. Nửa thấp của các thanh ghi 32-bit có thể dùng như thanh ghi 16-bit: AX,BX,CX,DX và nó có thể dùng như thanh ghi 8-bit: AH,AL,BH,BL,CH,CL,DH,DL.

  • AX là bộ tích luỹ đầu tiên, nó được dùng trong nhập xuất và hầu hết các instruction số học. Ví dụ trong phép nhân, 1 toán hạng được lưu vào EAX hoặc AX hoặc AL tuỳ theo kích cỡ của toán hạng đó.
  • BX là thanh ghi cơ sở (base register) được dùng để đánh số địa chỉ
  • CX là thanh ghi đếm (count register) được dùng như để đếm số vòng lặp
  • DX là thanh ghi dữ liệu, nó cũng được sử dụng trong hoạt động nhập xuất tương tự như AX.
  • Những thanh ghi con trỏ 32-bit như EIP,ESP,EBP tương ứng 16-bit vị trí phải IP,SP,BP.
    1. Instruction Pointer (IP) - là những thanh ghi 16-bit lưu trữ địa chỉ offset của instruction tiếp theo để thực thi. IP cùng với thanh ghi CS đưa ra địa chỉ chính xác của instruction hiện tại trong code segment.
    2. Stack pointer (SP) - Những thanh ghi 16-bit cung cấp giá trị offset nằm trong ngăn xếp chương trình ( program stack). SP cùng với thanh ghi SS tham chiếu tới vị trí hiện tại của dữ liệu hoặc địa chỉ nằm trong program stack.
    3. Base Pointer (BP) - Những thanh ghi 16-bit BP chủ yếu hỗ trợ trong việc tham chiếu biến tham số truyền tới chương trình con. Địa chỉ trong thanh ghi SS kết hợp với với thanh ghi DI và SI cho địa chỉ cụ thể

Thanh ghi chỉ số

  • Những thanh ghi 32-bit ESI và EDI tương ứng thanh ghi 16-bit SI và DI được dùng để đánh số địa chỉ và đôi lúc dùng trong phép cộng và trừ.
    1. Source Index (SI) - được dùng đánh số của nguồn cho chuỗi operations.
    2. Destination Index (DI) - ngược lại với source

Thanh ghi con trỏ

  • Thanh ghi 32-bit con trỏ và 32-bit cờ (flags) kết hợp được coi là thanh ghi điểu khiển.
  • Nhiểu instructions so sánh, tính toán số học, thay đổi trạng thái của cờ, kiểm tra điều kiện giá trị trạng thái của cờ để có được dòng điểu khiển (control flow) đến vị trí khác.
  • Những bit flag thông thường là:
    1. Overflow Flag (OF) - nó cho thấy sự tràn bit cao ngoài cùng bên trái của dữ liệu sau 1 tín hiệu của thuật toán.
    2. Direction Flag (DF) - nó xác định hướng trái hay phải cho việc di chuyển hoặc so sánh chuỗi dữ liệu. Khi giá trị DF là 0, chuỗi hoạt động lấy từ trái qua phải và ngược lại khi DF là 1.
    3. Interrupt Flag (IF) - nó cho phép thiết lập hoạt động của bộ xử lý trong chế độ đơn bước (single-step mode). Chương trình Debug dùng thiết lập cờ mật thám (trap flag). Vì thế có thể từng bước thực thi tại 1 thời điểm.
    4. Sign Flag (SF) - nó show tín hiệu kết quả của 1 phép toán số học. Cớ này được thiết lập tuỳ theo dấu hiệu của data item theo sau phép toán số học. Dấu hiệu được chỉ thị bới bit cao ngoài cùng bên trái. Kết quả khẳng định thiết lập giá trị SF là 0 và ngược lại là 1.
    5. Zero Flag (ZF) - cho thấy kết quả phép toán số học hay so sánh. Kết quả không = 0 thì cờ thiết lập là 0 và kết quả = 0 thì cờ là 1.
    6. Auxiliary Carry Flag (AF) - nó chứa bit 3 tới bit 4 theo sau phép toán số học, dùng để chỉ rõ cụ thể phép toán.

Lâu không vào diễn đàn, hôm nay mình xin kể cho các bạn một câu chuyện cổ tích nhé

###NHÀ THÔNG THÁI KHÙNG###

Ngày xửa ngày xưa, có một nhà thông thái khá kì dị. Ông có những sở thích và mong muốn khác người: ví dụ như tìm các số nguyên tố lớn hơn 1 tỷ, tính toán giải phương trình có 1 triệu ẩn số, … Mà làm những việc này đòi hỏi một thời gian và công sức rất lớn. Vì thế, ông mới nghĩ làm sao tạo ra một cái máy có thể làm được những việc như thế, có thể chạy lâu lâu cũng được, còn mình thì làm việc # .

Thế là, 2 thằng bé CPU và DATA ra đời. CPU lúc đầu chỉ là một hệ thống vận hành cơ và Data chỉ là các tấm bìa đục lỗ. CPU sẽ thao tác trên tấm bìa đó, đục khoét, + lỗ, move lỗ. Lỗ tương trưng cho bit hiện nay, đục có nghĩa là 1 và không đục có nghĩa là 0.

###TUỔI THƠ ẤU###

CPU và DATA cứ thế làm việc rất vui vẻ và ăn ý cho nhà thông thái khùng kia. Nhưng 2 đứa dần lớn dần, CPU giờ sử dụng hệ thống điện tử với mô phỏng bit bằng các bóng đèn bật tắt, còn DATA đã chuyển sang dùng hệ thống từ. Tuy nhiên, cách làm việc thì vẫn như thời sơ khai cả, nghĩa là DATA đưa dữ liệu cho CPU đục lỗ và DATA sẽ lưu các đống lỗ này vào đĩa mềm. Các công việc của nhà thông thái thời kỳ này cũng tương đối đơn giản, nên cả 2 thằng đều cảm thấy không có vấn đề gì cả.

Thế rồi CPU ăn nhiều nên lớn nhanh hơn DATA, nó thấy DATA thật chậm chạp, trong khi nó cần dữ liệu để qwety thì nó mãi chẳng thấy đâu. Chà chà, bực rồi nghen. Mặc dù, DATA đã làm mọi cách cho tốc độ của mình nhanh lên, như chuyển từ đĩa mềm sang đĩa cứng … nhưng chỉ được 1 thời gian ăn ý, thằng CPU nó cứ làm quá nhanh.
(đây là thời kỳ của các app chạy trực tiếp trên đĩa mềm, không hệ điều hành, không RAM … như mấy cái máy bốn nút nhà mình ấy)

###SỰ XUẤT HIÊN CỦA DRAM###
DATA nghĩ mãi, nghĩ mãi không biết cách nào để có thể “giao thông” với CPU nhanh nhất, chứ thao tác chậm thế này nhỡ nó chán, nó bỏ tìm em # thì buồn lắm. Vậy là nó nghĩ ra một cách, dữ liệu thì vẫn phải lưu ở ổ cứng rồi, nhưng khi nào cần dữ liệu thì DATA sẽ lôi trong “sách” ra và viết trước lên “tay”. Khi đó, CPU cần thì DATA đưa luôn được, chẳng cần phải ngồi quay tay tìm trong hàng ngàn trang sách, rồi mới đưa cho CPU, như vậy chậm chết. Vậy là DRAM ra đời (gọi là DRAM Dynamic RAM vì nó sử dụng nạp/thải của tụ để lưu trữ 0,1. Do đó để đồng bộ làm việc với CPU, nó cần có clock để phối hợp với CPU).

Clock (đồng hồ đếm) giúp CPU và RAM làm việc đồng bộ với nhau khi đưa dữ liệu cho nhau xử lý. Khi clock đếm 1 cái thì RAM đưa ra và CPU làm việc. CPU thực chất cũng giống như lúc sơ khai, cũng chỉ làm một vài lệnh đơn giản như move, dịch bits, … (họ nói CPU thực hiện hàng triệu phép toán 1s là nói tới các lệnh đơn giản này mà thôi).

###HỆ ĐIỀU HÀNH###
Dần dà, nhà thông thái nọ ngày càng giao nhiều việc cho 2 anh em làm. CPU thì ngày càng làm được nhiều việc trong 1 s hơn, còn DATA thì mở rộng bộ nhớ RAM để lưu dữ liệu to hơn, dài hơn. Tuy nhiên, có 1 điều khiến 2 anh em buồn lòng là ông nhà thông thái này nhiều lúc giao việc giống nhau nhưng lời nói lại # nhau, đãn đến 2 anh em toàn hiểu nhầm và bị đòn oan.

Thế là 2 anh em quyết định thuê 1 cô giúp việc OS. Cô OS trẻ đẹp nên hiểu ý nhà thông thái rất nhanh, và truyền đạt lại theo cách mà 2 đứa trẻ thơ hiểu được (chứ ông kia toàn nói ngôn ngữ người lớn). Đây chính là thời kỳ các OS đơn nhiệm, làm nhiệm vụ như 1 tầng trung gian giao tiếp với app và CPU. OS cung cấp 1 service để gọi API thống nhất, ví dụ như bật nhạc, chỉ cần playMusic, chứ k cần playMusicWalkman và playMusicCreative.

Thời gian trôi qua, cô giúp việc này còn nhận giúp việc cho vài ông goá vợ # nữa. Vậy làm sao giải quyết được tình trạng tranh nhau dùng đây. OS sử dụng giải pháp “timeslice”, nghĩa là sẽ giúp cho mỗi ông vài phút thôi, xong lại chuyển sang ông khác, kể cả chưa xong thì cũng để đấy tý làm. Đây là thời kỳ của OS multitask.

OS mltitask có một con chó tên là WatchDog và một cô em gái Scheduler để xếp lịch cho các ông, không có ông nào được dùng quá nhiều. Nếu chây ỳ, cho con chó WatchDog ra kill luôn. Ngoài ra, em gái Scheduler cũng chỉ cấp cho mỗi ông một “phòng nghỉ” cụ thể, cần nhiều mới được cấp thêm.

Lại nói về CPU và Data, khi được giao task từ OS Multitask xuống, hai anh em giờ quay tay liên tục, lúc với dữ liệu của ông thông thái, lúc dữ liệu của bá tước Mongto, lúc dữ liệu của Huân tước Cutonhuphich, … 2 anh em chóng hết cả mặt khi cứ phải xoá, ghi dữ liệu vào “tay”. Công việc thì nhiều nên sai lệch lung tung.

###THỜI THANH NIÊN###
OS Mutltask ngoài khái niệm WatchDog, Scheduler và Service, thì còn khái niệm Virtual Memory. Chả là, mỗi ông đòi “1 phòng nghỉ”, nhưng lại phải phòng nghỉ thân quen. À, đơn giản, cho vào “Phòng nghỉ”, giường giống nhau, sơn giống nhau, ông nào cũng tưởng là phòng cũ nên yên tâm hành sự ^^.

OS Multitask cũng ngày ranh ma hơn, từ việc quản lý ít phòng nhỏ (16 bit = 2^16) chuyển sang nhiều phòng (32 bit = 2^32) vẫn nhoay nhoáy (RAM được tổ chức theo hình thức đánh địa chỉ, ví dụ ô nhớ 255 sẽ được đánh là FF, giống như chúng ta oánh số nhà vậy. Mặc dù các ô nhớ giống nhau, nhưng để truy cập kiểu Random Access thì buộc phải đánh địa chỉ. Thực ra thì virtual memory cũng được đánh địa chỉ, chỉ là ông nào cũng tưởng địa chỉ của mình là 00 mặc dù địa chỉ thật là FF)

Lại nói về 2 anh em, càng lớn CPU qwety càng nhanh, 1 clock nó làm được cả ngàn cái lệnh trong khi DATA lại chỉ mới đưa được 1 clock. Lúc này SDRAM ra đời (synchronous) giúp cho việc “giao thông” trơn tru hơn, tất nhiên, không thể bằng vài GHz của CPU nhưng luôn là bội số của clock, ví dụ 133Mhz. giúp CPU chạy ở clock tối ưu.

###SRAM###
Càng ngày bản danh sách khách hàng của OS Multitask càng nhiều khiến cho DATA xoay xở không kịp cung cấp cho CPU. Chỉ riêng cái việc nạp lên / nạp xuống dữ liệu khi OS chuyển khách hàng (trong cái timeslice) khiến DATA bị overload. Dạo này CPU lại còn mọc thêm tay, thêm chân nên tốc độ ngày càng khiếp (multicore), đồng thời cũng học thêm được nhiều lệnh mới mẻ hơn (ví dụ lệnh cache, jump …).

CPU nghĩ mãi nghĩ mãi và cuối cùng nghĩ ra 1 cách, ghi trước dữ liệu lên ngón tay mình, vừa nhanh, vừa hiệu quả , gì chứ mình nhiều tay thế này, ngón tay đa số. Đây là lúc SRAM ra đời và được tích hợp trực tiếp vào CPU dưới dạng cache L1, cache L2, cache L3, cache L4. Khi cần load/save, CPU save trước vào cache, rồi mới lấy dữ liệu từ RAM chuyển vào. Khi hết timeslice, nó lại đọc từ cache cái data đã save ra mà không cần nhờ tới RAM nữa.

Vậy tại sao lại cần nhiều tầng cache vây? Vì SRAM sử dụng transitor lưu trữ 0,1 nên chi phí đắt, mỗi loại lại có mức đắt # nhau nên không thể làm to và dài như DRAM được. Khi hết cacheL1, nó phải save xuống L2, rồi L3, rồi L4, … Khi cần, CPU sẽ search từng tầng này để tìm dữ liệu cần (gọi là cache hit / miss). Ngoài ra, sau khi xử lý dữ liệu xong thành 1 dữ liệu mới, CPU cũng phải save vào đâu đó, nếu save vào cache thì gọi là cơ chế Load Store Architecture (để phân biệt với cơ chế Register Memory Architecture là save vào RAM khi thực hiện xong).

Ngoài ra, SRAM được tổ chức thành nhiều thanh ghi (cũng được đánh địa chỉ) vì CPU thực hiện lệnh với mỗi dữ liệu khác nhau, ví dụ như lệnh cộng với số nguyên bao giờ cũng nhanh hơn cộng với số thực. Thế nên, để tăng tốc cho phép cộng số thực thì thanh ghi chuyên cho số thực phải có tốc độ nhả dữ liệu nhanh hơn nhiều lần so với số nguyên. Ngoài ra, các CPU thế hệ mới 64 bits còn được thiết kế chạy đa luồng, luồng 1 xử lý số nguyên, luồng 2 xử lý số thực và thao tác trên các thanh ghi tương ứng. Trong con CPU này có cả Scheduler để xếp lịch chạy 2 luồng này sao cho hiệu quả (thế nên OS khi nhìn 1 con CPU multithread luôn nhầm tưởng là có 2 con, ví dụ mình có con CPU QuadCore thì OS sẽ hiển thị 4x2=8 CPU).

Xử lý số thực, hay còn gọi là floating-point operations per second (flops), đây là unit đánh giá khả năng chạy nhanh hay chậm của CPU.

Câu chuyện tạm dừng, tuy nhiên CPU và DATA và OS ngày càng lớn và # so với thời kỳ đầu (mặc dù IT mới chỉ phát triển tầm 20 năm, tức là chúng nó đang ở độ tuổi học Đại học). Tẹo nếu rảnh mình sẽ viết thêm một chút về các thanh ghi trong kiến trúc 8086 (EAX, EBX, ECX, EDX, ESI, EDI, DBP, ESP) ^^

Bài viết vội, có gì sai mong được lượng thứ và sửa đổi.

Video liên quan

Chủ đề