2009-01-17 37 views
11

Ở trường chúng tôi đã lập trình bằng ngôn ngữ lắp ráp MIPS một thời gian. Tôi quan tâm đến delving vào x86 lắp ráp và tôi đã nghe nói rằng có phần khó khăn hơn (ngay cả sách giáo khoa MIPS của tôi nói điều này).Tôi nên biết gì khi chuyển từ MIPS sang x86?

Tôi nên biết thông tin cốt lõi nào khi là lập trình viên MIPS trước khi đi sâu vào thế giới x86?

Trả lời

14

Những điều lớn nhất cần lưu ý là:

  • vài thanh ghi mục đích chung, và những người bạn phải không GP tinh khiết - nhiều hướng dẫn yêu cầu bạn phải sử dụng thanh ghi nào đó cho một mục đích cụ thể. Các hướng dẫn
  • x86 là dạng hai dạng mã hóa thay vì ba mã opcode có thể làm cho các hoạt động nhất định phức tạp hơn. Tức là, thay vì thêm r0, r1, r2 (r0 = r1 + r2), bạn thêm eax, ebx (eax + = ebx).
  • Phân đoạn ở chế độ được bảo vệ (tất cả mã 32 bit bên ngoài DOS, có hiệu quả) làm cho lược đồ địa chỉ bộ nhớ của bạn cực kỳ không rõ ràng, có thể khiến bạn khó chịu khi bạn bắt đầu.
  • Bạn sẽ tìm kiếm các cờ được đặt/xóa theo hướng dẫn mọi lúc. Học cách yêu các sách hướng dẫn của Intel.
  • Chỉnh sửa, một điều tôi đã quên: Việc sử dụng các subregisters (ví dụ: ah để truy cập 8 bit cao của 16 bit thấp của thanh ghi eax) có thể thực hiện thao tác theo dõi cho thanh ghi của bạn rất khó. Hãy cẩn thận và bình luận một cách tự do cho đến khi bạn nhận được mọi thứ.

Ngoài ra, x86 là khá thẳng về phía trước. Khi bạn học cách lạm dụng các hướng dẫn như 'lea' và 'test', bạn học cách yêu thích nó. Ngoài ra, protip: Intel sẽ gửi cho bạn bản sao của hướng dẫn sử dụng hướng dẫn cài đặt miễn phí, thậm chí không phải trả tiền cho vận chuyển. Nhìn xung quanh trang web của họ để biết email hoàn thành và yêu cầu SKU cung cấp sách.

+0

Bạn có thể đặt mua CD [tại đây] (https://secure.hibbertgroup.com/intel/spm?programId=1). Các bản sao cứng, không may, không được cung cấp nữa. – new123456

+1

Bộ chỉ dẫn x86 được hiểu rõ nhất bởi khảo cổ học, tôi thấy - nếu bạn đã thấy 8080 có gì, làm thế nào mơ hồ thông báo thiết kế của 8088, và cuối cùng 386 đã thêm thứ lên trên, tất cả đều có ý nghĩa. Nếu không, các quy tắc có vẻ hơi tùy ý. – ijw

5

x86 có tập hợp đăng ký có sẵn rất hạn chế so với hầu hết các kiến ​​trúc khác. Điều này không thực sự làm cho ngôn ngữ lắp ráp khó học hơn, nhưng đôi khi làm cho việc thực thi mã trong thực tế khó hơn.

Ngoài ra, vì lịch sử x86 của tính tương thích ngược mạnh mẽ, tập lệnh không phải là đối xứng khủng khiếp (chắc chắn trước RISC) và có thể có rất nhiều ngoại lệ đối với quy tắc và trường hợp góc cần chú ý.

+0

Vâng, nhưng không giới hạn so với MIPS. :) – BobbyShaftoe

+3

@BobbyShaftoe, bạn có phải là lập trình viên lắp ráp không? MIPS có 32 thanh ghi mục đích chung và x86 có 8 như xa như tôi biết. – mmcdole

1

x86 có hướng dẫn phức tạp hơn MIPS. Vì vậy, có lẽ là một hướng dẫn duy nhất cho các chuỗi chung trong MIPS (đáng chú ý nhất là địa chỉ bộ nhớ). Thiếu đăng ký nhiều chắc chắn là một bất lợi nhưng trong cả hai kiến ​​trúc có những công ước mà khá nhiều hạn chế số lượng những gì bạn có thể sử dụng một cách tự do xuống 4-5. Chỉ rõ hơn trong x86. x86 có nhiều ngoại lệ hơn cho việc sử dụng đăng ký so với MIPS mà bạn phải ghi nhớ nhưng không có gì đáng để rên rỉ liên tục.

Phát biểu từ kinh nghiệm, ngôn ngữ có cùng khó khăn trong việc học, các quy ước được bao gồm. Có lẽ x86 là một chút dễ dàng hơn, xem xét tài nguyên trực tuyến phong phú và phổ biến của nó.

Phần khó khăn về x86 là tạo ra nhị phân, vì hướng dẫn độ dài biến đổi của nó và một số chế độ địa chỉ. Thông thường, bạn không bao giờ cần phải làm điều đó anyway.

Tôi chắc chắn có thể khuyên bạn nên học một kiến ​​trúc hướng dẫn phức tạp hơn MIPS.

Và điều này quan trọng, không phải là một phần của cuộc chiến tôn giáo giữa RISC v.s. CISC ...

1

Tôi đã học x86 và x86_64 để tự mình viết một trình biên dịch. Nếu bạn không tự viết một người lắp ráp thì một số điều tôi sẽ nói là khá vô dụng. Mặc dù tôi không biết về MIPS.

x86 gián tiếp giải quyết là một điều phức tạp. Trong một hướng dẫn duy nhất, bạn có thể thực hiện các thao tác sau:

mov reg, [reg+offset] 
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8. 

Mã hóa lệnh của chúng phức tạp vì điều này, nhưng nó phù hợp với mọi hướng dẫn mã hóa theo cách này. Bạn có thể muốn đọc điều này từ sandpile.org. Nếu bạn muốn biết thêm về mã hóa, bạn luôn có thể hỏi về nó từ tôi. Một mã hóa lệnh khác có liên quan đến các chi tiết gây phiền nhiễu là các tiền tố. Chúng thay đổi ý nghĩa của lệnh rất nhiều. Ví dụ, 0x66 (nếu tôi nhớ đúng) ở phía trước và một số hướng dẫn trở thành cho Gbit 16bit thay vì 32 bit.

GPRs 32bit (theo thứ tự): eax, ecx, edx, ebx, esp, ebp, esi, edi

64bit GPRS: rax, rcx, RDX, RBX, RSP, RBP, rsi, RDI, r8 , r9, r10, r11, r12, r13, r14, r15

Lưu ý có bao nhiêu thanh ghi mục đích chung, điều này sẽ buộc phần mềm sử dụng nhiều nhất hoặc ít hơn theo cách được sắp xếp theo từng máy. Một chi tiết đau đớn. rsp được sử dụng cho ngăn xếp (pop, push -instructions) và rbp có xu hướng được đặt trước. x86_64 có nhiều thanh ghi hơn, nhưng sẽ mất thời gian khi mọi người sẽ chấp nhận nó, ngay cả khi mọi người tiêu dùng đều có một bộ xử lý có khả năng.

Có hai bộ lệnh khác nhau cho số học dấu phẩy động. XMM là phiên bản mới hơn. Trong x86_64 có 16 thanh ghi 128bit có sẵn và trong x86 chỉ có 8 trong số chúng. Tập lệnh hướng dẫn cũ xử lý các thanh ghi như một ngăn xếp. Bạn chỉ cần không có trao đổi, nip hoặc thối, do đó, làm việc với nó là tâm-uốn.

Khi sử dụng x86 có xu hướng giảm xuống máy RISC. Một số trong những hướng dẫn phức tạp không cung cấp cho lợi ích hoặc thậm chí còn chậm hơn trên các máy mới hơn. Bạn sẽ làm với sự hiểu biết về 30-150 hướng dẫn tùy thuộc vào những gì bạn đang đọc hoặc viết. Bạn cũng có thể bỏ qua một số hướng dẫn cũ và AL/HL-stuff. Hãy nhớ điều này tất cả các nguồn gốc lộn xộn sau năm 1978, đó là khá đáng ngạc nhiên nó không tồi tệ hơn, 31 năm kể từ đó và 24 năm kể từ lần giới thiệu đầu tiên của IA-32. Rất nhiều thứ thay đổi sự liên quan của chúng trong thời gian đó.

Nhảy và cuộc gọi trực tiếp có vẻ tương đối so với hướng dẫn tiếp theo trong x86. Do đó:

jmp nowhere # or call, jz, jg whatever... 
nowhere: 
    nop 

Kết thúc được mã hóa thành 'JMP imm: 0, NOP'. Các jmp đăng ký gián tiếp mà không nhảy tuyệt đối. Nó cũng tốt để thông báo không có nhảy đăng ký có điều kiện gián tiếp, nó làm phiền tôi quá.

Đây không phải là tất cả những gì bạn có thể biết nhưng những thứ đầu tiên xuất hiện trong tâm trí của bạn từ câu hỏi của bạn. Nhưng có lẽ bạn có thể làm quen với những điều này ngay bây giờ.

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