Oke, đây sẽ là bài đầu tiên mà anh em cần nắm, các kiến thức cơ bản nhất về máy tính
Máy tính chúng ta dùng hằng ngày được cấu tạo nên bởi rất nhiều thành phần khác nhau, nhưng chủ yếu, chúng có các thành phần quan trọng nhất như sau:
Bây giờ chúng ta sẽ tìm hiểu qua từng thành phần ở trong này:
Ở ví dụ trên ta thấy giá trị thanh ghi eax được cộng vào 2.
Nó là một trong những câu lệnh đơn giản nhất ở trong kiến trúc X86. Những câu lệnh này được gọi là các câu lệnh nền tảng. Nó được xây dựng sẵn để tính toán các câu lệnh khó hơn và phức tạp hơn.
Ví dụ: Bạn thực hiện tính 2 nhân với 5, thực ra trong bộ nhớ máy tính, các câu lệnh được chia nhỏ thành 5 câu lệnh cộng.
2 nhân với 5 hay còn có thể tính 2 + 2 + 2 + 2 + 2
Như vậy nó sẽ có dạng như sau:
Ngoài câu lệnh này ra còn có các câu lệnh trừ, so sánh hai số, đều là những câu lệnh cơ bản nhất của CPU. Các câu lệnh thông dụng đó bao gồm:
Lệnh đầu tiên
Nhận vào 1 số, tăng số đó lên 1 sau đó đưa kết quả ra output:
Một chương trình phức tạp hơn sẽ có nhiều đoạn lệnh đơn giản nằm trong nó, thực hiện một mục đích và công việc nhỏ nhất định để tạo nên chương trình lớn. Chúng thường được gọi là chương trình con hay anh em còn gọi nó là hàm.
Mã minh họa: Hàm thực hiện việc nhận vào 1 số, tăng số đó lên một và đưa kết quả đó ra output
Chúng ta hoàn toàn có thể tạo ra một hàm tương tự, hoặc chương trình có thêm chức năng thay vì tăng lên 1 đơn vị thì ta sẽ giảm 1 đơn vị:
Mã minh họa:
Hai hàm mình nói ở trên mình tạm gọi là hàm trừ một số và hàm tăng một số, ta có thể dùng hai hàm này để viết nên một chương trình lớn và phức tạp hơn một chút:
Đoạn mã trên cho thấy ta sẽ khai báo hai hàm nhỏ ở phía trên, sau đó gọi chúng ở chương trình chính, câu lệnh cmp là câu lệnh so sánh và thực hiện kiểm tra phép toán truyền vào có phải là phép trừ hay không, nếu đúng lệnh
Những câu lệnh ở trong bộ nhớ cũng như các dữ liệu khác, nhưng nó được lưu dưới dạng opcodes, được quy định theo một quy chuẩn nhất định để máy tính có thể hiểu và thực thi nó. CPU sẽ hiểu thực thi nó theo kiểu nó là câu lệnh gì và mục đích của nó là gì. Nó sẽ nhận vào cái gì và cho ra cái gì.
Ví dụ: câu lệnh jump trong CPU nó sẽ đọc là 0xE9, khi trong bộ nhớ có dữ liệu là 0xE9, CPU lập tức hiểu đó là câu lệnh jump và tiến hành đọc các tham số tiếp theo. Như vậy opcodes của lệnh jump là 0xE9
Hồi xưa, khi mà những máy tính đầu tiên ra đời, nó không phải thông minh và nhanh như bây giờ đâu anh em, nó bắt buộc mình phải viết các câu lệnh dưới dạng opcodes.
Dần dần, các opcodes này được phát triển và người ta nhận ra nếu như cứ viết opcodes mãi như này thì thực sự rất là khó khăn và tốn thời gian công sức. Do đó, ngôn ngữ lập trình đã ra đời. Một ví dụ về chương trình C++ để thực hiện các câu lệnh phía trên mình nói:
Oke, vấn đề chương trình đã được giải quyết, chúng ta biết là lúc các câu lệnh được nạp vào bộ nhớ, nó sẽ được CPU thực thi, nhưng cái gì nạp vào bộ nhớ cơ, cái gì nhận các thông số nhập vào từ bàn phím? Cái gì đảm nhận việc hiển thị kết quả lên màn hình, rồi thì cái gì đảm nhận việc liên lạc giữa các phần cứng với phần mềm.
Đó chính là Hệ điều hành.
Hiện nay có rất nhiều nền tảng hệ điều hành: Windows, Linux, MacOS. Mỗi hệ điều hành có một thư viện giao tiếp giữa phần cứng và phần mềm khác nhau, các kiến trúc câu lệnh cũng khác nhau, do đó chương trình viết để chạy trên các hệ điều hành này cũng là khác nhau. Điển hình như việc chạy một file thực thi trên Windows thì anh em chạy file có đuôi là .exe, nếu anh em đưa file này qua Linux để chạy thì bó tay rồi :v
Đến đây có lẽ cũng đã thấm mệt rồi nhỉ :v Hẹn anh em ở bài tiếp theo :v
Máy tính chúng ta dùng hằng ngày được cấu tạo nên bởi rất nhiều thành phần khác nhau, nhưng chủ yếu, chúng có các thành phần quan trọng nhất như sau:
- Đĩa cứng (thằng sẽ lưu dữ liệu của chúng ta)
- RAM (bộ nhớ truy cập ngẫu nhiễn, nó sẽ là bộ nhớ nạp các chương trình và dữ liệu tạm thời lên để chạy)
- Video card (thằng sẽ xử lý và quyết định đưa lên màn hình cái gì)
- Motherboard (thằng sẽ đảm nhận việc liên lạc giữa các thành phần trong máy tính với nhau)
- CPU (trung tâm xử lý của mọi yêu cầu, mọi câu lệnh dù chỉ là 1+1 cũng được tính ở đây)
CPU: bộ não máy tính
CPU được coi là bộ não của máy tính, nó đảm nhận việc tính toán mọi câu lệnh. Những câu lệnh từ dễ tới khó, từ đơn giản tới phức tạp phụ thuộc vào từng kiến trúc. Ví dụ, một lệnh đơn giản nhất là cộng hai số với nhau. Để tăng tốc thời gian thực thi, CPU có một số khu vực đặc biệt, nơi có thể lữu trữ và sửa đổi dữ liệu. Chúng được gọi là thanh ghi.
Nó là một trong những câu lệnh đơn giản nhất ở trong kiến trúc X86. Những câu lệnh này được gọi là các câu lệnh nền tảng. Nó được xây dựng sẵn để tính toán các câu lệnh khó hơn và phức tạp hơn.
Ví dụ: Bạn thực hiện tính 2 nhân với 5, thực ra trong bộ nhớ máy tính, các câu lệnh được chia nhỏ thành 5 câu lệnh cộng.
2 nhân với 5 hay còn có thể tính 2 + 2 + 2 + 2 + 2
Như vậy nó sẽ có dạng như sau:
- Cộng hai số
- Trừ hai số
- So sánh hai số
- Di chuyển một số vào một vị trí nào đó trong bộ nhớ (RAM)
- Nhảy đến một câu lệnh hoặc một địa chỉ chứa địa chỉ câu lệnh.
mov eax, 4
nó sẽ thực hiện đưa giá trị 4 vào thanh ghi eax, lệnh thức hai mov ebx, 8
đưa giá trị 8 vào trong thanh ghi ebx, sau đó lệnh thức ba add eax, ebx
thực hiện việc cộng giá trị nằm trong hai thanh ghi này với nhau. Như vậy là đã thực hiện được việc tính toán cộng hai số 4 và 8 với nhau.Như vậy qua kiến thức vừa rồi, ta đã có cái nhìn tổng quan về việc thực thi các câu lệnh.
Chương trình máy tính
Ví dụ ta có một chương trình đơn giản:Chương trình máy tính là một tập hợp các câu lệnh cơ bản như đã nói ở trên. Các chương trình máy tính thực thi và nhận giá trị đầu vào, sau đó tính toán và xử lý, tạo ra giá trị đầu ra phụ thuộc vào giá trị dưa vào và mục đích của chương trình.
Nhận vào 1 số, tăng số đó lên 1 sau đó đưa kết quả ra output:
Mã:
mov eax, input
add eax, 1
mov output, eax
hoặc
mov eax, input
inc eax
mov output, eax
Một chương trình phức tạp hơn sẽ có nhiều đoạn lệnh đơn giản nằm trong nó, thực hiện một mục đích và công việc nhỏ nhất định để tạo nên chương trình lớn. Chúng thường được gọi là chương trình con hay anh em còn gọi nó là hàm.
Mã minh họa: Hàm thực hiện việc nhận vào 1 số, tăng số đó lên một và đưa kết quả đó ra output
Mã:
function add(input):
mov eax, input
inc eax
mov output, eax
Chúng ta hoàn toàn có thể tạo ra một hàm tương tự, hoặc chương trình có thêm chức năng thay vì tăng lên 1 đơn vị thì ta sẽ giảm 1 đơn vị:
Mã minh họa:
Mã:
function subtract(input):
mov eax, input
dec eax
mov output, eax
Hai hàm mình nói ở trên mình tạm gọi là hàm trừ một số và hàm tăng một số, ta có thể dùng hai hàm này để viết nên một chương trình lớn và phức tạp hơn một chút:
Mã:
function add(input):
mov eax, input
inc eax
mov output, eax
function subtract(input):
mov eax, input
dec eax
mov output, eax
cmp operation, '-'
je subtract_number
add(number)
exit
subtract_number:
subtract(number)
exit
Đoạn mã trên cho thấy ta sẽ khai báo hai hàm nhỏ ở phía trên, sau đó gọi chúng ở chương trình chính, câu lệnh cmp là câu lệnh so sánh và thực hiện kiểm tra phép toán truyền vào có phải là phép trừ hay không, nếu đúng lệnh
je subtract_number
sẽ nhảy và hàm trừ sẽ được thực hiện thay vì hàm cộng. Việc so sánh này được gọi là câu lệnh rẽ nhánh trong lập trình, trong mã assembly, đây là một dạng đơn giản nhấtNgôn ngữ lập trình
Những câu lệnh ở trong bộ nhớ cũng như các dữ liệu khác, nhưng nó được lưu dưới dạng opcodes, được quy định theo một quy chuẩn nhất định để máy tính có thể hiểu và thực thi nó. CPU sẽ hiểu thực thi nó theo kiểu nó là câu lệnh gì và mục đích của nó là gì. Nó sẽ nhận vào cái gì và cho ra cái gì.
Ví dụ: câu lệnh jump trong CPU nó sẽ đọc là 0xE9, khi trong bộ nhớ có dữ liệu là 0xE9, CPU lập tức hiểu đó là câu lệnh jump và tiến hành đọc các tham số tiếp theo. Như vậy opcodes của lệnh jump là 0xE9
Hồi xưa, khi mà những máy tính đầu tiên ra đời, nó không phải thông minh và nhanh như bây giờ đâu anh em, nó bắt buộc mình phải viết các câu lệnh dưới dạng opcodes.
Dần dần, các opcodes này được phát triển và người ta nhận ra nếu như cứ viết opcodes mãi như này thì thực sự rất là khó khăn và tốn thời gian công sức. Do đó, ngôn ngữ lập trình đã ra đời. Một ví dụ về chương trình C++ để thực hiện các câu lệnh phía trên mình nói:
C++:
int add(int input) {
return input + 1;
}
int subtract(int input) {
return input - 1;
}
if(operation == '-') {
subtract(number);
}
else {
add(number);
}
Hệ điều hành
Oke, vấn đề chương trình đã được giải quyết, chúng ta biết là lúc các câu lệnh được nạp vào bộ nhớ, nó sẽ được CPU thực thi, nhưng cái gì nạp vào bộ nhớ cơ, cái gì nhận các thông số nhập vào từ bàn phím? Cái gì đảm nhận việc hiển thị kết quả lên màn hình, rồi thì cái gì đảm nhận việc liên lạc giữa các phần cứng với phần mềm.
Đó chính là Hệ điều hành.
Hiện nay có rất nhiều nền tảng hệ điều hành: Windows, Linux, MacOS. Mỗi hệ điều hành có một thư viện giao tiếp giữa phần cứng và phần mềm khác nhau, các kiến trúc câu lệnh cũng khác nhau, do đó chương trình viết để chạy trên các hệ điều hành này cũng là khác nhau. Điển hình như việc chạy một file thực thi trên Windows thì anh em chạy file có đuôi là .exe, nếu anh em đưa file này qua Linux để chạy thì bó tay rồi :v
Ứng dụng
Là các phần mềm chạy trên hệ điều hành, cung cấp các tính năng và giao diện để người dùng tương tác, đưa lại cho người dùng một trải nghiệm hoặc một cách giải quyết công việc nào đó thôi :v Anh em cứ hiểu nó đơn giản vậy là đượcGames
Chả khác gì ứng dụng cả, game thực chất cũng chỉ là một ứng dụng chạy trên hệ điều hành mà thôi, vấn đề là nó dùng để giải trí :v heheĐến đây có lẽ cũng đã thấm mệt rồi nhỉ :v Hẹn anh em ở bài tiếp theo :v