2015-02-23 20 views
19

Tôi hơi bối rối về tập lệnh. Có Thumb, ARM và Thumb 2. Từ những gì tôi đã đọc Thumb hướng dẫn là tất cả 16-bit nhưng bên trong hướng dẫn sử dụng ARMv7M (trang vi) có Thumb 16-bit và Thumb 32-bit hướng dẫn được đề cập.ARM, Thumb và Thumb 2 hướng dẫn nhầm lẫn

Bây giờ tôi phải vượt qua sự nhầm lẫn này. Người ta nói rằng Thumb 2 hỗ trợ 16-bit và 32-bit hướng dẫn. Vậy ARMv7M có thực sự hỗ trợ các chỉ dẫn Thumb 2 chứ không chỉ Thumb?

Một điều nữa. Tôi có thể nói rằng Thumb (32-bit) là giống như hướng dẫn ARM đó là allso 32-bit?

+0

* Tôi có thể nói rằng Thumb (32-bit) giống với hướng dẫn ARM cũng là 32-bit không? * Câu trả lời là không. Thumb2 là sự kết hợp của 32/16bits với các mã hóa khác nhau so với ARM 32 bit thẳng. –

Trả lời

38

Oh, ARM và đặt tên ngớ ngẩn của họ ...

Đó là một quan niệm sai lầm phổ biến, nhưng chính thức không có những điều như một "Thumb-2 tập lệnh".

Bỏ qua ARMv8 (nơi mọi thứ được đổi tên và AArch64 làm phức tạp mọi thứ), từ ARMv4T tới ARMv7-A có hai bộ hướng dẫn : ARM và Thumb. Cả hai đều là "32-bit" theo nghĩa là chúng hoạt động trên dữ liệu lên tới 32-bit trên các thanh ghi rộng 32 bit với các địa chỉ 32 bit. Trong thực tế, khi chúng chồng chéo chúng đại diện cho cùng một hướng dẫn chính xác - nó chỉ là hướng dẫn mã hóa khác biệt, và CPU có hiệu quả chỉ có hai đầu trước giải mã khác nhau cho đường ống mà nó có thể chuyển đổi giữa. Để rõ ràng, bây giờ tôi sẽ cố ý tránh các thuật ngữ "32-bit" và "16-bit" ...

Hướng dẫn ARM có mã hóa 4 byte có chiều rộng cố định yêu cầu căn chỉnh 4 byte. Hướng dẫn ngón tay cái có độ dài thay đổi (2 hoặc 4 byte, bây giờ được gọi là mã hóa "hẹp" và "rộng") yêu cầu liên kết 2 byte - hầu hết các hướng dẫn đều có mã hóa 2 byte, nhưng blblx luôn có mã hóa 4 byte *. Bit thực sự khó hiểu đến trong ARMv6T2, giới thiệu "Công nghệ Thumb-2". Thumb-2 bao gồm không chỉ bổ sung thêm hướng dẫn cho Thumb (chủ yếu với mã hóa 4 byte) để mang nó gần như ngang bằng với ARM, mà còn mở rộng trạng thái thực thi để cho phép thực hiện có điều kiện hầu hết các lệnh Thumb và cuối cùng giới thiệu toàn bộ cú pháp lắp ráp mới (UAL, "Unified Assembly Language") đã thay thế các cú pháp ARM và Thumb riêng biệt trước đó và cho phép viết mã một lần và lắp ráp nó vào một trong hai lệnh mà không sửa đổi. Các cấu trúc Cortex-M chỉ thực hiện bộ lệnh Thumb - ARMv7-M (Cortex-M3/M4/M7) hỗ trợ hầu hết các "Công nghệ Thumb-2", bao gồm thực thi và mã hóa có điều kiện cho các hướng dẫn VFP, trong khi ARMv6- M (Cortex-M0/M0 +) chỉ sử dụng Thumb-2 dưới dạng một số ít các lệnh hệ thống 4 byte.

Như vậy, mã hóa 4-byte mới (và những bổ sung sau này trong các phiên bản ARMv7) vẫn còn hướng dẫn Thumb - những "Thumb-2" khía cạnh của họ là họ thể có 4-byte mã hóa, và rằng họ có thể (chủ yếu) được thực thi theo điều kiện thông qua it (và, tôi cho rằng, kinh nghiệm của họ chỉ được định nghĩa trong UAL).

* Trước ARMv6T2, nó thực sự là một chi tiết triển khai phức tạp về việc liệu bl (hoặc blx) đã được thực hiện dưới dạng lệnh 4 byte hay là một chỉ dẫn 2 byte. Định nghĩa kiến ​​trúc là thứ hai, nhưng vì chúng chỉ có thể được thực hiện như một cặp theo thứ tự nên có rất ít mất (trừ khả năng ngắt quãng nửa chừng) bằng cách kết hợp chúng thành một lệnh duy nhất cho các lý do hiệu suất.ARMv6T2 chỉ định nghĩa lại mọi thứ liên quan đến việc thực hiện lệnh đơn hợp nhất

+2

Đồng thời, trong * Thumb2 *, có các mã op được thêm vào theo thời gian. Vì vậy, không phải tất cả * Thumb2 * là như nhau. Từ quan điểm CPU chính, không có chế độ nào được gọi là * Thumb2 * (Tôi nghĩ đó là ý của bạn là 'chính thức'); chắc chắn giữ ARM dường như có một ý tưởng * Thumb2 * như được trộn lẫn 16/32 bit mã hóa, nhưng khác hơn là nó là nebulous. –

+0

Cảm ơn bạn! Điều này sắp xếp cho tôi. Dù sao tôi đã đi đến một hội chợ thế giới nhúng được tổ chức tại Nürnberg hai ngày trước và nó thật tuyệt vời. Tôi có rất nhiều thông tin về ARM. Sự kiện tuyệt vời! – 71GA

9

Ngoài Notlikethat's answer và ARMv8 giới thiệu một số thuật ngữ mới để giảm bớt sự nhầm lẫn (tất nhiên thêm thuật ngữ mới hơn):

Có trạng thái thực thi 32 bit (AArch32) và trạng thái thực thi 64 bit (AArch64).

Trạng thái thực thi 32 bit hỗ trợ hai bộ lệnh khác nhau: T32 ("Ngón tay cái") và A32 ("ARM"). Trạng thái thực thi 64 bit chỉ hỗ trợ một bộ lệnh - A64.

Tất cả A64, giống như tất cả A32, hướng dẫn có kích thước 32 bit (4 byte), yêu cầu căn chỉnh 4 byte.

Nhiều/nhiều hướng dẫn A64 có thể hoạt động trên cả thanh ghi 32 bit và 64 bit (hoặc cho là 32 bit hoặc 64 bit của cùng một thanh ghi 64 bit cơ bản).

Tất cả bộ vi xử lý ARMv8 (giống như tất cả các bộ vi xử lý ARMv7) đều hỗ trợ các chỉ dẫn Thumb-2 trong bộ hướng dẫn T32.

+0

Tôi không có đủ danh tiếng để bình luận về câu trả lời của unixsmurf trực tiếp nhưng nó cần một tinh chỉnh. Một lõi vi xử lý ARMv8A có sự lựa chọn để không thực hiện trạng thái aarch32 ở tất cả. Một lõi như vậy sẽ không hỗ trợ hướng dẫn T32 cũng như A32. Nếu một lõi bộ xử lý đã cho _does_ thực hiện trạng thái aarch32 (như ARM ltds 'cortex-A53, A57 và A72) thì nó cũng hỗ trợ chế độ Thumb-2 ở trạng thái đó. – wmills

+0

@ wmills: bạn vừa nhận xét trực tiếp :) Bạn có thể thêm giải thích của riêng mình làm câu trả lời. – unixsmurf

+1

@wmills Thật vậy, vì câu trả lời này được viết, [một số người trong số họ không hỗ trợ AArch64 hoặc] (http://www.arm.com/products/processors/cortex-a/cortex-a32-processor.php);) – Notlikethat

Các vấn đề liên quan