2010-09-29 42 views
11

Ví dụ:Làm cách nào để dịch ghép thành nhị phân?

 .text 
     .align 2 
     .global main 
     .equ val,0x4712   # 16-bit binary code for 0x4712: 0100 0111 0001 0010 
           # Program code starts now 
main:       # This label must be main:, not MAIN: 
     movi r16,val   # WHAT WOULD THIS LINE BE IN BINARY? 
     movi r17,0 
loop: addi r17,r17,1 
     subi r16,r16,1 
     bne r16,r0,loop 
stop: br stop 
.end 
+1

Kiến trúc nào? –

+0

CPU là NIOS2. Nó có quan trọng không? – JustinBieber

Trả lời

20

Ý bạn là, bằng tay?

Bằng tay, bạn lấy bảng hướng dẫn cho bộ vi xử lý, hiểu các chế độ địa chỉ của bạn và các vấn đề về dữ liệu khác, sau đó chuyển đổi sang một cái gì đó thuận tiện, như ký hiệu thập lục phân.

Sau đó, bạn sẽ cần lấy thông tin đó vào bộ nhớ thiết bị, sử dụng một số quy trình cụ thể của thiết bị (tệp từ đĩa, tệp từ dòng nối tiếp, được khóa từ bảng điều khiển phía trước với một bộ chuyển mạch).

Rõ ràng, có thể có tất cả các loại vấn đề về chuỗi công cụ mà bạn sẽ cần phải tìm ra để đưa mã nhị phân của bạn vào máy. Nếu bạn chỉ làm việc đó để cười, thập lục phân, bút chì và một pad hợp pháp phù hợp với nhiều năm.

Chỉnh sửa -

Bạn phải biết một vài điều.

Đầu tiên, mã op và cùng với mã op, bạn cần biết các chế độ địa chỉ.

Xem xét việc này 6502:

LDA #$00 
LDA $00 
LDA $1234 

Đó là ba hướng dẫn khác nhau trên 6502.

Các tải đầu tiên trên Accumulator (A) với $ 00, 0 trong hex. Biểu tượng # cho trình biên dịch biết rằng bạn đang sử dụng chế độ địa chỉ "ngay lập tức" (6502 có tổng 13 chế độ địa chỉ).

Tải thứ hai cho bộ tích lũy với giá trị của vị trí bộ nhớ nằm tại địa chỉ $ 0000. Trên 6502, nó có chế độ "0 trang", vì vậy nó có thể dễ dàng truy cập bộ nhớ từ trang đầu tiên của bộ nhớ (địa chỉ $ 0000- $ 00FF).

Tải thứ ba là Bộ tích lũy với giá trị của vị trí bộ nhớ được đặt tại địa chỉ $ 1234. Đây là địa chỉ tuyệt đối, chỉ cần chỉ định địa chỉ thực của bộ nhớ mà bạn quan tâm.

Tôi làm nổi bật ví dụ này bởi vì, trong nháy mắt, cả ba đều giống nhau. Nhưng trong sự thật, tất cả chúng đều biên dịch thành 3 hướng dẫn riêng biệt hoặc các mã opcodes. Vì vậy, điều quan trọng là phải hiểu những gì lắp ráp của bạn là nói cho bạn để bạn có thể chọn đúng opcode cho bộ vi xử lý của bạn.

Bây giờ, nếu bạn nhìn vào opcode guide cho 6502 và tìm hướng dẫn LDA, bạn sẽ thấy các giá trị nhị phân khác nhau cho mỗi lệnh.

Vì vậy, trong trường hợp này bạn sẽ nhận được:

$A9 $00 
$A5 $00 
$AD $12 $34 

Đó là (trong hex) biểu diễn nhị phân của những 3 hướng dẫn.

Đầu tiên, $ A9, dành cho chế độ địa chỉ "ngay lập tức", thứ hai, $ A5, cho địa chỉ trang Zero và cuối cùng là $ AD cho tuyệt đối.

Cũng lưu ý rằng sau các toán hạng, là các đối số. Đối với 6502, họ chỉ cần làm theo trong dòng byte. Bộ vi xử lý khác nhau làm những việc khác nhau.Lưu ý, đối với Absolute, chúng ta có 2 byte, $ 12 và $ 34, mỗi phần đại diện cho một nửa tổng số, địa chỉ 16 bit. Tôi tin rằng điều này là chính xác, rằng Byte quan trọng nhất của địa chỉ đến trước, nhưng nó có thể được đảo ngược ($ A9 $ 34 $ 12).

Vì vậy, đó là cơ sở của việc lắp ráp bằng tay.

Những điều khác cần lưu ý là các vấn đề như vị trí lắp ráp sẽ được tải tại. Điều đó sẽ ảnh hưởng đến các giá trị cho những thứ như nhãn của bạn.

Trong 6502:

label: LDA #$00 
     JMP label 

Nếu lắp ráp của bạn được bắt đầu tại địa chỉ $ 1000, điều này này sẽ lắp ráp để:

$A9 $00 
$4C $10 $00 

Nếu lắp ráp của bạn được bắt đầu tại địa chỉ $ 5555 thì:

$A9 $00 
$4C $55 $55 

Xem, hướng dẫn JMP (Jump) ($ 4C) cần địa chỉ để chuyển đến và nhãn trong thư mục của bạn bly liên quan đến vị trí của nó trong chương trình. Thuận tiện, trong trường hợp này, nhãn là ngay từ đầu. Nhưng bạn có thể xem cách địa chỉ được mã hóa vào mã máy cuối cùng.

6502 là công cụ EASY (thực sự dễ dàng). Bộ vi xử lý hiện đại, tốt, không. Các trình assembler hiện đại làm rất nhiều công việc cho bạn, và bạn có nhiều CPU phức tạp hơn với các bộ lệnh lớn hơn, và những thứ như các vấn đề liên kết - tất cả đều bị thiếu trong 6502. Nhưng là một bộ xử lý tay, bạn chịu trách nhiệm cho tất cả những sắc thái đó.

Hướng dẫn bộ vi xử lý của bạn phải cho bạn biết những sắc thái này. Nhưng với các CPU phức tạp hiện đại, nó có thể không tầm thường để làm và học hỏi.

Không nhất thiết muốn ngăn cản bạn khỏi điều này, nhưng lưu ý, nó cũng có thể là rất nhiều công việc.

Nhưng đây là bản chất của những gì bạn cần làm.

+0

Đã có ký hiệu thập lục phân. Nhưng tôi không thể làm đúng. Ví dụ: 0x40000 = 00000100000100011100010010000100 và tôi thậm chí không nhận được cách họ nhận được. – JustinBieber

+1

không, 0x40000 = 01000000000000000000. nhị phân 00000100000100011100010010000100 = 0x0411c484. –

+0

6502 thực sự là ít kết thúc; LDA $ 1234 -> AD 34 12. Nhưng đó chỉ là một nit. – Avi

1

Tất cả các trình biên tập mà tôi đã làm việc có một tính năng để bao gồm nhị phân trong danh sách đầu ra bên cạnh mã khi thực hiện một assembly.

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