Tiểu luận tổ chức bộ nhớ và lập trình bằng ngôn ngữ assembly

28 881 0
Tiểu luận tổ chức bộ nhớ và lập trình bằng ngôn ngữ assembly

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Đề tài: Tổ chức bộ nhớ và lập trình bằng ngôn ngữ assembly Giảng viên: Bùi Công Trường Lớp:DHTH5A Nhóm đề tài: nhóm 8 Tên MSSV Hà Đình Sử 09219411 Phạm Thắng 09206671 Nguyễn Quang Minh 09220461Tổ chức bộ nhớ và ngôn ngữ lập trình assembly Mục tiêu: Khi hoàn thành bài này, bạn sẽ có thể: o Mô tả một hệ bộ nhớ tiêu biểu được tổ chức dưới dạng địa chỉ bộ nhớ như thế nào o Mô tả mối quan hệ giữa một kiến trúc tập lệnh của máy tính và tập lệnh hợp ngữ; Và o Sử dụng những cách đánh địa chỉ đơn giản để viết một chương trình hợp ngữ đơn giản. Lời mở đầu Bài học này sẽ bắt đầu quá trình chuyển đổi từ nhà thiết kế phần cứng sang các kỹ sư phần mềm. Chúng tôi sẽ đem những gì chúng tôi đã tích lũy về hành vi của phần cứng để cho thấy được nó có mối liên quan như thế nào đến kiến trúc tập lệnh (ISA) của một bộ vi xử lý điển hình. Nghiên cứu của chúng tôi về kiến trúc sẽ giúp được các nhà phát triển phần mềm hiểu rõ những kiến trúc để phát huy những lợi ích tốt nhất của nó. Trong ý nghĩa đó, nghiên cứu của chúng tôi về ngôn ngữ assembly sẽ là một ẩn dụ cho việc nghiên cứu các kiến trúc của máy tính. Quan điểm này là khác biệt với những người muốn có khả năng thiết kế phần cứng máy tính. Nội dung xuyên suốt trong cuốn sách này của chúng tôi đã được dựa trên sự hiểu biết về phần cứng và các vấn đề kiến trúc để phát triển phần mềm bổ sung cho việc thiết kế các phần cứng phía dưới. Chúng tôi đang đi tiên phong nghiên cứu kiến trúc của các bộ vi xử lý Motorola 68.000. ISA 68K là một kiến trúc hoàn chỉnh đầu tiên, xuất sưởng vào đầu những năm 1980. Đó sẽ là một câu hỏi công bằng nếu hỏi: "Tại sao tôi lại học tập với một kiến trúc máy tính cũ? Có phải nó đã lỗi thời không? ". Câu trả lời vang dội là: " Không! "Kiến trúc 68K là một trong những kiến trúc máy tính phổ biến nhất của mọi thời đại và ứng dụng nền tảng 68K vẫn còn đang được thiết kế sản phẩm mới vào mọi thời điểm. Palm PDA vẫn sử dụng một bộ xử lý 68K phái sinh. Ngoài ra, một bộ xử lý hoàn toàn mới từ Motorola, các dòng ColdFire ®, sử dụng kiến trúc 68K, và ngày hôm nay, nó là một trong những bộ vi xử lý phổ biến nhất được sử dụng. Ví dụ, ColdFire được sử dụng trong hầu hết các máy in phun. Trong chương tiếp theo, chúng tôi cũng sẽ giới thiệu sự khác biệt giữa hai kiến trúc phổ biến, các bộ vi xử lý dòng Intel ® X86 và dòng ARM. Với những bộ vi xử lý theo kiến trúc vành đai ba lớp, chúng ta sẽ được làm quen với máy tính phổ biến nhất trên thế giới ngày nay. Phần lớn những gì chúng tôi sẽ thảo luận khi chúng tôi bắt đầu nghiên cứu sẽ được dùng chung cho cả 3 dòng bộ vi xử lý, vì thế việc học tập là một trong những kiến trúc tốt cũng như một khi đạt được sự hiểu biết về các nguyên tắc cơ bản. Một lý do khác để bắt đầu với 68000 là kiến trúc phù hợp với quá trình học tập. Địa chỉ bộ nhớ khá đơn giản và từ quan điểm của nhà phát triển phần mềm. Mối liên kết với các ngôn ngữ cấp cao dễ dàng để hiểu. Chúng tôi sẽ bắt đầu bằng cách nhìn lại vào mô hình bộ nhớ và sử dụng như là một bước nhảy ra cho chúng tôi nghiên cứu các cách thức máy tính thật sự đọc và ghi vào bộ nhớ. Từ khía cạnh phần cứng, chúng tôi đã nắm bắt được vì chúng tôi vừa hoàn thành việc nghiên cứu về nó, nhưng bây giờ chúng tôi sẽ nhìn về khía cạnh ISA. Xuyên suốt quá trình, chúng tôi sẽ xem tại sao sự kì lạ thường xuyên này của cách nhìn vào bộ nhớ thật sự là rất quan trọng từ điểm nhìn của ngôn ngữ cấp cao hơn, chẳng hạn như C và C++. Thưa các bạn, bắt đầu khởi động … Quy ước lưu trữ bộ nhớ Khi bắt đầu nhìn từ cấp độ kiến trúc bạn sớm nhận ra rằng mối quan hệ giữa bộ xử lí và bộ nhớ là một yếu tố quan trọng để xác định hành vi và hoạt động đặc trưng của máy. Nhiều máy tính thật sự hoàn thành nó, công việc lập trình xung quanh giao diện của nó vào bộ nhớ. Vì thế bạn sẽ sớm thấy khi chúng tôi bắt đầu từ chương trình trong ngôn ngữ assembly, hầu hết các máy tính làm việc đều liên quan tới việc di chuyển dữ liệu trong và ngoài bộ nhớ. Thực ra nếu bạn tạo biểu đồ cột của hướng dẫn ngôn ngữ assembly được sử dụng trong một chương trình, dù chương trình ban đầu được viết bằng ngôn ngữ C++ hay assembly, bạn sẽ tìm thấy hướng dẫn sử dụng là MOVE hướng dẫn. Vì vậy, một trong những bài đầu tiên của chúng tôi kinh doanh là xây dựng trên sự hiểu biết của chúng tôi như thế nào về tổ chức hệ thống bộ nhớ và nhìn vào hệ thống bộ nhớ từ các tiềm năng của các bộ vi xử lý. Hình 7.1 là bản đồ cho bộ nhớ của bộ xử lí 68K. Bộ xử lí có thể một địa chỉ 16.777.216 (16-M) bye của bộ nhớ. Nó có 23 dòng chữ địa chỉ bên ngoài và 2 byte selecter điều khiển tín hiệu để lựa chọn một hoặc khác của 2 bye lưu trữ trong từ xác định. Bus dữ liệu ngoài là 16 bit rộng, nhưng đường dữ liệu bên trong là cả 12 bit rộng. Tiếp theo thành viên của gia đình 68K, bắt đầu với 68020, tất cả có 32 bit dữ liệu ngoài. Trong hình 7.1 chúng ta thấy, đầu tiên 128K từ (128 bit) của bộ nhớ từ dãy 0x000000 đến 0x01FFFE. Vùng này điển hình là mã chương trình và những vùng vectơ. Hiểu thoáng qua, vùng đọc/ghi của bộ nhớ là nơi mà các biến được lưu trữ. Phần còn lại của không gian bộ nhớ chứa địa chỉ của I/O cho các thiết bị. Tất cả các phần còn lại của bộ nhớ trong hình 7.1 là không gian trống rỗng. Ngoài ra, chúng ta sẽ thấy lý do tại sao trong một thời điểm các địa chỉ cho từ cuối cùng của ROM và từ cuối cùng của RAM tương ứng là 0x01FFFE và 0xFFFFFE. Kể từ thế hệ 8 bit hoặc 1 byte, nó là dung lượng lưu trữ nhỏ nhất mà chúng tôi sử dụng, điều đó cũng dễ hiểu khi chúng tôi đang phải làm việc trên những bộ nhớ cũng có 8 bit. Tuy nhiên, tất cả máy tính của chúng tôi đều có độ rộng vùng nhớ là 32 bit và rất nhiều máy tính được sử dụng ngày nay có độ rộng 16 bit đường dẫn dữ liệu. Như một ví dụ cực đoan, chúng tôi không muốn lãng phí 24 bit của không gian lưu trữ, đơn giản chỉ vì chúng tôi muốn lưu giữ một số lượng 8-bit trong một bộ nhớ 32-bit, do đó, các máy tính được thiết kế để cho phép địa chỉ byte. Điều đó có nghĩa là địa chỉ byte trong một từ 32-bit như là một ví dụ về phân trang với địa chỉ trang từ 32-bit và bù đắp được trong bốn vị trí byte có thể trong trang. Tuy nhiên, có một sự khác biệt lớn giữa địa chỉ byte và phân trang thực sự. Với địa chỉ byte, chúng tôi không có địa chỉ từ riêng biệt mà tương ứng với một địa chỉ trang. Hình 7,2 cho thấy sự khác biệt này rất quan trọng. Chúng tôi gọi đây là loại bộ nhớ lưu trữ byte đóng gói vì chúng ta là nghĩa đen đóng gói đầy đủ 32- bit bộ nhớ vào 1 byte. Loại địa chỉ này giới thiệu một vài sự mơ hồ. Một, là khá nghiêm trọng, và mọi thứ khác là mới đối với chúng tôi. Chúng tôi sẽ thảo luận về sự nghiêm trọng này trong giây lát. Căn cứ theo hình 7,2 chúng ta thấy rằng lúc địa chỉ bộ nhớ byte FFFFF0 (char) và từ 32-bit dài (int) tại FFFFF0 có cùng địa chỉ. Có phải là thảm họa này đang chờ để xảy ra? Câu trả lời là "có thể". Trong C và C + +, ví dụ bạn phải khai báo một biến và kiểu của nó trước rồi bạn mới có thể sử dụng nó Bây giờ bạn sẽ nhìn thấy lý do của việc đó. Trừ khi trình biên dịch biết kiểu của biến được lưu trữ tại địa chỉ FFFFF0, nó không biết loại mã nó phải tạo ra để thao tác nó. Ngoài ra, nếu bạn muốn lưu trữ một char tại FFFFF0, sau đó trình biên dịch có biết cần bao nhiêu không gian lưu trữ để phân bổ vào nó. Ngoài ra, thông báo rằng chúng tôi không thể truy cập địa chỉ 32-bit tại những địa chỉ khác với những vùng được chia 4. Một số bộ xử lý sẽ cho phép chúng tôi để lưu trữ một giá trị 32-bit tại một ranh giới kỳ lạ, như địa chỉ byte 000003-000006, nhưng phần lớn sẽ không cho. Lý do là bộ xử lý sẽ phải làm thêm một số hoạt động để đọc toàn bộ giá trị bộ nhớ và sau đó làm một số công việc phụ để tái tạo lại các byte vào đúng trình tự. Chúng tôi gọi đây là truy cập một nonaligned và nó thường khá tốn kém về hiệu suất xử lý để cho phép nó xảy ra. Trong thực tế, nếu bạn nhìn vào bản đồ các tiến trình lưu trữ và cấu trúc của bộ nhớ, bạn thường sẽ thấy không gian của vùng dữ liệu, tương ứng với khoảng cách cố ý để không tạo ra các vùng dữ liệu chứa nonaligned truy cập. Ngoài ra, nhận thấy rằng khi chúng tôi thực hiện truy cập từ 32-bit, bít địa chỉ a0 và a1 không sử dụng. Điều này khiến chúng ta tự hỏi: “Nếu chúng ta không sử dụng chúng thì chúng có lợi ích gì?”. Tuy nhiên chúng tôi cần chúng khi chúng tôi cần truy cập một byte đặc biệt từ 32-bit. A0 và A1 thường được gọi là dòng địa chỉ byte selector. Bởi vì đó là chứng năng chính của chúng. Điểm khác biệt là chúng ta thật sự cần byte selecters khi chúng tôi đang viết vào bộ nhớ. Đọc từ bộ nhớ khá vô hại, nhưng việc viết sẽ làm thay đổi mọi thứ. Do đó, bạn muốn chắc chắn rằng bạn sử đổi duy nhất byte bạn quan tâm mà không phải là thứ khác. Từ quan điểm của nhà thiết kế phần cứng có byte selecter cho phép bạn đủ điều kiện ghi thao tác một lần byte mà bạn quan tâm. Nhiều bộ vi xử li sẽ không rõ ràng tại tất cả những dòng địa chỉ byte selecter . Thay vào đó, họ cung cấp tình trạng bus trạng thái khi đủ điều kiện thao tác GHI vào bộ nhớ. Sẽ có điều gì khi lưu trữ vô sô 16-bit (một kiểu dữ liệu ngắn) trong vùng bộ nhớ 32-bit? Cùng một quy tắc được áp dụng trong trường hợp này. Chỉ có những địa chỉ hợp lệ sẽ là những địa chỉ chia hết cho 2, như là 000000, 000002, 000004,… Trong trường hợp địa chỉ 16-bit, thứ tự thấp nhất địa chỉ bit, A0, là không cần thiết. Đối với bộ xử li 68K của chúng tôi, khi có bus dữ liệu rộng 16-bit đến bộ nhớ. Chúng tôi có thể lưu trữ 2 byte trong mỗi từ của bộ nhớ. Do đó, A0 không được sử dụng cho các địa chỉ từ và trờ thành byte selector cho bộ xử lí. Hình 7.3 cho thấy bộ xử lí 32-bit điển hình và giao diện bộ nhớ hệ thống. ĐỌC tín hiểu từ bộ xử lí và tín hiệu CHIP SELECT đã được bỏ qua cho rõ ràng. Bộ xử lí có một bus dữ liệu 32-bit và một bus địa chỉ 32-bit. Các chip bộ nhớ đại diên cho tương ứng với một mặt của RAM ở đâu đó trong không gian của bộ xử lí. Các mặt chính xác của bô nhớ sẽ được xác định bằng việc thiết kế của người giải mã địa chỉ khối logic. Các chip RAM có khả năng của 1 Mbit và có được 128K của 8. Từ khi chúng tôi chó bus địa chỉ rộng 32-bit và mỗi chip RAM có 8 dòng dữ liệu I/O, chúng tôi cần 4 chip bộ nhớ trên bề rộng 128K. Chip #1 được nối với dòng dữ liệu D0 qua D7 và chip #2 được được nối từ dòng dư liệu D8 qua D15, chip #3 được nối từ dòng dữ liệu D6 qua D23 và chip #4 được nối từ dòng dữ liệu D24 qua D31, và tương tự. Các bus địa chỉ từ bộ xử lí có 30 dòng địa chỉ, có nghĩa là nó có khả năng của dài 2 30 từ (rộng 32- bit). Bổ sung các bit địa chỉ cần thiết đến địa chỉ đầy đủ khoảng 2 32 byte được mặc định điều khiển bởi bộ xử lí trong và điều khiển một cách rõ ràng qua tín hiệu 4 WRITE ENABLE có nhãn WE0 qua WE3. Dòng địa chỉ A2 qua A18 từ bộ xủ lí được kết nối đến địa chỉ đầu vào A0 qua A16 của các chip RAM, với A2 từ bộ xủ lí được nối tới A0 trên mỗi chip 4, và tương tự. Điều này có vẻ kỳ quặc lúc đầu, nhưng nó sẽ làm bạn hiểu sau khi bạn nghĩ về nó. Thật ra, không có lý do đặc biệt mà mỗi dòng địa chỉ từ bộ xử lí phải được nối với ống dữ liệu vào trên mỗi thiết bị nhớ. Cho ví dụ, A2 từ bộ xử lí có thể được nối tới A14 của chip #1, A3 của chip #2, A8 của chip #3 và A16 của chip #4. Địa chỉ cùng bộ xử lí sẽ giải quyết rõ ràng các địa chỉ byte khác nhau trong mỗi 4 bộ nhớ chip. Nhưng miễn là tất cả 17 dòng địa chỉ từ bộ xử lí được nối với 17 dòng địa chỉ của các thiết bị nhớ, bộ nhớ phải hoạt động đúng. Trên các bit địa chỉ từ bộ xử lý, A19 qua A31 được sử dụng cho qua trình lựa chọn trang. Các tín hiệu này được chuyển đến địa chỉ giải mã logic nơi mà các tín hiệu CHIP SELECT thích hợp được tạo ra. Các tín hiệu này đã được bỏ qua từ hình 7.3. Có 13 cao mệnh lệnh địa chỉ bit trong ví dụ này. Điều này cho chúng ta 213 hoặc 8,192 trang của bộ nhớ. Mỗi trang của bộ nhớ giữ 128K từ rộng 32- bit, khi làm việc là 2 30 từ. Trong điều kiện của địa chỉ, mỗi trang thực sự chứa 512 Kbytes, vì thế phạm vi byte địa chỉ trên mỗi trang đi từ địa chỉ byte (Trong HEX) 00000 qua 7FFFF. Nhớ lại rằng trong sơ đồ bộ nhớ này, có 8192 trang với mỗi trang chứa 512 Kbytes. Vì vậy địa chỉ trang đi từ 0000 qua 1FFF. Nó không rõ ràng để bạn thấy được như thế nào để các trang địa chỉ và khoảng chênh địa chỉ liên quan đến khoảng khác. Nhưng nếu bạn mở rộng các địa chỉ thập lục phân từ nhị phân và đặt chúng bên cạnh khoảng khác bạn sẽ thấy đầy đủ 32-bit địa chỉ. Bây giờ, chúng ta hãy xem cashc mà bộ xử lí xử lí với cỡ dữ liệu nhỏ hơn so với những từ dài. Giả xử rằng bộ xử lí muốn đọc từ dài từ địa chỉ ABCDEF64 và địa chỉ này được giải mã để được trên hình 7.3. Kể tử địa chỉ này trên giới hạn của 32-bit, A0 và A1 = 0, và không được sủ dụng như địa chỉ ngoài mà đi vào bộ nhớ. Tuy nhiên, bộ xử lí muốn thực hiện truy cập từ của một trong những từ tại địa chỉ ABCDEF64 hoặc ABCDEF66, nó sẽ còn tạo ra địa chỉ ngoài cùng. KHi dữ liệu được đọc từ bộ xử lí, ½ những từ dài không cần thiết sẽ được loại bỏ. Do đây là thao tác đọc nên nội dung bộ nhớ không bị ảnh hưởng. Nếu bộ xử lí muốn đọc bất kì trong 4 byte đặt tại byte địa chỉ ABCDEF64, ABCDEF65, ABCDEF66 hoặc ABCDEF67, nó sẽ vẫn thực hiện hoạt động đọc như trước. Một lần nữa chỉ có các byte được quan tâm sẽ được giữ lại ngoài ra sẽ bị loại bỏ. Bây giờ hãy xem lại hoạt động viết trong trường hợp này chúng tôi lo lắng có thể làm hỏng bộ nhớ, do đó, chúng tôi muốn chắc chắn rằng khi chúng tôi ghi số lượng nhỏ hơn những từ dài vào bộ nhớ, chúng tôi không ngẫu nhiên viết nhiều hơn chúng tôi dự kiến. Do đó, giả thuyết rằng chúng ta cần ghi giá trị byte vào bộ nhớ ờ vị trí ABCDEF65. Trong trường hợp này, chỉ có tín hiệu WE1 sẽ được khẳng định, do đó, chỉ có vị trí byte có thể được sửa đổi. Do đó, để ghi một byte vào bộ nhớ, chúng tôi chỉ kích hoạt một trong 4 tín hiệu WRITE ENABLE. Để ghi một từ vào bộ nhớ chúng tôi sẽ kích hoạt hoặc WE0 và WE1 với nhau hoặc WE2 và WE3. Cuối cùng, để ghi một từ dài, tất cả bốn của dòng WRITE ENABLE sẽ được chỉ định. Điều gì sẽ xảy ra về trường hợp của một từ 32-bit được lưu trữ trong một bộ nhớ 16-bit? Trong trường hợp này, từ 32-bit có thể được lưu trữ trên bất kỳ từ ranh giới nào, bởi vì bộ xử lý luôn luôn phải truy cập trên hai vùng bộ nhớ liên tiếp nhau để lấy đủ số lượng 32-bit. Tuy nhiên, hầu hết các trình biên dịch vẫn sẽ cố gắng để lưu trữ từ 32-bit trên ranh giới tự nhiên (địa chỉ chia hết cho 4). Đây là lý do tại sao lập trình viên assembly thường có thể tiết kiệm một không gian nhỏ hoặc tối ưu tốc độ một thuật toán để vượt qua những gì mà trình biên dịch không để tạo ra mã và tinh chỉnh nó cho hiệu quả cao hơn. Hãy quay lại vấn đề trước. Đối với một bộ xử lý 32-bit, các bit địa chỉ A2 A31 có thể được sử dụng để giải quyết 1,073,741,824 từ dài, và địa chỉ A0 A1 trong bốn byte có thể trong vòng từ dài. Điều này cho chúng ta một tổng số là 4,294,967,296 byte địa chỉ địa điểm trong một bộ xử lý 32-bit. Nói cách khác, chúng ta có một không gian địa chỉ byte của 4 GB. Một bộ xử lý với độ rộng bus 16- bit, chẳng hạn như 68k, sử dụng dòng địa chỉ A1-A23 cho địa chỉ và A0 byte lựa chọn. Kết hợp tất cả các điều này, bạn sẽ thấy được vấn đề. Bạn có thể có một byte 8-bit, một từ 16-bit hoặc một từ 32-bit với địa chỉ tương tự. Điều này có phải là mơ hồ không? Có. Khi chúng ta đang lập trình bằng một ngôn ngữ cấp cao, chúng ta phụ thuộc vào trình biên dịch để theo dõi những chi tiết lộn xộn. Đây là một trong lý do tại sao khi thiết lập rập khuôn một loại biến khác có thể rất nguy hiểm. Khi chúng tôi đang lập trình bằng một ngôn ngữ cấp thấp, chúng tôi phụ thuộc vào kỹ năng lập trình theo dõi này. Có vẻ dễ dàng đầy đủ, nhưng nó không phải. Điều này ít thực tế của cuộc sống máy tính là một trong những nguyên nhân chính của lỗi phần mềm. Làm thế nào một khái niệm đơn giản có thể rất phức tạp? Nó không phải phức tạp, nó chỉ là mơ hồ. Hình minh họa 7.4 cho vấn đề này. Các cột tận cùng bên trái của hình 7.4 cho thấy một chuỗi được lưu giữ trong một không gian bộ nhớ 8-bit. Mỗi ký tự ASCII chiếm vị trí nhớ kế tiếp. Hình 7.4: Hai phương pháp đóng gói byte vào từ bộ nhớ 16-bit. Đặt thứ tự byte thấp vào cuối của từ bậc thấp được gọi là Little Endian. Đặt thứ tự byte thấp ở bên tự cao của từ này được gọi là Big Endian. Cột giữa hiển thị một bộ nhớ 16-bit được tổ chức để bytes kế tiếp được lưu trữ từ phải sang trái. Các byte tương ứng với A0 = 0 là liên kết với các phần thứ tự thấp, DB0. . . DB7, của từ 16-bit và byte tương ứng để A0 = 1 là liên kết với phần tự cao, DB8 DB15, của từ 16-bit. Đây được gọi là tổ chức Little Endian. Các cột bìa phải lưu trữ các ký tự như bytes kế tiếp từ trái sang bên phải. Các vị trí byte tương ứng với A0 = 0 là liên kết với vị trí cao của từ 16-bit. Đây được gọi là tổ chức Big Endian. Như một bài thực hành, xem xét cách các byte được lưu trữ trong hình 7.2. Có phải chúng lớn hay Little Endian? Motorola và Intel, đã chọn để sử dụng các công ước đầu cuối khác nhau và Pandora's Box đã được mở cửa thế giới lập trình. Vì vậy, C hoặc mã C + + được viết cho một công ước có lỗi tinh tế khi chuyển đến các công ước khác. Nó sẽ tồi tệ hơn đó. Các kỹ sư làm việc cùng nhau trên các dự án giải thích sai số kỹ thuật nếu mục đích là một trong những quy ước và họ giả định khác. Các kiến trúc ARM cho phép lập trình để thiết lập loại hình "endianess" sẽ được sử dụng bởi bộ vi xử lý lúc mở điện. Vì vậy, trong khi bộ xử lý ARM có thể đối phó với một trong hai về cuối lớn hay nhỏ, nó có thể không tự động chuyển chế độ một lần endianess. Hình 7,5 cho thấy sự khác biệt giữa hai công ước cho một từ 32-bit đóng gói với bốn byte. Nếu bạn lấy đi bất cứ điều gì từ văn bản này, hãy nhớ vấn đề này bởi vì bạn sẽ nhìn thấy nó ít nhất một lần trong sự nghiệp của bạn như là một nhà phát triển phần mềm. Trước khi bạn buộc tội tôi khi đánh chết chủ đề này, chúng ta hãy nhìn vào nó một lần nữa từ quan điểm phần cứng. Toàn bộ khu vực của địa chỉ bộ nhớ có thể rất khó hiểu cho người mới lập trình cũng như các cựu chiến binh dày dạn. Ngoài ra, có thể có sự giới thiệu mơ hồ của kiến trúc và thuật ngữ của nhà sản xuất. Vì vậy, chúng ta hãy xem làm thế nào Motorola xử lý nó cho 68k và có lẽ điều này sẽ giúp chúng ta hiểu rõ hơn về những gì thực sự đang diễn ra, ít nhất là trong trường hợp của bộ xử lý Motorola, mặc dù chúng tôi đã xem xét vấn đề một lần trước trong hình 7.3 . Hình 7.6 tóm tắt đề án giải quyết vấn đề bộ nhớ cho các bộ xử lý 68k. Bộ xử lý 68k có khả năng trực tiếp giải quyết 16 MB bộ nhớ, đòi hỏi 24 "hiệu quả" dòng địa chỉ. Tại sao? Bởi vì 224 = 16,777,216. Trong hình 7.6 chúng ta thấy 23 dòng địa chỉ. Dòng địa chỉ mất tích, A0, được tổng hợp bởi hai tín hiệu điều khiển bổ sung, LDS và UDS. Đối với một độ rộng bus 16-bit dữ liệu bên ngoài, chúng tôi bình thường dùng địa chỉ bit A0 làm bộ chọn byte. Khi A0 là 0, chúng tôi chọn ngay cả byte, và khi A0 = 1, chúng tôi chọn byte lẻ. Các endianness của 68k là Big Endian, để các byte thậm chí là liên kết với D8 qua D15 của bus dữ liệu. Căn cứ theo con số 4.3.1 chúng ta thấy rằng có hai tình trạng tín hiệu bus ra khỏi bộ xử lý, UDS chỉ định, hoặc Upper Data Strobe, và LDS, hoặc Lower Data Strobe. Khi bộ vi xử lý là làm một byte truy cập vào bộ nhớ, sau đó hoặc là LDS hay UDS là khẳng định để chỉ vào bộ nhớ mà một phần của từ đang được truy cập. Nếu thậm chí byte tại địa chỉ bị truy cập (A0 = 0), sau đó UDS khẳng định và LDS vẫn CAO. Nếu byte lẻ này đang được truy cập (A0 = 1), sau đó LDS khẳng định và vẫn còn trong UDS CAO, hoặc OFF. Đối với một từ truy cập, cả hai UDS và LDS được khẳng định. Hành vi này được tóm tắt trong bảng của hình 7,6. Bạn thường sử dụng LDS và UDS như gating tín hiệu cho hệ thống điều khiển bộ nhớ. Ví dụ, bạn có thể các mạch thể hiện trong hình 7.7 để kiểm soát đó của byte đang được ghi vào. Bạn có thể bạn phải suy nghĩ về mạch này. Tại sao chúng ta sử dụng cổng OR? Chúng tôi có thể trả lời câu hỏi theo hai cách. Trước tiên, kể từ khi tất cả các tín hiệu được khẳng định LOW, chúng tôi đang thực sự đối phó với các tương đương logic tiêu cực của một chức năng AND. Cổng điều đó xảy ra là tương đương logic tiêu cực của các cửa khẩu và là cửa ngõ OR, kể từ khi đầu ra là 0 nếu và chỉ nếu cả hai đầu vào là 0. Cách thứ hai xem xét nó là thông qua các phương trình tương đương của các định lý của DeMorgan. Nhớ lại rằng: Trong trường hợp này, phương trình 1 cho thấy OR của A và B sẽ tương đương với bằng cách sử dụng A và B dương tính logic và sau đó được cấp NAND của hai tín hiệu. Bây giờ, giả sử rằng bạn đã cố gắng để làm một lúc truy cập từ một địa chỉ lẻ. Ví dụ, giả sử rằng bạn đã viết các hướng dẫn lắp ráp ngôn ngữ sau đây: Hướng dẫn này nói về cách các bộ xử lý tạo ra 1 bản sao được đăng ký được lưu giữ trong nội bộ của D0 và lưu trữ các bản sao của từ đó trong bộ nhớ bên ngoài, bắt đầu từ bộ nhớ địa chỉ $1.001. Bộ xử lý sẽ cần phải thực hiện hai chu kỳ bộ nhớ để hoàn tất việc truy cập bởi vì thứ tự byte yêu cầu nó là cầu nối chính xác của 2 điểm bộ nhớ byte. Một số bộ xử lý có khả năng loại truy cập, nhưng 68k là một trong những bộ vi xử lý có thể không. Nếu một truy cập không liên kết xảy ra, bộ vi xử lý sẽ tạo ra một ngoại lệ và cố gắng cảnh báo một số mã người dùng xác định rằng sẽ sửa lỗi, hoặc ít nhất, không chết cứng. Kể từ khi bộ xử lý 68k là một bộ xử lý trong rộng 32-bit, nhưng với độ rộng bus dữ liệu 16-bit của bộ nhớ ngoài, chúng ta cần phải biết làm thế nào nó lưu lượng 32-bit trong bộ nhớ bên ngoài là tốt. Hình 7.8 chỉ cho chúng ta quy ước để lưu trữ từ lâu trong bộ nhớ. Mặc dù hình 7.8 có thể có vẻ khó hiểu, nó chỉ là một tuyên bố rõ ràng hơn của hình 7.2 trong một định dạng khá hơn phần nào viết tắt. Con số này cho chúng ta biết rằng dữ liệu 32-bit, được gọi là chờ đợi hay từ lâu được lưu trữ trong bộ nhớ với ý nghĩa nhất 16 bit (D16 - D31) được lưu giữ trong vị trí địa chỉ đầu tiên từ và ít nhất 16 bit (D0 - D15) được lưu giữ ở vị trí cao nhất từ kế tiếp. Ngoài ra, ngay cả các địa chỉ byte được liên kết với phần tử cao của địa chỉ từ 16-bit (Big Endian). Giới thiệu về ngôn ngữ assembly Các máy tính trên thế giới bị chi phối bởi một kiến trúc tập lệnh (ISA) đầu tiên được xác định bởi Intel hơn 25 năm trước đây. Kiến trúc này, được gọi là X86 bởi vì chúng cùng một dòng, các thế hệ sau: 8080 →8086 →80186 →80286 →80386 →80486 →Pentium Thế giới của nhúng bộ vi xử lý - đó là bộ vi xử lý được dùng để mục đích duy nhất bên trong thiết bị, như điện thoại di động - bị chi phối bởi Motorola 680 X0 ISA: 68000 →68010 →68020 →68030 →68040 →68060 →ColdFire ColdFire đơn vị kiến trúc vi xử lý hiện đại, được gọi là RISC, với tính tương thích ngược với kiến trúc gốc 68K ISA. (Chúng tôi sẽ nghiên cứu các kiến trúc trong một bài học sau này.) Tính tương thích ngược rất quan trọng vì mã 68K vẫn đang được sử dụng và phát triển. Tập lệnh Motorola 68K là một trong những ISAs nghiên cứu rộng rãi nhất và bạn có thể tìm thấy một số không thể tin nổi của kết quả nếu bạn làm tìm kiếm web trên " 68K " hoặc " 68000. " Mỗi hệ thống máy tính đều có hoạt động cơ bản mà nó có thể thực hiện. Các hoạt động này được xác định bởi tập lệnh của bộ vi xử lí. Lý do của tập hợp các hướng dẫn đó là cách làm việc của máy tính được tổ chức trong nội bộ và được thiết kế hoạt động. Đây là những gì chúng tôi sẽ dung để gọi cho kiến trúc của máy tính. kiến trúc này được phản ánh bởi các hướng dẫn bằng ngôn ngữ assembly mà nó có thể thực hiện, bởi vì các hướng dẫn này là các kỹ thuật mà chúng tôi truy cập tài nguyên của máy tính. Các tập lệnh là yếu tố nguyên tử của các bộ xử lý. Tất cả các thao tác phức tạp trên được thực hiện bằng cách xây dựng những dãy các thao tác cơ bản. Máy tính không đọc ngôn ngữ assembly. Chúng lấy lệnh của chúng trong mã máy. Như bạn biết đó, mã máy được thiết đặt vào bảng vi điều khiển mã máy khi bắt đầu quá trình thực thi lệnh. Ngôn ngữ assembly là con người có thể đọc được các dạng lệnh của ngôn ngữ máy. Không có gì huyền bí về lệnh của ngôn ngữ máy, và rất nhanh chóng bạn sẽ có thể hiểu chúng và thấy các mẫu hướng dẫn trạng thái bên trong máy móc của bộ vi xử lí hiện đại. Bây giờ chúng ta sẽ tập trung vào việc ngôn ngữ assembly. Xem hình 7.9. Lưu ý: chúng tôi đại diện cho số hệ thập lục phân trong C hoặc C + + với tiền tố '0x' Đây là tiêu chuẩn hóa của ngôn ngữ. Không có tiêu chuẩn hóa ứng với ngôn ngữ assembly và khác nhà [...]... ngữ assembly bạn nên là một lập trình viên có thẩm quyền Bạn nên đã có một số lớp lập trình và hiểu lập trình cấu trúc và cấu trúc dữ liệu lập trình ngôn ngữ assembly có thể có vẻ rất lạ lúc đầu, nhưng nó vẫn còn lập trình Trong khi C và C + + là ngôn ngữ dạng tự do, lắp ráp, ngôn ngữ là rất có cấu trúc Ngoài ra, có theo dõi tài nguyên của bạn hay không là tùy ở bạn Không có trình biên dịch có sẵn để... vòng lặp ) và thử lại Nếu phím đã được gõ, chương trình sẽ diễn giải tổ hợp phím và tiếp tục Luồng - biểu đồ là một công cụ rất mạnh đã giúp bạn lập kế hoạch chương trình của bạn Thật đáng tiếc, nhất sinh viên ( và nhiều lập trình viên chuyên nghiệp ) lấy " mã tấn công " phương pháp và chỉ nhảy vào và ngay lập tức bắt đầu ghi mã, nhiều như ghi tiểu thuyết Đây có lẽ giải thích vì sao hầu hết lập trình viên... hai cột, mặc dù có thể khó thấy chúng Cột bên trái bắt đầu với vị trí bộ nhớ hệ thập lục phân nơi lệnh ngôn ngữ máy được lưu trữ Trong trường hợp này bộ nhớ vị trí $00000412 giữ lệnh ngôn ngữ máy mã 0x307B7048 Lệnh kế tiếp bắt đầu vào bộ nhớ vị trí 0x00000416 và chứa mã lệnh 0x327B704A Hai lệnh ngôn ngữ máy được trao cho bằng lệnh assembly này MOVEA.W (TEST_S,PC,D7),A0 MOVEA.W (TEST_E,PC,D7),A1 Chẳng... thực hiện và sự mơ hồ của Big Endian so với Little Endian phương pháp giải quyết byte Tổ chức cơ bản của ngôn ngữ hướng dẫn lắp ráp và làm thế nào từ opcode làhiểu như là một phần của một chỉ dẫn ngôn ngữ máy Các nguyên tắc cơ bản của việc tạo ra một chương trình ngôn ngữ assembly Việc sử dụng các giả opcodes để kiểm soát các hoạt động của chương trình asembly Phân tích một chương trình ngôn ngữ asembly... để vị trí bộ nhớ của lệnh, " MOVE.B ( A2 ), D6 " và " BRA TEST_LOOP " tương ứng Khi trình dịch hợp ngữ thực hiện tiến trình chuyển đổi lệnh assembly vào lệnh ngôn ngữ máy nó theo dõi mỗi lệnh ở bên trong bộ nhớ Khi nào nó gặp label với tư cách một toán hạng, nó thay thế văn bản label với giá trị số Vì vậy, lệnh " BEQ DONE " bảo trình dịch assembly tính giá trị số cần thiết để gây ra chương trình để... như bất kỳ trình biên dịch hiện đại chúng ta hãy nhìn vài mô phỏng mã tác vụ này • ORG (thiết lập nguồn gốc): Các ORG pseudo-op cho biết các trình dịch asembly nơi trong bộ nhớ để bắt đầu lắp ráp chương trình Điều này không nhất thiết mà chương trình có thể được nạp vào bộ nhớ, nó chỉ nói trình dịch assembly, nơi bạn có ý định cho nó chạy Nếu bạn bỏ qua các câu lệnh ORG, chương trình sẽ dịch assembly. .. thảo luận này: • Bắt đầu ở bộ nhớ vị trí $00000412, và chạy qua vị trí $00000415, là lệnh máy mã B7048$307 Lệnh assembly tương ứng dữ liệu ngôn ngữ máy này là MOVEA.W (TEST_S,PC,D7),A0 • Bắt đầu ở ở bộ nhớ vị trí $00000416, và chạy qua vị trí $00000419, là lệnh máy mã $327B704A Lệnh assembly tương ứng dữ liệu ngôn ngữ máy này là MOVEA.W (TEST_E,PC,D7),A1 Hơn nữa, cho tập lệnh 68 K, lệnh ngôn ngữ máy... thiệu Nó có thể là đáng giá và dừng lại một lúc để phản ánh về lý do tại sao, như là một lập trình viên, điều quan trọng để tìm hiểu assembly Khoa học máy tính và lập trình phụ thuộc vào kiến thức làm việc của bộ vi xử lý, hạn chế của nó và thế mạnh của nó Để biết được assembly hiểu được những động cơ tính toán rằng mã của bạn đang chạy Mặc dù ngôn ngữ cấp cao giống như C + + và JAVA làm tốt công việc... kế tiếp được tìm nạp từ bộ nhớ Ngay khi lệnh hiện hành được giải mã bằng bộ xử lý chương trình truy cấp ( program counter - PC) được cập nhật để chỉ đến địa chỉ của lệnh tuần tự kế tiếp trong bộ nhớ Thanh ghi tổng quát : bộ xử lý 68 K có 15 thanh ghi đa năng và hai thanh ghi chuyên biệt Thanh ghi đa năng được chia thành thông tin đăng ký vào bộ nhớ thành tám gói dữ liệu, D0 D7 và bảy địa chỉ A0 A6 Dữ... triển trình dịch assembly biểu diễn hệ số thập lục phân bằng nhiều cách khác nhau Trong văn bản này, chúng ta sẽ áp dụng quy ước Motorola của dùng tiền tố ‘S' cho hệ thập lục phân Ngôn ngữ mã máy tính thực sự là đầu ra của trình biên dịch hợp ngữ chuyển đổi tập tin nguồn của ngôn ngữ assembly, bạn có thể soạn với bất kỳ trình soạn thảo văn bản, mã ngôn ngữ máy tương ứng có thể được thi hành bởi bộ xử . Minh 0922046 1Tổ chức bộ nhớ và ngôn ngữ lập trình assembly Mục tiêu: Khi hoàn thành bài này, bạn sẽ có thể: o Mô tả một hệ bộ nhớ tiêu biểu được tổ chức dưới dạng địa chỉ bộ nhớ như thế nào o Mô. tài: Tổ chức bộ nhớ và lập trình bằng ngôn ngữ assembly Giảng viên: Bùi Công Trường Lớp:DHTH5A Nhóm đề tài: nhóm 8 Tên MSSV Hà Đình Sử 09219411 Phạm Thắng 09206671 Nguyễn Quang Minh 0922046 1Tổ chức. của chúng tôi như thế nào về tổ chức hệ thống bộ nhớ và nhìn vào hệ thống bộ nhớ từ các tiềm năng của các bộ vi xử lý. Hình 7.1 là bản đồ cho bộ nhớ của bộ xử lí 68K. Bộ xử lí có thể một địa chỉ

Ngày đăng: 16/10/2014, 21:49

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan