1. Khái niệm đầu tiên
Giống như hầu hết các môn học thú vị, ngôn ngữ lập trình lắp ráp đòi hỏi một kiến thức nền chút trước khi bạn có thể bắt đầu đánh giá cao nó. Trong chương này, chúng tôi khám phá những điều cơ bản. Nếu những từ như bổ sung, thập lục phân, chỉ số đăng ký và byte hai của rất quen thuộc với bạn, có thể là bạn có thể bỏ qua chương tiếp theo, hoặc lướt qua này một cho sửa đổi. Nếu không, hầu hết các khái niệm quan trọng bạn cần phải hiểu để bắt đầu lập trình trong lắp ráp được giải thích dưới đây.
Một điều kiện tiên quyết, ngay cả đối với những người mới bắt đầu lắp ráp ngôn ngữ, là một sự quen thuộc với một số ngôn ngữ cấp cao như BASIC hoặc Pascal. Trong khi giải thích một số khái niệm quan trọng, chúng tôi so sánh với những ý tưởng tương tự trong BASIC, C hoặc Pascal. Nếu bạn không có yêu cầu cơ bản này, bạn cũng có thể ngừng đọc bây giờ và có một bash tại BASIC đầu tiên.
1.1 mã máy và lên ...
Câu hỏi đầu tiên chúng ta cần phải trả lời là, tất nhiên, "ngôn ngữ lắp ráp là gì. Như bạn đã biết, bất kỳ ngôn ngữ lập trình là một phương tiện mà qua đó con người có thể hướng dẫn cho một máy tính. Ngôn ngữ như BASIC, Pascal và C, mà chúng ta gọi là ngôn ngữ cấp cao, chịu một số mối quan hệ với Anh, và điều này cho phép con người đại diện cho ý tưởng một cách khá tự nhiên. Ví dụ, ý tưởng thực hiện một hoạt động một số lần được thể hiện bằng cách sử dụng BASIC CHO xây dựng:
CHO i = 1 TO 10: IN i: TIẾP i
Mặc dù các cấu trúc cấp cao cho phép con người chúng ta phải viết chương trình theo một cách tương đối dễ dàng, họ trên thực tế chịu ít quan hệ với cách mà máy tính thực hiện các hoạt động. Tất cả các máy tính có thể làm là thao tác mẫu của 'trên' và 'tắt', thường được đại diện bởi sự có mặt hay vắng mặt của một tín hiệu điện.
Để giải thích khoảng cách dường như unbridgable này giữa các tín hiệu điện và quen thuộc của chúng tôi cho ... TIẾP vòng, chúng tôi sử dụng một số cấp đại diện. Ở cấp độ thấp nhất, chúng tôi có các tín hiệu điện của chúng tôi. Trong một máy tính kỹ thuật số của các loại chúng tôi đang quan tâm, một mạch có thể có một trong hai cấp độ, nói 0 volt ( 'off') hoặc 5 volts ( 'trên').
Bây giờ chúng ta không thể nói rất dễ dàng chỉ bằng cách nhìn những gì điện áp một mạch là lúc, vì vậy chúng tôi chọn để viết mẫu của on / off điện áp sử dụng một số hình ảnh đại diện. Các chữ số 0 và 1 được sử dụng. Các chữ số được sử dụng bởi vì, ngoài gọn gàng đại diện cho ý tưởng về một mặt hay vắng mặt của một tín hiệu, 0 và 1 là các chữ số của hệ thống số nhị phân, mà là trung tâm của sự hiểu biết về cách thức hoạt động máy tính. Các chữ số nhị phân dài thường được viết tắt là bit . Dưới đây là một chút: 1. Dưới đây là tám bit trong một hàng: 11.011.011
mã máy
Giả sử chúng ta có một số cách để lưu trữ các nhóm các số nhị phân và cho chúng ăn vào máy tính. Khi đọc một mô hình cụ thể của các bit, máy tính sẽ phản ứng một cách nào đó. Điều này là hoàn toàn xác định; nghĩa là, mỗi khi máy tính nhìn thấy mô hình mà phản ứng của nó sẽ giống nhau. Hãy nói rằng chúng tôi có một máy tính thần thoại mà đọc trong nhóm bit tám tại một thời điểm, và theo mô hình của 1s và 0s trong nhóm, thực hiện một số nhiệm vụ. Khi đọc mẫu này, ví dụ
10100111
máy tính có thể tạo ra một điện áp trên một dây, và đọc các mô hình
10100110
nó có thể tắt điện áp đó. Hai mẫu sau đó có thể được coi là hướng dẫn để các máy tính, ý nghĩa đầu tiên của điện áp trên ', thứ hai' điện áp ra. Mỗi khi hướng dẫn 10100111 được đọc, điện áp sẽ trở về, và bất cứ khi nào các mô hình 10100110 là gặp phải, máy tính biến điện áp ra. mô hình như vậy của các bit được gọi là mã máy của một máy tính; họ là những mã mà máy móc nguyên phản ứng.
ngôn ngữ lắp ráp và lắp ráp
Có 256 kết hợp tám 1s và 0s, 00.000.000-11.111.111, với 254 người khác ở giữa. Nhớ những gì mỗi người trong các phương tiện là đòi hỏi quá nhiều của một con người: chúng ta chỉ giỏi nhóm có ít nhất sáu hoặc bảy mục ghi nhớ. Để thực hiện các nhiệm vụ ghi nhớ các hướng dẫn dễ dàng hơn một chút, chúng ta viện đến bước tiếp theo trong sự tiến triển hướng tới các hướng dẫn cấp cao được tìm thấy trong BASIC. Mỗi chỉ lệnh mã máy được đặt một cái tên, hoặc ghi nhớ . Thuật nhớ thường gồm ba chữ cái, nhưng điều này không có nghĩa là bắt buộc. Chúng ta có thể tạo nên trí nhớ cho hai mã máy của chúng tôi:
ON có nghĩa là 10100111
OFF có nghĩa là 10100110
Vì vậy, bất cứ khi nào chúng tôi viết về trong một chương trình, chúng tôi thực sự có nghĩa là 10100111, nhưng ON là dễ dàng hơn để nhớ. Một chương trình được viết bằng các tên văn bản để được hướng dẫn được gọi là một chương trình hợp ngữ, và thiết lập các thuật nhớ được sử dụng để đại diện cho mã máy của máy tính được gọi là ngôn ngữ lắp ráp máy tính đó. Ngôn ngữ hội là mức thấp nhất được sử dụng bởi con người đến một chương trình máy tính; chỉ một masochist nan y sẽ chương trình sử dụng mã máy tinh khiết.
Nó là bình thường cho các mã máy để đến trong các nhóm đó thực hiện các chức năng tương tự. Ví dụ, trong khi 10100111 có thể có nghĩa là chuyển đổi về điện áp tại các tín hiệu được gọi là 'đầu ra 0', mô hình rất giống 10.101.111 có thể có nghĩa là chuyển đổi về tín hiệu gọi là "đầu ra 1 '. Cả hai hướng dẫn là " ON những người ', nhưng chúng ảnh hưởng đến tín hiệu khác nhau. Bây giờ chúng ta có thể định nghĩa hai thuật nhớ, nói ON0 và on1 , nhưng nó là nhiều hơn bình thường trong ngôn ngữ lắp ráp để sử dụng ghi nhớ đơn giản ON và làm theo điều này với thông tin thêm rằng đó là dấu hiệu chúng tôi muốn chuyển về. Ví dụ, hướng dẫn lắp ráp ngôn ngữ
ON 1
sẽ được dịch ra tiếng 10101111, trong khi đó:
ON 0
là 10100111 trong mã máy. Các mục thông tin đó đến sau khi ghi nhớ (có thể có nhiều hơn một) được gọi là các toán hạng của lệnh.
Làm thế nào để một chương trình lắp ráp, được tạo thành từ các thông tin văn bản, được chuyển đổi thành các mã máy cho máy tính? Chúng tôi viết một chương trình để làm điều đó, tất nhiên! Vâng, chúng tôi không viết nó. Ai cung cấp máy tính viết nó cho chúng ta. Chương trình này được gọi là một nhà lắp ráp. Quá trình sử dụng một lắp ráp để chuyển đổi từ việc nhớ mật mã máy được gọi là lắp ráp. Chúng ta sẽ có nhiều điều để nói về một cụ thể lắp ráp - có thể chuyển đổi từ ngôn ngữ lắp ráp ARM vào mã máy ARM - trong Chương Bốn.
Trình biên dịch và phiên dịch
Là chủ đề của cuốn sách này là ARM lập trình hợp ngữ, chúng ta có thể ngăn chặn các cuộc thảo luận của các cấp hướng dẫn các máy tính ở đây. Tuy nhiên, cho đầy đủ, chúng tôi sẽ thảo luận ngắn gọn liên kết còn thiếu giữa ngôn ngữ lắp ráp và, nói, Pascal. Việc chuyển nhượng Pascal
a: = a + 12
trông giống như một hoạt động đơn giản cho chúng ta, và vì vậy nó cần. Tuy nhiên, máy tính không biết gì về các biến được gọi là một phân hoặc thập phân số như 12. Trước khi máy tính có thể làm những gì chúng tôi đã hỏi, thì chuyển nhượng phải được dịch sang một trình tự thích hợp của các hướng dẫn. Một trình tự như vậy (đối với một số máy tính thần thoại) có thể là:
LOAD một Thanh 12 CỬA HÀNG một
Ở đây chúng ta thấy có ba thuật nhớ, TẢI , ADD và CỬA HÀNG . TẢI lấy các giá trị từ các nơi chúng tôi đã được gọi là một , ADD thêm 12 đến giá trị nạp này, và CỬA HÀNG lưu nó đi một lần nữa. Tất nhiên, trình tự lắp ráp ngôn ngữ này phải được chuyển đổi thành mã máy trước khi nó có thể được tuân theo. Ba thuật nhớ ở trên có thể chuyển đổi thành những hướng dẫn này:
00.010.011
00.111.100
00100011
00.111.100
00100011
Một khi mã máy này đã được lập trình vào máy tính, nó có thể được tuân theo, và phân công ban đầu được thực hiện.
Để có được trong Pascal và mã máy, chúng tôi sử dụng một chương trình khác. Điều này được gọi là một trình biên dịch. Nó tương tự như một nhà lắp ráp ở chỗ nó chuyển đổi từ một chương trình con người có thể đọc được một cái gì đó vào một máy tính có thể hiểu được. Có một sự khác biệt quan trọng mặc dù: trong khi có một mối quan hệ một-một giữa một lệnh hợp ngữ và mã máy nó đại diện, không có mối quan hệ như vậy giữa một hướng dẫn ngôn ngữ cấp cao như
IN "HELLO"
và mã máy một trình biên dịch sản xuất trong đó có tác dụng tương tự. Nằm trong đó một trong những ưu điểm của lập trình trong lắp ráp: bạn biết tại mọi thời điểm chính xác những gì máy tính là vào và có quyền kiểm soát rất thân mật trên nó. Ngoài ra, vì một trình biên dịch chỉ là một chương trình, mã máy nó tạo ra có thể hiếm khi được là 'tốt' là cái gì một con người có thể viết.
Một trình biên dịch có để sản xuất mã máy làm việc cho số lượng vô hạn của chương trình có thể được viết bằng các ngôn ngữ biên dịch. Nó là không thể đảm bảo rằng tất cả các lệnh cấp cao nhất có thể được dịch theo cách tối ưu; chương trình hợp ngữ con người viết nhanh hơn và nhỏ hơn sẽ luôn luôn là có thể. Chống lại những lợi thế của việc sử dụng lắp ráp phải được cân nhắc thực tế là ngôn ngữ cấp cao, theo định nghĩa, dễ dàng hơn cho con người để viết, đọc và sửa lỗi (loại bỏ các lỗi).
Quá trình viết một chương trình trong một ngôn ngữ cấp cao, chạy các trình biên dịch trên nó, sửa chữa những sai lầm, tái biên dịch nó và như vậy thường mất nhiều thời gian, đặc biệt là cho các chương trình lớn có thể mất vài phút (hoặc thậm chí hàng giờ) để biên dịch. Một phương pháp khác được cung cấp bởi một kỹ thuật được sử dụng để làm cho quá trình chuyển đổi từ ngôn ngữ cấp cao để mã máy. Kỹ thuật này được biết như giải thích. Các ngôn ngữ giải thích phổ biến nhất là BASIC.
Một chương trình giải thích không được chuyển đổi từ, nói, văn bản BASIC thành mã máy. Thay vào đó, một chương trình (thông dịch) xem xét các chương trình BASIC và quyết định các hoạt động để thực hiện để tạo ra hiệu quả mong muốn. Ví dụ, để giải thích sự phân công
LET a = a + 12
trong BASIC, các thông dịch viên sẽ làm một cái gì đó như sau:
- Nhìn vào các lệnh LET
- Điều này có nghĩa là chuyển nhượng, để tìm các biến được phân công
- Kiểm tra có dấu bằng sau một
- Nếu không, làm một Thiếu = lỗi
- Tìm ra nơi mà các giá trị cho một được lưu trữ
- Đánh giá biểu thức sau =
- Lưu trữ giá trị đó vào đúng chỗ cho một
Thông báo ở bước 6 chúng ta đơn giản hóa mọi thứ bằng cách không đề cập chính xác như thế nào biểu thức sau = được đánh giá. Trong thực tế, bước này, được gọi là "đánh giá biểu hiện" có thể là một hoạt động khá phức tạp.
Ưu điểm của việc điều hành trực tiếp trên văn bản BASIC như thế này là một ngôn ngữ diễn giải có thể được thực hiện tương tác. Điều này có nghĩa rằng dòng chương trình có thể được thay đổi và tác dụng nhìn thấy ngay lập tức, mà không cần biên dịch lại tốn nhiều thời gian; và các giá trị của biến có thể được kiểm tra và thay đổi 'trên bay'. Nhược điểm là chương trình giải sẽ chạy chậm hơn so với một tương đương biên soạn một vì tất cả các kiểm tra (đối với dấu bằng, vv) có thể xảy ra mỗi khi một lệnh được thực thi. Người phiên dịch thường được viết bằng assembler cho tốc độ, nhưng nó cũng có thể viết một trong một ngôn ngữ cấp cao.
Tóm lược
Chúng ta có thể tóm tắt những gì chúng ta đã học trong phần này như sau. Máy tính hiểu được (đáp ứng) với sự có mặt hay vắng mặt của điện áp. Chúng tôi có thể đại diện cho các điện áp trên giấy bởi các trình tự của 1s và 0s (bit). Tập hợp các chuỗi bit mà làm cho máy tính để đáp ứng một cách nào đó cũng xác định được gọi là mã máy của mình. Con người không thể nói 10110111 10010111 từ rất tốt, vì vậy chúng tôi đưa ra những cái tên ngắn, hoặc dễ nhớ, để hướng dẫn. Tập hợp các thuật nhớ là ngôn ngữ lắp ráp máy tính, và một nhà lắp ráp là một chương trình để chuyển đổi từ đại diện này cho các mã máy tính có thể đọc được. Một trình biên dịch làm một công việc tương tự cho các ngôn ngữ cấp cao.
kiến trúc máy tính 1.2
Cho đến nay chúng tôi đã tránh được những câu hỏi như thế nào hướng dẫn được lưu trữ, làm thế nào các máy tính giao tiếp với thế giới bên ngoài, và những gì hoạt động một máy tính điển hình là thực sự có khả năng thực hiện. Bây giờ chúng ta sẽ làm sáng tỏ những điểm này và giới thiệu một số thuật ngữ hơn.
các CPU
Trong phần trước, chúng ta sử dụng từ 'máy tính để mô tả những gì thực sự chỉ là một phần của một hệ thống máy tính điển hình. Phần mà đọc hướng dẫn và mang chúng ra ( thực hiện chúng) được gọi là bộ vi xử lý, hoặc đầy đủ hơn, các đơn vị xử lý trung tâm (CPU). CPU là trái tim của bất kỳ hệ thống máy tính, và trong cuốn sách này, chúng tôi đang quan tâm đến một loại hình cụ thể của CPU - Acorn RISC Machine hoặc ARM.
Trong hầu hết các hệ thống máy vi tính, CPU chiếm một chip đơn (mạch tích hợp), nằm trong một nhựa hoặc gói gốm. CPU ARM là trong một gói vuông với 84 kết nối xung quanh các cạnh. Phần 1.4 mô tả một cách chi tiết các yếu tố chính của CPU ARM. Trong phần này, chúng tôi quan tâm nhiều hơn với cách kết nối với phần còn lại của hệ thống.
bus máy tính
Biểu đồ dưới đây cho thấy cách các khe cắm CPU vào toàn bộ hệ thống:
Đây là một sơ đồ trực quan đơn giản của một hệ thống máy tính, nhưng là cho thấy ba thành phần chính và cách thức chúng được kết nối. Các CPU đã được đề cập. Phát ra từ nó là hai bus. Một chiếc xe buýt trong bối cảnh này là một nhóm các dây tín hiệu mang. Có hai của họ trên sơ đồ. Các xe buýt dữ liệu được sử dụng để chuyển thông tin (dữ liệu) trong và ngoài của CPU. Các bus địa chỉ là sản phẩm của CPU để nói với các thiết bị khác (bộ nhớ và đầu vào / đầu ra) mà cụ thể mục thông tin được yêu cầu.
Bus được cho là có nhất định độ rộng . Đây là chỉ số của tín hiệu mà tạo nên các xe buýt. Đối với một bộ xử lý cho độ rộng của bus dữ liệu thường được cố định; giá trị điển hình là 8, 16 và 32 bit. Trên ARM bus dữ liệu 32 bit rộng (nghĩa là có 32 tín hiệu riêng biệt để chuyển dữ liệu), và ARM được gọi là một máy 32-bit. Các rộng bus dữ liệu, lớn hơn số lượng thông tin mà có thể được xử lý trong một đi bởi CPU. Vì vậy nó thường được nói rằng các máy tính 32-bit là mạnh hơn so với những người 16-bit, mà lần lượt là mạnh hơn so với những người 8-bit.
bus địa chỉ của ARM có 26 tín hiệu. Các rộng bus địa chỉ, bộ nhớ hơn các máy tính có khả năng sử dụng. Đối với mỗi tín hiệu phụ, số lượng bộ nhớ có thể được tăng lên gấp đôi. Nhiều CPU (đặc biệt là những tám-bit, được tìm thấy trong nhiều nhà và bàn-top micros cũ) có một xe buýt địa chỉ mười sáu-bit, cho phép 65.536 tế bào bộ nhớ được giải quyết. bus địa chỉ của ARM có 26 tín hiệu, cho phép hơn 1000 lần so với bộ nhớ nhiều.
Như chúng tôi đã nói ở trên, ARM có 84 tín hiệu. 58 trong số này được sử dụng bởi các dữ liệu và địa chỉ bus; các hình thức còn lại chưa một chiếc xe khác, không thể hiện trên sơ đồ. Đây được gọi là xe buýt tín hiệu điều khiển, và các nhóm cùng các tín hiệu cần thiết để thực hiện các nhiệm vụ như đồng bộ hóa các luồng thông tin giữa ARM và các thiết bị khác.
Bộ nhớ và I / O
Các mũi tên ở hai đầu của bus dữ liệu có nghĩa là thông tin có thể chảy vào và ra khỏi máy tính. Hai khối từ nơi thông tin được nhận, và đến nơi nó được gửi đi, được dán nhãn Bộ nhớ và đầu vào / đầu ra. Bộ nhớ là nơi các chương trình, và tất cả các thông tin liên quan đến họ, được tổ chức. Trước đó chúng tôi đã nói chuyện về các hướng dẫn được đọc bởi CPU. Bây giờ chúng ta có thể thấy rằng chúng được đọc từ bộ nhớ của máy tính, và vượt qua cùng bus dữ liệu cho CPU. Tương tự như vậy, khi CPU cần đọc thông tin được xử lý, hoặc để viết kết quả trở lại, các dữ liệu đi tới đi lui cùng bus dữ liệu.
Đầu vào / ra (I / O) bao gồm nhiều thiết bị. Để có ích, một máy tính phải giao tiếp với thế giới bên ngoài. Điều này có thể được thông qua một màn hình và bàn phím trong một máy tính cá nhân, hoặc sử dụng các cảm biến nhiệt độ và máy bơm, nếu máy tính đã xảy ra để được kiểm soát một hệ thống sưởi ấm trung tâm. Dù các chi tiết của máy tính I / O, CPU tương tác với nó thông qua bus dữ liệu. Trong thực tế, đối với nhiều CPU (ARM là một) I / O thiết bị 'nhìn' như bộ nhớ bình thường; này được gọi là bộ nhớ ánh xạ I / O.
Các xe buýt khác trên sơ đồ là Địa chỉ Bus. bộ nhớ của máy tính (và I / O) có thể được coi là một bộ sưu tập của các tế bào, mỗi trong số đó có thể chứa n bit thông tin, trong đó n là chiều rộng của bus dữ liệu. Một số cách phải được cung cấp để lựa chọn bất kỳ một trong những tế bào riêng lẻ. Các chức năng của bus địa chỉ là cung cấp một mã nhận diện duy nhất tế bào mong muốn. Chúng tôi đề cập ở trên rằng có 256 kết hợp của tám bit, do đó, một xe buýt địa chỉ 8-bit sẽ cho phép chúng tôi để nhận diện 256 tế bào bộ nhớ. Trong thực tế điều này là quá ít, và CPU thực cung cấp ít nhất 16 bit bus địa chỉ: 65536 tế bào có thể được giải quyết bằng cách sử dụng xe buýt như vậy. Như đã đề cập ARM có một xe buýt địa chỉ 26-bit, cho phép 64 triệu tế bào (hoặc 'địa điểm') để được giải quyết.
hướng dẫn
Nó bây giờ sẽ được rõ ràng hơn như thế nào một CPU đi về công việc của mình. Khi bộ xử lý được khởi động ( thiết lập lại ) rồi nó lấy một lệnh từ một địa điểm cố định. Trên ARM đây là vị trí truy cập khi tất cả 26 bit bus địa chỉ là 0. Các mã lệnh - 32 bit của nó trên ARM - được chuyển từ bộ nhớ vào trong CPU. Các mạch trong CPU hiểu ra những gì các phương tiện hướng dẫn (điều này được gọi là giải mãcác lệnh) và đã thực hiện các hành động thích hợp. Sau đó, hướng khác được lấy từ các vị trí tiếp theo, giải mã và thực thi, và như vậy. Trình tự này là cơ sở của tất cả các công việc được thực hiện bởi CPU.Đó là một thực tế rằng chu kỳ lấy giải mã-thực hiện có thể được thực hiện một cách nhanh chóng mà làm cho máy tính nhanh chóng. ARM, ví dụ, có thể quản lý một đỉnh cao của 8.000.000 chu kỳ một giây.Phần 1.4 cho biết thêm về chu kỳ lấy giải mã-thực thi.
Những loại hướng dẫn nào ARM hiểu? Trên toàn bộ họ là khá đơn giản, đó là lý do tại sao họ có thể được thực hiện một cách nhanh chóng. Một nhóm các hướng dẫn là có liên quan với số học đơn giản: thêm hai con số và như vậy. Một nhóm khác được sử dụng để tải và lưu trữ dữ liệu vào và ra của CPU. Một hướng dẫn đặc biệt gây ARM từ bỏ chế độ tuần tự thông thường của mình lấy hướng dẫn và bắt đầu từ đâu đó trong bộ nhớ. Một tỷ lệ lớn các cuốn sách này đề với mô tả chi tiết của tất cả các hướng dẫn ARM - về việc nhớ mật ngữ của họ chứ không phải là các mã 32-bit được thực hiện bằng các tín hiệu điện trong các chip.
Tóm lược
ARM, chung với hầu hết các CPU khác, được kết nối với bộ nhớ và I / O thiết bị thông qua bus dữ liệu và bus địa chỉ. Bộ nhớ được sử dụng để hướng dẫn lưu trữ và dữ liệu. I / O được sử dụng để giao tiếp với các CPU với thế giới bên ngoài. Các hướng dẫn được lấy trong một thời trang bình thường tuần tự, và thực hiện bởi CPU. ARM có một bus dữ liệu 32-bit, có nghĩa là nó thường đề với dữ liệu kích thước này. Có 26 tín hiệu địa chỉ, cho phép ARM để giải quyết 64 triệu bộ nhớ hoặc I / O địa điểm.
1.3 Bit, byte và nhị phân
Trước đó chúng tôi đã nói lựa chọn các chữ số 0 và 1 để biểu diễn tín hiệu là quan trọng vì nó gắn liền với hệ thống số học nhị phân. Trong phần này chúng tôi giải thích biểu diễn nhị phân là gì, và làm thế nào các tín hiệu xuất hiện trên các dữ liệu và địa chỉ bus có thể được hiểu như số nhị phân.
Tất cả các dữ liệu và hướng dẫn trong máy tính được lưu trữ như trình tự của những người thân và số không, như đã đề cập ở trên. Mỗi chữ số nhị phân, hoặc bit, có thể có một trong hai giá trị, chỉ là một chữ số thập phân có thể có một trong mười giá trị 0-9.
Chúng tôi nhóm bit thành nhiều tám. một nhóm như vậy được gọi là một byte, và mỗi bit trong byte đại diện cho một giá trị cụ thể. Để hiểu điều này, hãy xem xét những gì các số thập phân 3456 có nghĩa là:
10 3 | 10 2 | 10 1 | 10 0 |
Hàng ngàn | hàng trăm | hàng chục | Các đơn vị |
3 | 4 | 5 | 6 |
3000 + 400 + 50 + 6 = 3456
Mỗi vị trí chữ số đại diện cho một sức mạnh của mười. Người ngoài cùng bên phải cho biết số đơn vị (mười với sức mạnh 0), sau đó hàng chục (mười một) và như vậy. ý nghĩa của mỗi cột là lớn hơn một bên phải của nó mười lần. Chúng ta có thể viết các con số lớn như chúng ta muốn bằng cách sử dụng đủ số.
Bây giờ nhìn vào số nhị phân 1101:
2 3 | 2 2 | 2 1 | 2 0 |
Eights | Fours | twos | Các đơn vị |
1 | 1 | 0 | 1 |
8 + 4 + 0 + 1 = 13
Một lần nữa các chữ số tận cùng bên phải đại diện cho các đơn vị. Các chữ số tiếp theo thể hiện twos (hai đến một) và như vậy. ý nghĩa của mỗi cột là lớn gấp hai lần như là một bên phải của nó, và chúng tôi có thể đại diện cho bất kỳ số lượng bằng cách sử dụng đủ bit.
Cách thức mà một chuỗi các bit được giải thích phụ thuộc vào ngữ cảnh mà nó được sử dụng. Ví dụ, trong phần 1.1, chúng tôi đã có một máy tính thần thoại mà sử dụng hướng dẫn tám-bit. Sau khi lấy các byte 10100111 máy tính này gây ra một tín hiệu để đi vào. Trong bối cảnh khác, các số nhị phân 10100111 có thể là một trong hai giá trị mà máy tính được thêm vào với nhau. Ở đây nó được sử dụng để đại diện cho một số lượng:
1 * 2 7 + 0 * 2 6 + 1 * 2 5 + 0 * 2 4 + 0 * 2 3 + 1 * 2 2 + 1 * 2 1 + 1 * 2 0 =
128 + 32 + 4 + 2 + 1 = 167
Nếu chúng ta muốn xác định một chút đặc biệt trong một số, chúng tôi gọi nó bằng sức mạnh của hai mà nó đại diện. Ví dụ, các bit ngoài cùng bên phải đại diện cho hai đến số không, và vì vậy được gọi là bit số không. Điều này cũng được gọi là ít nhất là bit quan trọng (LSB), vì nó đại diện cho cường độ nhỏ nhất. Tiếp đến LSB là bit 1, rồi cắn 2, và như vậy. Các bit cao nhất của một số N-bit sẽ được chút N-1, và tự nhiên đủ, điều này được gọi là các bit quan trọng nhất - MSB.
Như đã đề cập ở trên, các bit thường được nhóm lại thành các byte tám-bit. Do đó, một byte có thể đại diện cho các số trong phạm vi 00000000-11111111 trong nhị phân, hoặc 0-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 trong hệ thập phân. (Chúng tôi sẽ xem làm thế nào các số âm được biểu diễn dưới đây.)
Trường hợp số lượng lớn được yêu cầu, một số byte có thể được sử dụng để tăng phạm vi. Ví dụ, hai byte có thể đại diện cho 65.536 giá trị khác nhau và bốn-byte (32-bit) số có hơn 4000000000 giá trị.
Khi ARM hoạt động trên các số 32-bit, nó có thể khá dễ dàng đối phó với những con số của độ lớn vừa đề cập. Tuy nhiên, như chúng ta sẽ thấy dưới đây, số lượng byte kích thước cũng rất hữu ích, vì vậy ARM có thể đối phó với các byte đơn quá.
Ngoài số nguyên nhỏ, byte được sử dụng để đại diện cho nhân vật. Ký tự mà bạn gõ vào bàn phím hoặc nhìn thấy trên màn hình được cho mã. Ví dụ, chữ hoa chữ A được đưa ra mã 65. Như vậy, một byte có giá trị 65 có thể nói là đại diện cho A. thư Cho rằng mã số trong khoảng 0-255 có sẵn, chúng ta có thể đại diện cho một trong 256 khác nhau ký tự trong một byte.
Trong môi trường theo đó bạn có thể sẽ được sử dụng ARM, 223 trong số các mã có thể được sử dụng để đại diện cho nhân vật bạn có thể nhìn thấy trên màn hình. 95 trong số này là những biểu tượng thông thường mà bạn nhìn thấy trên bàn phím, ví dụ như các chữ cái, chữ số và ký tự chấm câu. 128 Một là các ký tự đặc biệt, ví dụ như dấu chữ và các ký hiệu toán học. Còn lại 33 không được sử dụng để đại diện cho ký tự được in, nhưng có ý nghĩa đặc biệt.
số học nhị phân
Cũng như chúng ta có thể thực hiện nhiều hoạt động như phép cộng và trừ vào số thập phân, chúng ta có thể làm phép tính trên số nhị phân. Trong thực tế, thiết kế mạch để thực hiện, ví dụ, nhị Ngoài ra là dễ dàng hơn nhiều so với thiết kế những hoạt động trên các tín hiệu 'thập phân' (nơi chúng tôi sẽ có mười cấp điện áp thay vì hai), và đây là một trong những lý do chính để sử dụng hệ nhị phân .
Các quy tắc để thêm hai chữ số thập phân là:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 carry 1
Để thêm các số hai bốn-bit 0101 và 1001 (tức là 5 + 9), chúng tôi sẽ bắt đầu từ bên phải và thêm chữ số tương ứng. Nếu một carry được tạo ra (tức là khi thêm 1 và 1), nó được thêm vào các chữ số tiếp theo ở bên phải. Ví dụ:
0 | 1 | 0 | 1 | |
+ | 1 | 0 | 0 | 1 |
c | 1 | |||
1 | 1 | 1 | 0 |
= 8 + 4 + 2 = 14
trừ nhị phân được xác định một cách tương tự:
0-0 = 0
0-1 = 1 mượn 1
1-0 = 1
1-1 = 0
Một ví dụ là 1001 - 0101 (9-5 trong số thập phân):
1 | 0 | 0 | 1 | |
- | 0 | 1 | 0 | 1 |
b | 1 | |||
0 | 1 | 0 | 0 |
= 4
Cho đến nay, chúng tôi đã chỉ nói chuyện về những con số tích cực. Chúng tôi rõ ràng là cần để có thể đại diện cho số lượng tiêu cực quá. Một cách là sử dụng một chút (thường là MSB) để đại diện cho các dấu hiệu - 0 cho dương và 1 cho tiêu cực. Điều này giống như cách sử dụng một hoặc + - dấu khi viết các số thập phân. Đáng tiếc là nó có một số nhược điểm khi sử dụng với số học nhị phân, vì vậy không phải là rất phổ biến.
Cách phổ biến nhất của đại diện một số âm là sử dụng 'bổ sung hai của' ký hiệu. Chúng tôi có được đại diện cho một số -n chỉ đơn giản bằng cách thực hiện các phép trừ 0 - n. Ví dụ, để có được ký hiệu bổ sung của hai cho -4 trong một hệ thống số có bốn chút, chúng ta sẽ làm gì:
0 | 0 | 0 | 0 | |
- | 0 | 1 | 0 | 0 |
b | 1 | |||
1 | 1 | 0 | 0 |
Vì vậy, -4 trong ký hiệu bổ sung một bốn-bit hai là 1100. Nhưng chờ một chút! Chắc chắn 1100 là mười hai? Vâng, có và không. Nếu chúng ta đang sử dụng bốn bit để đại diện cho một số không dấu (tức là dương tính), sau đó có, 1100 là mười hai trong hệ thập phân. Nếu chúng ta sử dụng ký hiệu bổ sung hai nhân, sau đó một nửa của các kết hợp có thể (những người có MSB = 1) phải được sử dụng để đại diện cho một nửa tiêu cực của dãy số. Bảng dưới đây so sánh mười sáu con số có thể bốn bit trong unsigned và bổ sung hai của giải thích:
binary
|
Chưa ký
|
Hai nhân
bổ sung |
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | số 8 | -số 8 |
1001 | 9 | -7 |
1010 | 10 | -6 |
1011 | 11 | -5 |
1100 | 12 | -4 |
1101 | 13 | -3 |
1110 | 14 | -2 |
1111 | 15 | -1 |
Một trong những lợi thế của bổ hai của là số học hoạt động cũng như cho số âm như đối với những người tích cực. Ví dụ, để thêm 6 -3, chúng ta sẽ sử dụng:
0 | 1 | 1 | 0 | |
+ | 1 | 1 | 0 | 1 |
c | 1 | |||
0 | 0 | 1 | 1 |
Chú ý rằng khi hai MSB đã được thêm vào, một carry dẫn, được bỏ qua trong các câu trả lời chính thức. Khi chúng tôi thực hiện các phép tính số học trên máy tính, chúng ta có thể nói cho dù điều này xảy ra và có những hành động thích hợp.
Một số lưu ý cuối cùng về bổ sung hai của. Chiều rộng của số là quan trọng. Ví dụ, mặc dù năm 1100 đại diện cho -4 trong một hệ thống bốn-bit, 01.100 là 14 là hệ thống năm-bit. -4 Sẽ là 11100 như một số năm bit. Trên ARM, như hoạt động được trên các số 32-bit, phạm vi bổ sung của hai khoảng -2000000000 đến 2000000000.
Các số -1 luôn luôn là 'tất cả những người', tức là năm 1111 trong một hệ thống bốn-bit, 11111111 tám bit, vv
Để tìm phiên bản tiêu cực của một số n, đảo ngược tất cả các bit của nó (tức là làm cho tất cả các 1s vào trạng thái 0 và ngược lại) và thêm 1. Ví dụ, để tìm -10 ở dạng bổ sung một tám-bit hai của:
10 | là | 00001010 |
đảo ngược | là | 11110101 |
cộng với 1 | là | 11110110 |
hexadecimal
Đó là nhàm chán phải viết số trong hệ nhị phân như họ nhận được rất dài và khó nhớ. Số thập phân có thể được sử dụng, nhưng điều này có xu hướng che giấu ý nghĩa của các bit riêng lẻ trong một số. Ví dụ, 110.110 và 100.110 cái nhìn như thể chúng được kết nối trong hệ nhị phân, chỉ có một chút khác nhau, nhưng tương đương thập phân của họ 54 và 38 không nhìn vào tất cả các liên quan.
Để có được xung quanh vấn đề này, chúng ta thường gọi trên các dịch vụ của thêm một cơ sở số 16 hoặc thập lục phân. Lý thuyết chỉ là giống như với nhị phân và thập phân, với mỗi chữ số thập lục phân có một trong mười sáu giá trị khác nhau. Chúng tôi chạy ra khỏi con số bình thường vào lúc 9, vì vậy các chữ AF được sử dụng để đại diện cho các giá trị từ 11 đến 15 (trong số thập phân). Bảng dưới đây cho thấy mười sáu chữ số đầu tiên trong tất cả ba cơ sở:
binary
|
số thập phân
|
hexadecimal
|
0000 | 0 | 00 |
0001 | 1 | 01 |
0010 | 2 | 02 |
0011 | 3 | 03 |
0100 | 4 | 04 |
0101 | 5 | 05 |
0110 | 6 | 06 |
0111 | 7 | 07 |
1000 | số 8 | 08 |
1001 | 9 | 09 |
1010 | 10 | 0A |
1011 | 11 | 0B |
1100 | 12 | 0C |
1101 | 13 | 0D |
1110 | 14 | 0E |
1111 | 15 | 0F |
Hệ thập lục phân (hex hay, vì nó thường được viết tắt) số đều bắt đầu bằng một dấu & trong cuốn sách này để phân biệt với các số thập phân. Ví dụ, số hex & D9F là 13 * 16 2 + 9 * 16 + 15 hoặc 3487.
Những điều tốt về hex là nó rất dễ dàng để chuyển đổi giữa hex và biểu diễn nhị phân. Mỗi chữ số thập lục phân được hình thành từ bốn chữ số nhị phân nhóm từ cánh trái. Ví dụ:
11010110 = 1101 0110 = D 6 = & D6
11110110 = 1001 0110 = F 6 = & F6
Các ví dụ cho thấy một sự thay đổi nhỏ trong phiên bản nhị phân của một số tạo ra một sự thay đổi nhỏ trong các đại diện thập lục phân.
Các dãy số có thể được tổ chức trong bội số của byte khác nhau cũng dễ dàng để đại diện trong hex. Một byte duy nhất nắm giữ một số trong phạm vi & 00 & FF, hai byte trong phạm vi & 0000 để & FFFF và bốn byte trong phạm vi & 00000000 để & FFFFFFFF.
Như với nhị phân, cho dù một số hex được đại diện cho một số lượng tiêu cực là một vấn đề của giải. Ví dụ, các byte & FE có thể đại diện cho 254 hoặc -2, tùy thuộc vào cách chúng ta muốn giải thích nó.
Con số lớn
Chúng ta thường đề cập đến số lượng lớn. Để tiết kiệm phải gõ, ví dụ 65536, quá thường xuyên, chúng tôi sử dụng một vài chữ viết tắt hữu ích. Chữ K sau khi một số có nghĩa là 'Kilo' hoặc 'lần 1024'. (Lưu ý Kilo này là hơi lớn hơn so với kg (1000) sử dụng trong kg, vv) 1024 là hai sức mạnh mười và là một đơn vị thuận tiện khi thảo luận, nói rằng, khả năng bộ nhớ. Ví dụ, người ta có thể nói 'BBC Micro Model B có 32K byte RAM,' có nghĩa là 32 * 1024 hoặc 32768 byte.
Đối với số lượng lớn hơn, mega (abbr. M) được sử dụng để đại diện cho 1024 * 1024 hoặc chỉ hơn một triệu. Một ví dụ là "máy tính này có 1M byte của bộ nhớ RAM. '
Bộ nhớ và địa chỉ
Bộ nhớ của ARM được tổ chức như byte. Mỗi byte có địa chỉ riêng của nó, bắt đầu từ 0. Giới hạn trên lý thuyết về số byte ARM có thể truy cập được xác định bởi độ rộng của bus địa chỉ. Đây là 26 bit, do đó các địa chỉ cao nhất là (hơi thở sâu) 11111111111111111111111111 hoặc & 3FFFFFF hoặc 67.108.863. Điều này cho phép ARM để truy cập 64M byte của bộ nhớ. Trong thực tế, một hệ thống điển hình sẽ có một hoặc bốn megabyte, vẫn còn một số lượng rất hợp lý.
ARM được gọi là 32-bit vi. Điều này có nghĩa rằng nó đề với dữ liệu trong đơn vị 32-bit hoặc bốn-byte. Mỗi đơn vị như vậy được gọi là một từ (và 32-bit là từ chiều dài của ARM). Bộ nhớ được tổ chức như lời nói, mà có thể được truy cập hoặc là từ hoặc byte. ARM là một máy byte địa chỉ, bởi vì mỗi byte trong bộ nhớ có địa chỉ riêng của nó, trong chuỗi 0, 1, 2, và như vậy.
Khi các từ hoàn chỉnh truy cập (ví dụ như khi tải một hướng dẫn), ARM đòi hỏi một địa chỉ word-aligned, đó là, một trong đó là một bội số của bốn byte. Vì vậy, các từ hoàn chỉnh đầu tiên là tại địa chỉ 0, thứ hai tại địa chỉ 4, và như vậy.
Cách thức mà mỗi từ được sử dụng phụ thuộc hoàn toàn vào ý thích của các lập trình viên. Ví dụ, một từ cho có thể được sử dụng để giữ một lệnh, bốn nhân vật, hoặc một số 32-bit, hoặc 32 số một bit. Nó thậm chí có thể được sử dụng để lưu trữ các địa chỉ của một từ khác. ARM không đặt bất kỳ giải thích về nội dung của bộ nhớ, chỉ có các lập trình viên không.
Khi nhiều byte được sử dụng để lưu trữ số lượng lớn, có hai cách thức mà các byte có thể được tổ chức. Các (hơi) cách phổ biến hơn - được sử dụng bởi ARM - là để lưu trữ các byte trong thứ tự tăng dần ý nghĩa. Ví dụ, một số 32-bit được lưu trữ tại địa chỉ 8..11 sẽ có bit 0..7 tại địa chỉ 8, bit 8..15 tại địa chỉ 9, bit 16..23 tại địa chỉ 10, và bit 24..31 tại địa chỉ 11.
Nếu hai từ liên tiếp được sử dụng để lưu trữ một số 64-bit, từ đầu tiên sẽ chứa các bit 0..31 và từ thứ hai bit 32..63.
Có hai loại chính của bộ nhớ. Các chương trình bạn sẽ viết và các dữ liệu liên kết với chúng được lưu trữ trong bộ nhớ đọc / ghi. Như tên gọi của nó, điều này có thể được ghi vào (tức là thay đổi) hoặc đọc từ.Các chữ viết tắt phổ biến cho bộ nhớ đọc / ghi là RAM. Điều này xuất phát từ thuật ngữ bộ nhớ truy cập ngẫu nhiên nào gây hiểu lầm. Tất cả các bộ nhớ được sử dụng bởi ARM là truy cập ngẫu nhiên, cho dù nó được đọc / ghi hay không, nhưng RAM được chấp nhận rộng rãi để có nghĩa là đọc / ghi.
RAM thường là dễ bay hơi, có nghĩa là, nội dung của nó đều bị lãng quên khi điện bị ngắt. Hầu hết các máy cung cấp một lượng nhỏ bộ nhớ non-volatile (được hỗ trợ bởi một pin có thể sạc lại khi nguồn điện được tắt) để lưu trữ thông tin mà chỉ thay đổi rất ít, ví dụ như các ưu đãi về tỷ lệ lặp lại tự động bàn phím.
Các loại khác của bộ nhớ là ROM - Chỉ đọc bộ nhớ. Điều này được sử dụng để hướng dẫn lưu trữ và dữ liệu mà không được tẩy xóa, ngay cả khi điện bị ngắt. Ví dụ như các chương trình được tuân thủ khi ARM là lần đầu tiên bật được tổ chức trong ROM.
Tóm lược
Chúng ta đã thấy rằng các máy tính sử dụng hệ thống số nhị phân do "hai cấp" bản chất của các mạch từ đó chúng được xây dựng. số học nhị phân đơn giản để thực hiện trong chip. Để làm cho cuộc sống dễ dàng hơn cho con người chúng ta sử dụng ký hiệu thập lục phân để viết xuống số như địa chỉ mà sẽ chứa nhiều bit, và ngôn ngữ lắp ráp để tránh việc phải nhớ các mã lệnh nhị phân.
Tổ chức bộ nhớ của ARM bao gồm 16 megawords, mỗi trong số đó có bốn byte riêng địa chỉ.
1.4 Bên trong CPU
Trong phần này, chúng tôi nghiên cứu kỹ các CPU, đã được trình bày chỉ như một hộp đen cho đến nay. Chúng ta đã biết rằng các CPU trình bày hai bus với thế giới bên ngoài. Các xe buýt dữ liệu được sử dụng để truyền dữ liệu và hướng dẫn giữa CPU và bộ nhớ hoặc I / O. Các địa chỉ chứa địa chỉ của vị trí hiện tại được truy cập.
Có nhiều tín hiệu khác phát ra từ CPU. Ví dụ về các tín hiệu như trên ARM là r / w mà nói với thế giới bên ngoài liệu CPU sẽ đọc hoặc ghi dữ liệu; b / w này cho ta biết một truyền dữ liệu là để hoạt động trên chỉ là một byte hoặc toàn bộ một từ; và hai tín hiệu mà chỉ ra bốn 'chế độ' có thể ARM là trong.
Nếu chúng ta có thể kiểm tra các mạch điện của bộ vi xử lý chúng ta sẽ thấy hàng ngàn bóng bán dẫn, kết nối để tạo thành mạch logic thông thường. Những loại này bằng cái tên như cổng NAND, flip-flop, thùng shifter và đơn vị số học-logic (ALU).
May mắn cho chúng tôi lập trình viên, các tín hiệu và các thành phần được đề cập trong hai đoạn văn trước đó là rất ít quan tâm. Những gì chúng tôi quan tâm là cách tất cả các kết hợp để tạo thành một mô hình trừu tượng mà hành vi của chúng ta có thể kiểm soát bằng cách viết các chương trình. Đây được gọi là 'lập trình' mô hình ', và nó mô tả các bộ xử lý về những gì xuất hiện để các lập trình viên, chứ không phải là các mạch sử dụng để thực hiện nó.
Các chương tiếp theo mô tả một cách chi tiết mô hình của các lập trình viên của ARM. Trong phần này, chúng tôi sẽ hoàn tất cái nhìn đơn giản của chúng tôi tại kiến trúc máy tính bằng việc phác thảo các mục đích của các khối chính trong CPU. Như đã đề cập ở trên, một kiến thức của các khối không phải là quan trọng để chương trình viết bằng hợp ngữ. Tuy nhiên, một số thuật ngữ cây trồng lên sau đó, do không có hại trong học tập về họ.
Các hướng dẫn chu kỳ
Chúng tôi đã đề cập đến chu kỳ lấy giải mã-thực mà CPU thực hiện liên tục. Dưới đây là chi tiết hơn, bắt đầu từ khi CPU được thiết lập lại.
Bên trong CPU là một cửa hàng 24-bit hoạt động như một bộ đếm. Mở thiết lập lại, nó được thiết lập để & 000000. Quầy giữ địa chỉ của lệnh tiếp theo được lấy. Nó được gọi là chương trình truy cập (PC).Khi bộ xử lý đã sẵn sàng để đọc lệnh kế tiếp từ bộ nhớ, nó đặt nội dung của PC vào bus địa chỉ. Đặc biệt, các máy tính được đặt trên bit 2..25 của bus địa chỉ. Bit 0 và 1 là luôn luôn 0 khi CPU nạp một chỉ lệnh, như hướng dẫn luôn trên địa từ, bội nghĩa của bốn byte.
CPU cũng có kết quả đầu ra tín hiệu báo cho bộ nhớ rằng đây là một hoạt động đọc, và nó đòi hỏi cả một từ (như trái ngược với một byte duy nhất). Hệ thống bộ nhớ phản ứng với các tín hiệu bằng cách đặt các nội dung của ô địa chỉ trên để bus dữ liệu, nơi nó có thể được đọc bởi bộ xử lý. Hãy nhớ rằng các bus dữ liệu 32 bit rộng, do đó, một hướng dẫn có thể được đọc trong một hoạt động đọc.
Từ bus dữ liệu, các lệnh được chuyển vào giai đoạn đầu tiên của một khu vực lưu trữ ba giai đoạn bên trong CPU. Điều này được gọi là các đường ống, và bất cứ lúc nào nó có thể giữ ba hướng dẫn: một chỉ cường điệu, một trong những được giải mã, và một trong những đang được thực thi. Sau khi hướng dẫn đã hoàn tất thi công, đường ống được chuyển lên một nơi, vì vậy các chỉ dẫn vừa giải mã bắt đầu được thực hiện, các hướng dẫn được tải trước đây bắt đầu được giải mã, và các hướng dẫn tiếp theo là lấy từ bộ nhớ.
Giải mã các hướng dẫn liên quan đến việc quyết định chính xác những gì cần phải được thực hiện, và chuẩn bị các bộ phận của CPU cho việc này. Ví dụ, nếu giảng dạy là một sự bổ sung, hai số được thêm vào sẽ được lấy.
Khi một lệnh đạt đến giai đoạn thực hiện của các đường ống dẫn, các hành động thích hợp diễn ra, một phép trừ ví dụ, và các hướng dẫn tiếp theo, trong đó đã được giải mã, được thực thi. Ngoài ra, các máy tính được tăng lên để cho phép các lệnh kế tiếp để được lấy.
Trong một số trường hợp, nó không phải là có thể thực hiện lệnh pipelined tới vì ảnh hưởng của người cuối cùng. Một số hướng dẫn thay đổi một cách rõ ràng giá trị của máy tính, gây ra các chương trình để nhảy (giống như một GOTO trong BASIC). Khi điều này xảy ra, các hướng dẫn trước khi lấy không phải là điều đúng để thực hiện, và các đường ống phải được rửa (trống), và lấy giải mã chu kỳ bắt đầu từ vị trí mới. Xối rửa đường ống có xu hướng chậm thực hiện (vì lấy, giải mã và thực hiện chu kỳ không còn tất cả xảy ra cùng một lúc) nên ARM cung cấp nhiều cách để tránh nhiều của các bước nhảy.
ALU và shifter thùng
Nhiều hướng dẫn ARM sử dụng hai bộ phận rất quan trọng của CPU. Có một lớp học toàn bộ hướng dẫn, được gọi là các nhóm thao tác dữ liệu, sử dụng các đơn vị này. Các đơn vị số học-logic thực hiện các hoạt động như cộng, trừ và so sánh. Đây là các phép tính số học. hoạt động hợp lý bao gồm AND, EOR và OR, được mô tả trong các chương tiếp theo.
ALU có thể được coi như một hộp đen trong đó có hai số 32-bit như đầu vào, và tạo ra một kết quả 32-bit. Các mạch hướng dẫn giải mã cho ALU mà các tiết mục hoạt động của mình để thực hiện bằng cách kiểm tra các chỉ dẫn. Nó cũng làm việc ra nơi để tìm hai số đầu vào - các toán hạng - và nơi để đặt kết quả từ lệnh.
Các thùng shifter có hai đầu vào - một từ 32-bit được chuyển dịch và một số - và một đầu ra - một 32-bit word. Như tên gọi của nó, các thùng shifter có được sản lượng của nó bằng cách thay đổi các bit của toán hạng trong một số cách. Có một số hương vị của sự thay đổi: đó chỉ đạo các bit được chuyển trong, cho dù các bit ra khỏi một đầu tái xuất hiện ở đầu kia vv Giống hoạt động dịch chuyển trên ARM được mô tả trong các chương tiếp theo.
Các đặc tính quan trọng của thùng shifter là không có vấn đề gì loại thay đổi nó, và bao nhiêu bit, nó luôn luôn chỉ có một 'đánh dấu' của đồng hồ tổng thể của CPU để làm điều đó. Điều này là tốt hơn nhiều so với nhiều 16 và 32-bit xử lý, mà phải mất một thời gian tỉ lệ với số ca cần thiết.
Đăng ký
Khi chúng tôi nói chuyện về dữ liệu được chuyển từ bộ nhớ đến CPU, chúng tôi không đề cập đến chính xác nơi trong CPU dữ liệu đi. Một phần quan trọng của CPU là ngân hàng đăng ký. Trong thực tế, từ quan điểm của lập trình viên của xem, các thanh ghi quan trọng hơn các thành phần khác như ALU, vì họ là những gì ông thực sự 'thấy' khi viết chương trình.
Sổ đăng ký là một từ lưu trữ, giống như một vị trí bộ nhớ. Trên ARM, tất cả đăng ký là một từ lâu, tức là 32 bit. Có một số khác biệt quan trọng giữa bộ nhớ và thanh ghi. Thứ nhất, đăng ký không phải là "bộ nhớ ánh xạ ', có nghĩa là họ không có địa chỉ 26-bit như phần còn lại của lưu trữ và I / O trên ARM.
Bởi vì đăng ký là trên chip CPU chứ không phải là một phần của một hệ thống bộ nhớ bên ngoài, CPU có thể truy cập nội dung của họ rất nhanh chóng. Trong thực tế, hầu như tất cả các hoạt động trên ARM liên quan đến việc sử dụng các thanh ghi. Ví dụ, hướng dẫn Thanh cho biết thêm hai số 32-bit để tạo ra một kết quả 32-bit. Cả hai con số được thêm vào, và điểm đến của kết quả, được quy định như đăng ký ARM. Nhiều CPU cũng có hướng dẫn, ví dụ, thêm một số được lưu trữ trong bộ nhớ để đăng ký một. Đây không phải là trường hợp trên ARM, và các hoạt động chỉ đăng ký bộ nhớ là tải và lưu trữ những người thân.
Sự khác biệt thứ ba là có đăng ký ít hơn rất nhiều vị trí nhớ. Như chúng tôi đã nói trước đó, ARM có thể địa chỉ lên đến 64M byte (16 triệu từ) bộ nhớ bên ngoài. Bên trong, chỉ có 16 thanh ghi có thể nhìn thấy cùng một lúc. Đây được gọi trong chương trình như R0 đến 15. Một cặp vợ chồng của các thanh ghi được đôi khi được đặt tên đặc biệt; ví dụ R15 còn được gọi là máy tính, vì nó nắm giữ các chương trình truy cập giá trị mà chúng tôi đề cập ở trên.
Như chúng ta sẽ thấy trong chương tiếp theo, bạn thường có thể sử dụng bất kỳ đăng ký để giữ các toán hạng và kết quả, có được không phân biệt ví dụ như giữa R0 và R12. sẵn có này của một lớn (so với nhiều CPU) số đăng ký truy cập nhanh chóng góp phần vào danh tiếng của ARM như một bộ xử lý nhanh.
1.5 Một chương trình nhỏ
Chương này sẽ irredeemably tẻ nhạt nếu chúng ta không bao gồm ít nhất một ví dụ của một chương trình hợp ngữ. Mặc dù chúng tôi đã không thực sự gặp bộ của ARM các hướng dẫn nêu ra, bạn sẽ có thể làm cho một số ý nghĩa của chương trình đơn giản dưới đây.
Ở bên trái là danh sách của một BASIC đơn giản cho vòng lặp mà in 20 ngôi sao trên màn hình. Bên phải là chương trình hợp ngữ ARM, thực hiện các nhiệm vụ tương tự.
CĂN BẢN
|
Ngôn ngữ ARM hội
|
10 i = 1 | MOV R0, # 1; Khởi tạo số |
20 IN "*"; | .loop SWI writeI + "*"; In một * |
30 i = i + 1 | ADD R0, R0, # 1; đếm Tăng |
40 NẾU i <= 20 THEN 20 | CMP R0, # 20; So sánh với giới hạn |
vòng lặp BLE |
Ngay cả nếu điều này là chương trình ngôn ngữ lắp ráp đầu tiên bạn đã thấy, hầu hết các hướng dẫn ARM nên tự giải thích. Từ vòng đánh dấu nơi trong chương trình được sử dụng bởi các BLE (chi nhánh nếu ít hơn hoặc bằng) hướng dẫn. Nó được gọi là một nhãn hiệu, và hoàn thành một chức năng tương tự như số dòng trong một hướng dẫn BASIC như GOTO 20 .
Một điều bạn sẽ nhận thấy về chương trình ARM là nó là một đường dài hơn một BASIC. Điều này là bởi vì nói chung, một hướng dẫn ARM duy nhất hiện ít xử lý hơn là một BASIC. Ví dụ, BASIC NẾUtuyên bố thực hiện chức năng của hai hướng dẫn ARM CMP và BLE . Hầu như không thay đổi, một chương trình viết bằng hợp ngữ sẽ chiếm đường nhiều hơn là một tương đương viết bằng ngôn ngữ cấp cao khác BASIC hoặc một số người, thường là bằng một tỷ lệ lớn hơn nhiều so với một minh họa.
Tuy nhiên, khi lắp ráp, các chương trình ARM trên sẽ chiếm năm từ (một chỉ dẫn cho mỗi) hoặc 20 byte. Các chương trình BASIC, như thể hiện, có 50 byte, vì vậy kích thước của chương trình hợp ngữ ( 'nguồn gốc') có thể gây hiểu nhầm. Hơn nữa, một phiên bản ngôn ngữ biên dịch chương trình, ví dụ, một trong Pascal:
for i: = 1-20 làm write ( '*');
chiếm dòng nguồn thậm chí ít hơn, nhưng khi biên dịch thành mã máy ARM sẽ sử dụng nhiều hơn 5 hướng dẫn - con số chính xác tùy thuộc vào cách thức tốt các trình biên dịch là.
1.6 Tóm tắt chương 1
Đối với người đọc mới để lập trình hợp ngữ, chương này đã giới thiệu rất nhiều khái niệm, một số trong số họ khó nắm bắt về đọc đầu tiên. Chúng tôi đã thấy các máy tính thế nào - hoặc CPU đặc biệt - đọc hướng dẫn từ bộ nhớ và thực thi sau đó. Các hướng dẫn chỉ đơn giản là mô hình của 1s và 0s, mà rõ ràng là khó khăn đối với con người để đối phó với một cách hiệu quả. Như vậy chúng ta có nhiều cấp độ của đại diện, mỗi một là tiếp tục những gì mà các CPU thấy và gần gũi hơn với ngôn ngữ lập trình lý tưởng của chúng tôi, đó sẽ là một phiên bản rõ ràng của tiếng Anh.
Mức thấp nhất của đại diện mà con người sử dụng, và là chủ đề của cuốn sách này, là ngôn ngữ lắp ráp. Trong ngôn ngữ này, mỗi lệnh xử lý được đưa ra một cái tên, hoặc ghi nhớ, đó là dễ dàng hơn để nhớ hơn một chuỗi các số nhị phân. Một chương trình lắp ráp là một danh sách các hướng dẫn dễ nhớ, cộng với một số mặt hàng khác như nhãn và toán hạng. Chương trình này được chuyển đổi thành dạng nhị phân CPU có thể xử lý bằng một chương trình gọi là một nhà lắp ráp. Không giống như các ngôn ngữ cấp cao, có sự tương ứng một-một giữa các hướng dẫn lắp ráp và hướng dẫn nhị phân.
Chúng tôi đã học về biểu diễn nhị phân của số, cả chữ ký và dấu, và thấy cách phép tính số học đơn giản như phép cộng và phép trừ có thể được thực hiện trên chúng.
Tiếp theo, chúng ta nhìn vào bên trong CPU để hiểu rõ hơn về những gì diễn ra khi một lệnh được lấy từ bộ nhớ và thực thi. Các phần chính của CPU như ALU và shifter thùng đã được đề cập. Một kiến thức số này là không quan trọng đối với lập trình trong lắp ráp, nhưng như các điều khoản cắt lên trong các mô tả chi tiết về các tập lệnh của ARM, nó rất hữu ích để biết họ.
Cuối cùng, chúng tôi trình bày một chương trình hợp ngữ rất nhỏ để so sánh và tương phản với một chương trình chức năng tương đương văn bản trong BASIC.
1 Comment:
cảm ơn ad bài rất cụ thể
Đăng nhận xét
Thank you for your comments!