2012-02-19 45 views
10

Tôi hiểu rằng tôi đã không làm cho bản thân mình rõ ràng. Tôi nghi ngờ, tôi nghĩ rằng, có thể tóm tắt trong điều này:Trình biên dịch C++ biên dịch các tên biến như thế nào?

Trong tệp thi hành (mã máy) làm cách nào để "biến" được biểu thị? Chúng có phải là địa chỉ bộ nhớ tĩnh không? Trình biên dịch có cung cấp cho mỗi người một "tên" cụ thể (hoặc chỉ giữ một tên mà bạn đã cung cấp cho họ) không?

Thể hiện trong mã:

int x=5; 
//Bunch of code 
cin>>y; 
cout<<x+1; 

Làm thế nào để chương trình trong mỗi máy biết địa chỉ nào sẽ giữ giá trị 5, để giữ giá trị inputed, để thêm 1 vào giá trị nó bây giờ nắm giữ và cuối cùng in cùng giá trị đó.

--João

Trả lời

6

Đây là một chương trình đơn giản trong C:

int main() { 
    int a = 5; 
    int b = 7; 

    int c = a + b; 

    return 0; 
} 

Nếu bạn biên dịch nó với gcc -m32 -S -O0 -o main.s main.c dưới Linux, bạn sẽ nhận được một cái gì đó như thế này

.file "main.c" 
    .text 
    .globl main 
    .type main, @function 
main: 
.LFB0: 
    /* %ebp is a Base Pointer Register */ 
    pushl %ebp 
    movl %esp, %ebp 

    /* Here we reserve space for our variables */ 
    subl $16, %esp 

    /* a's address is %ebp - 4 */ 
    movl $5, -4(%ebp) 

    /* b's address is %ebp - 8 */ 
    movl $7, -8(%ebp) 

    /* a + b */ 
    movl -8(%ebp), %eax 
    movl -4(%ebp), %edx 
    addl %edx, %eax 

    /* c's address is %ebp - 12 */ 
    movl %eax, -12(%ebp) 

    /* return 0 */ 
    movl $0, %eax 
    leave 
    ret 

Như bạn có thể thấy, trong trường hợp này , các địa chỉ của các biến được tính toán dưới dạng số dư của một con trỏ cơ sở của một hàm. Nếu bạn bật tối ưu hóa, các giá trị của biến có thể được lưu trữ trong sổ đăng ký.

+0

CẢM ƠN QUÝ VỊ. Bạn đã trải qua những rắc rối khi giải thích mã asm bên trong cho tôi. Bạn không chỉ trả lời câu hỏi của tôi mà còn thỏa mãn sự tò mò của tôi và khiến tôi muốn học lắp ráp. Kudos cho bạn Sr. –

+0

Chỉ cần một điều nữa nếu nó không phải là quá nhiều để yêu cầu. Ví dụ: các số bù đó có nghĩa là:% ebp -12 = ít hơn 12 địa chỉ tính từ số cơ bản không? –

+0

@ JoãoSilva nếu% ebp là 0xffffcfe8, địa chỉ của c sẽ là 0xffffcfe8 - 4 = 0xffffcfdc, nếu đó là những gì bạn đang yêu cầu. – kharvd

7

Thực hiện cụ thể.

Thông thường, vị trí của các biến sẽ dựa trên tất cả các loại yếu tố và tối ưu hóa. Họ có thể không sống trong RAM, vì chúng có thể được tối ưu hóa để sống hoàn toàn trong các thanh ghi, hoặc được tối ưu hóa hoàn toàn.

Tên biến không tồn tại trong thời gian chạy; chúng bị loại bỏ trong quá trình biên dịch. Tuy nhiên, trình biên dịch có thể phát ra thông tin gỡ lỗi được lưu trữ trong ứng dụng nhị phân, để cho phép các nhà phát triển gỡ lỗi ứng dụng. Điều này thường được loại bỏ trong các phiên bản phát hành, mặc dù.

Tôi không biết gì về chi tiết cụ thể của Gameshark. Nhưng trong nhiều trường hợp, vị trí của một biến cụ thể có thể được tìm ra bằng cách xem mã máy cho ứng dụng.

+0

Toàn bộ bài đăng của bạn không hiển thị. Tôi xin lôi. Về các biến: Trình biên dịch làm như thế nào với các tên biến.Về câu hỏi cơ sở dữ liệu Cheat: Bạn nói vị trí của một biến có thể được tìm ra bằng mã máy? điều đó có nghĩa là một biến luôn luôn được đưa ra cùng một địa chỉ? –

+0

@ JoãoSilva: Câu hỏi ban đầu của bạn không thực sự có ý nghĩa, trình biên dịch không "biên dịch tên biến". Câu trả lời của tôi là một nỗ lực giải thích những gì tôi nghĩ rằng bạn muốn biết. –

+0

@ JoãoSilva Trình biên dịch ném đi các tên biến. –

1

Vì vậy, có hai phần cho điều này và tôi sẽ cố hết sức.

Khi biên dịch, trình biên dịch sẽ chuyển đổi mã C++ thành một biểu diễn bên trong. Điều này sau đó được chuyển đổi thành sử dụng thanh ghi của CPU một cách hiệu quả nhất có thể và đẩy phần còn lại của dữ liệu vào RAM. Khi chương trình thực hiện, dữ liệu từ ram sẽ được sao chép qua lại vào thanh ghi.

Trên câu hỏi khác của bạn, một phương pháp tôi đã thấy mọi người sử dụng cho điều này là dành cho vàng mà người dùng có. Một chương trình có thể chiếm toàn bộ không gian bộ nhớ của trò chơi và sao chép nó. Sau đó, người dùng làm điều gì đó (một hành động tối thiểu) để đạt được hoặc mất vàng. Các ứng dụng bên ngoài sau đó tìm kiếm thông qua toàn bộ không gian bộ nhớ cho những giá trị đã thay đổi, và những gì trước đây là số tiền ban đầu của vàng, và những gì bây giờ là số tiền hiện tại của vàng. Khi họ tìm thấy vị trí này, họ có thể chỉnh sửa vị trí bộ nhớ và cập nhật vị trí đó với bất kỳ giá trị nào họ muốn.

Nói chung, trò chơi phức tạp hơn, phương pháp càng khó.

+0

Cảm ơn bạn đã trả lời. Xin lỗi vì quá bối rối nhưng hãy tưởng tượng điều này: int a = 5; a = 6, giải thích đầu tiên của bạn không cho tôi biết chương trình biết giá trị nào cần thay đổi. Mặt khác, câu trả lời thứ hai của bạn giải thích quá trình tìm kiếm các giá trị trong bộ nhớ như cheatengine. Điều đó tôi đã biết. Câu hỏi của tôi là về cơ sở dữ liệu cheat mà giữ những gì trông giống như địa chỉ như nếu cùng một địa chỉ luôn luôn giữ cùng một biến trong bất kỳ giao diện điều khiển (video game console) mỗi khi chương trình chạy. Xin lỗi nếu tôi không rõ ràng. Tiếng Anh của tôi không chỉ giúp tôi. –

+0

@ JoãoSilva: Nhiều hệ thống đang triển khai [ASLR] (http://en.wikipedia.org/wiki/Address_space_layout_randomization) sẽ gây khó khăn cho bạn. –

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