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ờ.
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
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