2012-03-11 8 views
5

Tôi có thể đọc hoặc ghi vào một biến được định nghĩa trong tệp tin lắp ráp trong tệp C của tôi không? Tôi không thể tự mình tìm ra nó. Ví dụ: tệp C có dạng như sau:Có thể truy cập các biến được định nghĩa trong assembly từ C không?

int num = 33;

và sản xuất lắp ráp mã này:

.file "test.c" 
.globl _num 
.data 
.align 4 

_num: .long 33

Như tôi đã bắt đầu học lắp ráp tôi thường nghe nói tốc độ là lý do tại sao tôi phải chọn lắp ráp adn tập thấp kích thước và tất cả những thứ mà ...

tôi đang sử dụng mingw (32 bit) lắp ráp gnu trên windows7

+5

không được như vậy phòng thủ :) – UmNyobe

+6

* Khi tôi bắt đầu học lắp ráp tôi nghe thường tốc độ là lý do tại sao tôi phải chọn lắp ráp kích thước tập tin adn thấp hơn và tất cả những thứ ... * Một người có khả năng tay tối ưu hóa assembler tốt hơn so với trình biên dịch biết chính xác khi nào nó thích hợp và khi nào thì không. Dường như bạn chưa có mặt ở đó. Trình biên dịch của bạn có khả năng kết quả đầu ra tốt hơn so với bạn làm (nhưng điều đó không có nghĩa là ngừng học tập!). –

+0

chính xác đó là lý do tại sao i'am đặt câu hỏi ngay cả khi họ có thể xuất hiện ngớ ngẩn lúc đầu trông – orustam

Trả lời

5

Có, Trình liên kết kết hợp tất cả các tệp .s và tạo một tệp đối tượng. Vì vậy, tất cả các tập tin c của bạn đầu tiên sẽ trở thành tập tin lắp ráp. Mỗi tập tin lắp ráp sẽ có danh sách nhập và danh sách xuất. Danh sách xuất chứa tất cả các biến có chỉ thị .global. Danh sách nhập chứa tất cả các biến bắt đầu bằng một extern trong tệp c. Vì vậy, nếu tập tin assembly chứa này:

.file "test.c" 
.globl _num 
.data 
.align 4 

Tất cả bạn cần làm để sử dụng num, là tạo ra một biến extern như thế này

extern int num 

và sau đó bạn sẽ có thể đọc hoặc sửa đổi nó.

4

có, bạn có thể chia sẻ các biến cả hai hướng. sử dụng các .globl như bạn có và sau đó trong C khai báo một biến bên ngoài như thể nó đã được trong một mô-đun C nhưng thay vào đó nó là trong một mô-đun asm.

+0

Tôi đã thử nó, nhưng có một số vấn đề liên kết, đây là mảnh lắp ráp: \t '.global num \t num: \t \t. int 13' và tệp C của tôi: '#include extern int num; int main() { \t printf ("% d \ n", num); } 'Tôi có một vấn đề liên kết:' math.c :(. Text + 0xf): undefined tham chiếu đến 'num'' tôi đang làm gì sai? – orustam

+0

bạn có đang biên dịch cả hai tệp với nhau hoặc chỉ tệp c của bạn? – theRealWorld

+0

Tôi đang biên dịch chúng như sau: gcc -m32 -o test.c myasm.s – orustam