Assembly - Chương 01: Giới thiệu về Assembly
Chào các bạn, mình sẽ giới thiệu sơ lược về một ngôn ngữ lập trình gần với máy tính nhất - đó là ngôn ngữ Assembly. Các hướng dẫn trong loạt bài viết về ngôn ngữ này đã được thiết kế cho các bạn có nhu cầu hiểu ngôn ngữ lập trình này và ngay cả những người mới học lập trình. Đối với ngôn ngữ Assembly, mình sẽ cung cấp cho bạn đầy đủ kiến thức về ngôn ngữ lập trình này để các bạn có thể từ người mới bắt đầu tới lúc có được những kiến thức chuyên môn vững vàng.
Mỗi máy tính đều luôn có một bộ vi xử lý để quản lý các hoạt động tính toán, logic và điều khiển của máy tính.
Mỗi họ của các bộ xử lý có một bộ chỉ thị riêng để xử lý các hoạt động khác nhau như nhận đầu vào từ bàn phím, hiển thị thông tin trên màn hình và thực hiện nhiều công việc khác. Các bộ chỉ thị này được gọi là "bộ chỉ thị ngôn ngữ máy".
Bộ xử lý chỉ hiểu các bộ chỉ thị ngôn ngữ máy là các chuỗi 1 và 0. Tuy nhiên, ngôn ngữ máy quá khó hiểu và phức tạp để sử dụng trong phát triển phần mềm. Vì vậy, ngôn ngữ Assembly bậc thấp được thiết kế cho một họ của các bộ xử lý cụ thể đại diện cho các chỉ thị khác nhau trong các đoạn code tượng trưng và được biểu diễn dưới dạng dễ hiểu hơn.
Assembly cung cấp cho chúng ta những kiến thức như sau:
Các thuận lợi khác khi chúng ta sử dụng ngôn ngữ Assembly là:
Phần cứng bên trong PC bao gồm bộ xử lý, bộ nhớ và các thanh ghi. Thanh ghi là thành phần của bộ xử lý chứa dữ liệu và địa chỉ. Để thực hiện một chương trình, hệ thống sao chép nó từ thiết bị bên ngoài vào bộ nhớ trong. Bộ xử lý thực hiện các chỉ thị của chương trình.
Đơn vị cơ bản của bộ lưu trữ máy tính là bit; nó có thể là 1 hoặc 0. Một byte bao gồm có 9 bit. 8 bit được sử dụng cho dữ liệu và bit cuối cùng được sử dụng cho tính chẵn lẻ (parity). Theo quy tắc của parity, số lượng bit là bit 1 trong mỗi byte phải luôn là số lẻ.
Vì vậy, bit parity được sử dụng để làm số bit trong một byte lẻ. Nếu số bit parity là chẵn, hệ thống giả định rằng đã có một bit parity bị lỗi (mặc dù hiếm gặp) có thể gây ra do lỗi phần cứng hoặc nhiễu điện.
Bộ xử lý hỗ trợ các kích cỡ dữ liệu như dưới đây:
Mỗi hệ thống số sử dụng ký hiệu vị trí, tức là mỗi vị trí của một chữ số sẽ là một giá trị khác nhau. Mỗi vị trí là nguồn điện của cơ số, sẽ là 2 cho hệ thống số nhị phân và các nguồn điện này bắt đầu từ 0 và tăng thêm 1.
Bảng sau đây cho thấy các giá trị vị trí cho số nhị phân 8 bit, trong đó tất cả các bit được thiết lập.
Giá trị của số nhị phân dựa trên sự hiện diện của các bit 1 và giá trị vị trí của chúng. Vậy giá trị của số nhị phân đã cho là: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255, tương đương với 28 - 1.
Hệ thống số thập lục phân sử dụng hệ cơ số 16. Độ dài các chữ số từ 0 tới 15. Theo quy ước, các chữ cái từ A đến F được sử dụng để biểu thị các chữ số thập lục phân tương ứng với các giá trị thập phân từ 10 đến 15.
Việc sử dụng các số thập lục phân trong điện toán là để viết tắt cho độ dài của số nhị phân. Về cơ bản hệ thống số thập lục phân biểu diễn dữ liệu nhị phân bằng cách chia mỗi byte một nửa và biểu diễn giá trị của mỗi nửa byte. Bảng sau đây cung cấp các số tương đương thập phân, nhị phân và thập lục phân:
Để chuyển đổi một số nhị phân thành số thập lục phân, chia nó thành các nhóm gồm 4 nhóm liên tiếp, bắt đầu từ bên phải và viết các nhóm đó qua các chữ số tương ứng của số thập lục phân.
Ví dụ: Số nhị phân 1000 1100 1101 0001 sẽ tương đương với số thập lục phân 8CD1
.
Để chuyển đổi một số thập lục phân thành số nhị phân, chỉ cần viết mỗi chữ số thập lục phân thành số nhị phân 4 chữ số.
Ví dụ: Số thập lục phân FAD8 sẽ tương đương với số nhị phân 1111 1010 1101 1000.
Bảng dưới đây minh hoạ 4 quy tắc cơ bản trong cộng các số nhị phân:
*Lưu ý: Quy tắc (iii) và (iv) hiển thị việc mang 1 bit vào vị trí bên trái tiếp theo.
Ví dụ:
Một giá trị nhị phân âm được biểu thị trong ký hiệu bổ sung của 2. Theo quy tắc này, để chuyển đổi một số nhị phân thành giá trị âm thì chúng ta đảo ngược các giá trị bit và cộng thêm 1.
Ví dụ:
Để trừ đi một giá trị từ một giá trị khác, hãy chuyển đổi số bị trừ thành định dạng bổ sung của hai và cộng thêm các số.
Ví dụ: 53 trừ 42
Tràn bộ nhớ của một bit cuối bị mất.
Quá trình mà bộ xử lý kiểm soát việc thực thi các lệnh được gọi là chu trình tìm nạp - giải mã - thực thi (fetch-decode-execute) hoặc còn gọi là chu kỳ thực hiện. Nó bao gồm ba bước liên tục:
Bộ xử lý có thể truy cập một hoặc nhiều byte bộ nhớ cùng một lúc. Chúng ta hãy xem xét một số thập lục phân 0725H. Số này sẽ yêu cầu hai byte bộ nhớ. Byte thứ tự cao hoặc byte quan trọng nhất là 07 và byte thứ tự thấp là 25.
Bộ xử lý lưu trữ dữ liệu theo thứ tự byte ngược, tức là byte thứ tự thấp được lưu trữ trong địa chỉ bộ nhớ thấp và byte thứ tự cao trong địa chỉ bộ nhớ cao. Vì vậy, nếu bộ xử lý mang giá trị 0725H từ thanh ghi vào bộ nhớ, nó sẽ chuyển 25 trước sang địa chỉ bộ nhớ thấp hơn và 07 đến địa chỉ bộ nhớ tiếp theo.
!Chú thích: x là địa chỉ bộ nhớ.
Khi bộ xử lý lấy dữ liệu số từ bộ nhớ để đăng ký, nó lại đảo ngược các byte. Có hai loại địa chỉ bộ nhớ:
Chúng ta đã cùng tìm hiểu về khái niệm ngôn ngữ Assembly và được giới thiệu về các khái niệm trong máy tính như bộ xử lý, thanh ghi, bộ nhớ, ... Ngoài ra, chúng ta còn được giới thiệu về dữ liệu trong máy tính được biễu diễn như thế nào, tính toán ra sao và cách nó được lưu vào trong bộ nhớ. Cám ơn các bạn đã xem bài viết này.
Giới thiệu
Assembly là gì?
Mỗi máy tính đều luôn có một bộ vi xử lý để quản lý các hoạt động tính toán, logic và điều khiển của máy tính.
Mỗi họ của các bộ xử lý có một bộ chỉ thị riêng để xử lý các hoạt động khác nhau như nhận đầu vào từ bàn phím, hiển thị thông tin trên màn hình và thực hiện nhiều công việc khác. Các bộ chỉ thị này được gọi là "bộ chỉ thị ngôn ngữ máy".
Bộ xử lý chỉ hiểu các bộ chỉ thị ngôn ngữ máy là các chuỗi 1 và 0. Tuy nhiên, ngôn ngữ máy quá khó hiểu và phức tạp để sử dụng trong phát triển phần mềm. Vì vậy, ngôn ngữ Assembly bậc thấp được thiết kế cho một họ của các bộ xử lý cụ thể đại diện cho các chỉ thị khác nhau trong các đoạn code tượng trưng và được biểu diễn dưới dạng dễ hiểu hơn.
Điểm thuận lợi của ngôn ngữ Assembly
Assembly cung cấp cho chúng ta những kiến thức như sau:
- Giao diện của các chương trình với hệ điều hành (OS), bộ xử lý và BIOS;
- Biểu diễn dữ liệu trong bộ nhớ và các thiết bị ngoại vi khác
- Hiểu được cách mà bộ xử lý truy cập và thực hiện các chỉ thị;
- Hiểu được cách mà các chỉ thị truy cập và xử lý dữ liệu;
- Hiểu được cách mà một chương trình truy cập vào các thiết bị ngoại vi.
Các thuận lợi khác khi chúng ta sử dụng ngôn ngữ Assembly là:
- Nó yêu cầu ít vùng nhớ và thời gian thực thi;
- Nó cho phép các công việc phức tạp dành riêng cho phần cứng được thực hiện dễ dàng hơn;
- Nó phù hợp cho các công việc quan trọng.
- Nó rất phù hợp để viết các thường trình dịch vụ ngắt (interrupt service routines) và các chương trình thường trực bộ nhớ khác.
Các tính năng cơ bản của phần cứng PC
Phần cứng bên trong PC bao gồm bộ xử lý, bộ nhớ và các thanh ghi. Thanh ghi là thành phần của bộ xử lý chứa dữ liệu và địa chỉ. Để thực hiện một chương trình, hệ thống sao chép nó từ thiết bị bên ngoài vào bộ nhớ trong. Bộ xử lý thực hiện các chỉ thị của chương trình.
Đơn vị cơ bản của bộ lưu trữ máy tính là bit; nó có thể là 1 hoặc 0. Một byte bao gồm có 9 bit. 8 bit được sử dụng cho dữ liệu và bit cuối cùng được sử dụng cho tính chẵn lẻ (parity). Theo quy tắc của parity, số lượng bit là bit 1 trong mỗi byte phải luôn là số lẻ.
Vì vậy, bit parity được sử dụng để làm số bit trong một byte lẻ. Nếu số bit parity là chẵn, hệ thống giả định rằng đã có một bit parity bị lỗi (mặc dù hiếm gặp) có thể gây ra do lỗi phần cứng hoặc nhiễu điện.
Bộ xử lý hỗ trợ các kích cỡ dữ liệu như dưới đây:
- Word: mục dữ liệu 2-byte
- Doubleword: mục dữ liệu 4-byte (32 bit)
- Quadword: mục dữ liệu 8-byte (64 bit)
- Paragraph: mục dữ liệu 16-byte (128 bit)
- Kilobyte: 1024 bytes
- Megabyte: 1,048,576 bytes
Hệ thống số nhị phân
Mỗi hệ thống số sử dụng ký hiệu vị trí, tức là mỗi vị trí của một chữ số sẽ là một giá trị khác nhau. Mỗi vị trí là nguồn điện của cơ số, sẽ là 2 cho hệ thống số nhị phân và các nguồn điện này bắt đầu từ 0 và tăng thêm 1.
Bảng sau đây cho thấy các giá trị vị trí cho số nhị phân 8 bit, trong đó tất cả các bit được thiết lập.
Giá trị bit | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Giá trị vị trí như nguồn điện của cơ số 2 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Số bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Giá trị của số nhị phân dựa trên sự hiện diện của các bit 1 và giá trị vị trí của chúng. Vậy giá trị của số nhị phân đã cho là: 1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255, tương đương với 28 - 1.
Hệ thống số thập lục phân
Hệ thống số thập lục phân sử dụng hệ cơ số 16. Độ dài các chữ số từ 0 tới 15. Theo quy ước, các chữ cái từ A đến F được sử dụng để biểu thị các chữ số thập lục phân tương ứng với các giá trị thập phân từ 10 đến 15.
Việc sử dụng các số thập lục phân trong điện toán là để viết tắt cho độ dài của số nhị phân. Về cơ bản hệ thống số thập lục phân biểu diễn dữ liệu nhị phân bằng cách chia mỗi byte một nửa và biểu diễn giá trị của mỗi nửa byte. Bảng sau đây cung cấp các số tương đương thập phân, nhị phân và thập lục phân:
Số thập phân | Biễu diễn dạng nhị phân | Biễu diễn dạng thập lục phân |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
Để chuyển đổi một số nhị phân thành số thập lục phân, chia nó thành các nhóm gồm 4 nhóm liên tiếp, bắt đầu từ bên phải và viết các nhóm đó qua các chữ số tương ứng của số thập lục phân.
Ví dụ: Số nhị phân 1000 1100 1101 0001 sẽ tương đương với số thập lục phân 8CD1
.
Để chuyển đổi một số thập lục phân thành số nhị phân, chỉ cần viết mỗi chữ số thập lục phân thành số nhị phân 4 chữ số.
Ví dụ: Số thập lục phân FAD8 sẽ tương đương với số nhị phân 1111 1010 1101 1000.
Tính toán số nhị phân
Bảng dưới đây minh hoạ 4 quy tắc cơ bản trong cộng các số nhị phân:
(i) | (ii) | (iii) | (iv) |
---|---|---|---|
1 | |||
0 | 1 | 1 | 1 |
+0 | +0 | +1 | +1 |
=0 | =1 | =10 | =11 |
*Lưu ý: Quy tắc (iii) và (iv) hiển thị việc mang 1 bit vào vị trí bên trái tiếp theo.
Ví dụ:
Thập phân | Nhị phân |
---|---|
60 | 00111100 |
+42 | 00101010 |
102 | 01100110 |
Một giá trị nhị phân âm được biểu thị trong ký hiệu bổ sung của 2. Theo quy tắc này, để chuyển đổi một số nhị phân thành giá trị âm thì chúng ta đảo ngược các giá trị bit và cộng thêm 1.
Ví dụ:
Số 53 | 00110101 |
Đảo các bit | 11001010 |
Cộng thêm 1 | 1 |
Số -53 | 11001011 |
Để trừ đi một giá trị từ một giá trị khác, hãy chuyển đổi số bị trừ thành định dạng bổ sung của hai và cộng thêm các số.
Ví dụ: 53 trừ 42
Số 53 | 00110101 |
Số 42 | 00101010 |
Đảo bit 42 | 11010101 |
Cộng thêm 1 | 1 |
Số -42 | 11010110 |
53 trừ 42 = 11 | 00001011 |
Tràn bộ nhớ của một bit cuối bị mất.
Địa chỉ dữ liệu trong bộ nhớ
Quá trình mà bộ xử lý kiểm soát việc thực thi các lệnh được gọi là chu trình tìm nạp - giải mã - thực thi (fetch-decode-execute) hoặc còn gọi là chu kỳ thực hiện. Nó bao gồm ba bước liên tục:
- Lấy chỉ thị từ bộ nhớ
- Giải mã hoặc nhận dạng chỉ thị
- Thực thi chỉ thị
Bộ xử lý có thể truy cập một hoặc nhiều byte bộ nhớ cùng một lúc. Chúng ta hãy xem xét một số thập lục phân 0725H. Số này sẽ yêu cầu hai byte bộ nhớ. Byte thứ tự cao hoặc byte quan trọng nhất là 07 và byte thứ tự thấp là 25.
Bộ xử lý lưu trữ dữ liệu theo thứ tự byte ngược, tức là byte thứ tự thấp được lưu trữ trong địa chỉ bộ nhớ thấp và byte thứ tự cao trong địa chỉ bộ nhớ cao. Vì vậy, nếu bộ xử lý mang giá trị 0725H từ thanh ghi vào bộ nhớ, nó sẽ chuyển 25 trước sang địa chỉ bộ nhớ thấp hơn và 07 đến địa chỉ bộ nhớ tiếp theo.
Cách lưu trữ dữ liệu trong máy tính |
!Chú thích: x là địa chỉ bộ nhớ.
Khi bộ xử lý lấy dữ liệu số từ bộ nhớ để đăng ký, nó lại đảo ngược các byte. Có hai loại địa chỉ bộ nhớ:
- Địa chỉ tuyệt đối - tham khảo trực tiếp của địa chỉ cụ thể.
- Địa chỉ phân đoạn (hoặc bù) - địa chỉ bắt đầu của một phân đoạn bộ nhớ với giá trị bù.
Tóm tắt
Chúng ta đã cùng tìm hiểu về khái niệm ngôn ngữ Assembly và được giới thiệu về các khái niệm trong máy tính như bộ xử lý, thanh ghi, bộ nhớ, ... Ngoài ra, chúng ta còn được giới thiệu về dữ liệu trong máy tính được biễu diễn như thế nào, tính toán ra sao và cách nó được lưu vào trong bộ nhớ. Cám ơn các bạn đã xem bài viết này.