2011-10-21 19 views
7

Tôi đang sử dụng MacBook Pro với bộ vi xử lý Intel Core 2 Duo với tốc độ 2,53 GHz, nhưng tôi đã nói với người dùng Mac phải tuân theo cú pháp AT & T (thêm vào sự nhầm lẫn của tôi vì tôi đang chạy Intel) và x86 (không chắc chắn điều này có nghĩa là chính xác).Sử dụng Assembly On Mac

Vì vậy, tôi cần tham gia lắp ráp nhưng tôi thấy rất khó để bắt đầu. Tìm kiếm trực tuyến hiển thị mã lắp ráp thay đổi rất nhiều về cú pháp và tôi không thể tìm thấy bất kỳ tài nguyên nào giải thích cách lắp ráp cơ bản. Tôi tiếp tục đọc về đăng ký và một ngăn xếp nhưng không hiểu làm thế nào để nhìn vào điều này. Bất cứ ai có thể giải thích/chỉ cho tôi đi đúng hướng? Lấy ví dụ, mã này là mã duy nhất tôi tìm được để làm việc:

.data 
_mystring: .ascii "Hello World\n\0" #C expects strings to terminate with a 0. 
.text 
    .globl _foo 
_foo: 
push %ebp 
    mov %esp,%ebp 
    pushl $_mystring 
    call _myprint 
    add $4,%esp 
    pop %ebp 
    ret 

Rất đơn giản nhưng nó nói gì? Tôi đang có một thời gian khó hiểu sự hiểu biết mã này làm những gì nó làm. Tôi biết Java, PHP và C, trong số các ngôn ngữ khác, nhưng điều này, các bước và cú pháp của nó, không rõ ràng với tôi. Dưới đây là file chính để đi với nó:

#include <stdio.h> 
void foo(); 
void myprint(char *s) 
{printf("%s", s);} 
main() 
{foo();} 

Ngoài ra, có này mà chỉ sẽ nhân số:

.data 
    .globl _cntr 
_cntr: .long 0 
    .globl _prod 
_prod: .long 0 
    .globl _x 
_x: .long 0 
    .globl _y 
_y: .long 0 
    .globl _mask 
_mask: .long 1 
    .globl _multiply 
multiply: 
    push %ebp 
    mov %ebp,%esp 
    mov $0,%eax 
    mov _x,%ebx 
    mov _y,%edx 
LOOP: 
    cmp $0,%ebx 
    je DONE 
    mov %ebx,%ecx 
    and $1,%ecx 
    cmp $1,%ecx 
    jne LOOPC 
    add %edx,%eax 
LOOPC: 
    shr $1,%ebx 
    shl $1,%edx 
    jmp LOOP 
DONE: 
    pop %ebp 
    ret 

và main.c để đi với nó:

#include <stdio.h> 

extern int multiply(); 
extern int x, y; 

int main() 
{ 
    x = 34; 
    y = 47; 
    printf("%d * %d = %d\n", x, y, multiply()); 
} 

Và cuối cùng có ba câu hỏi nhỏ:

  1. Sự khác nhau giữa các tên .s.h là gì (Tôi có cả một số main.cmain.h, cái nào dành cho cái gì)?

  2. Và tại sao lắp ráp cần có main.c để đi kèm với nó/nó gọi nó như thế nào?

  3. bất cứ ai có thể giới thiệu một hội đồng IDE tốt như Eclipse là cho Java hoặc PHP

Nhờ câu trả lời bất cứ ai (điều này thực sự là bài viết đầu tiên của tôi trên trang web này), tôi đã cố gắng để con số này ra cho một vài ngày và mọi tài nguyên tôi đã đọc chỉ không giải thích logic lắp ráp với tôi. Nó nói những gì .data hoặc .text hiện nhưng chỉ có một người biết làm thế nào để "nghĩ rằng lắp ráp" sẽ hiểu những gì họ có ý nghĩa? Ngoài ra, nếu có ai ở quanh Thành phố New York và cảm thấy rất thoải mái với Hội đồng và C, tôi rất thích một số bài học riêng. Tôi cảm thấy có rất nhiều tiềm năng với ngôn ngữ này và rất thích học nó.

+0

Xem: http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html –

+1

'nasm' đi kèm với các phiên bản Xcode gần đây. Bạn có thể sử dụng nó với cú pháp của Intel. Wikibooks cũng có một [x86 Assembly book] (https://en.wikibooks.org/wiki/X86_Assembly). –

+0

Bạn đang lập kế hoạch cho loại ứng dụng nào? –

Trả lời

8

Ngôn ngữ lắp ráp là một loại ngôn ngữ lập trình được gắn chặt với kiến ​​trúc CPU. Theo truyền thống, có một sự tương ứng một-một giữa mỗi lệnh lắp ráp và lệnh CPU kết quả.

Ngoài ra còn có lắp ráp giả hướng dẫn không tương ứng với hướng dẫn CPU, nhưng thay vào đó ảnh hưởng đến bộ lắp ráp hoặc mã được tạo. .data.text là các hướng dẫn giả.

Trước đây, mỗi nhà sản xuất CPU đã triển khai một ngôn ngữ lắp ráp như được xác định bằng cách lắp ráp lắp ráp, một tiện ích dịch mã nguồn. Đã có hàng ngàn ngôn ngữ lắp ráp cụ thể được xác định.

Trong thời hiện đại, nó đã được công nhận rằng mỗi ngôn ngữ lắp ráp chia sẻ rất nhiều tính năng phổ biến, đặc biệt là đối với các lệnh giả. Bộ sưu tập trình biên dịch GNU (GCC) hỗ trợ về cơ bản mọi kiến ​​trúc CPU, vì vậy nó đã phát triển các tính năng lắp ráp chung.

x86 đề cập đến gia đình Intel 8086 (8088, 8086, 8087, 80.186, 80.286, 80.386, 80.486, 80.586 aka Pentium, 80.686 aka Pentium II, vv)

AT & cú pháp T là một phong cách ký hiệu được sử dụng bởi nhiều kiến ​​trúc ngôn ngữ lắp ráp. Một tính năng chính là toán hạng lệnh được viết theo thứ tự từ, đến như đã được sử dụng phổ biến trong lịch sử. Cú pháp Intel sử dụng đến, từ toán hạng. Có những khác biệt khác nữa.

Đối với nhiều câu hỏi của bạn, sau đây là một số tài nguyên mà sẽ 1) lấn át bạn, và 2) cuối cùng cung cấp tất cả các câu trả lời của bạn:

Thông thường, giới thiệu lớp lập trình ngôn ngữ ssembly là một học kỳ đầy đủ với rất nhiều công việc thực hành. Nó giả định bạn đã quen thuộc với những kiến ​​thức cơ bản về kiến ​​trúc máy tính. Rất hợp lý để mong rằng sự hiểu biết về tài liệu trên sẽ mất 300-500 giờ. Chúc may mắn!

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