2012-02-12 25 views
11
 
void return_input (void) 
{ 
    char array[30]; 

    gets (array); 
    printf("%s\n", array); 
} 

là gì Sau khi biên dịch nó trong gcc, chức năng này được chuyển thành mã hội sau:% gs trong hội

 
push %ebp 
mov %esp,%ebp 
sub $0x28,%esp 
mov %gs:0x14,%eax 
mov %eax,-0x4(%ebp) 
xor %eax,%eax 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x8048374 
lea -0x22(%ebp),%eax 
mov %eax,(%esp) 
call 0x80483a4 
mov -0x4(%ebp),%eax 
xor %gs:0x14,%eax 
je  0x80484ac 
call 0x8048394 
leave 
ret 

Tôi không hiểu hai dòng:

 
mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

% Gs là gì, và chính xác hai dòng này là gì?

Đây là lệnh biên soạn:

 
cc -c -mpreferred-stack-boundary=2 -ggdb file.c 
+0

Tôi cho rằng đây là các thanh ghi SS, DS, CS, ES, FS, GS - phân đoạn. Nếu tôi hiểu đúng. –

+1

Bản sao có thể có của [Thanh ghi "FS"/"GS" được dùng để làm gì?] (Http://stackoverflow.com/questions/10810203/what-is-the-fs-gs-register-intended-for) –

Trả lời

16

GS là một thanh ghi phân đoạn, sử dụng nó trong Linux có thể được đọc lên trên here (của nó về cơ bản sử dụng cho mỗi xử lý dữ liệu).

mov %gs:0x14,%eax 
xor %gs:0x14,%eax 

mã này được sử dụng để xác nhận rằng chồng đã không phát nổ hoặc bị corupted, sử dụng một giá trị con chim hoàng yến bảo quản ở GS + 0x14, xem this.

3

ES, FS, GS: tắm Segment Thanh ghi có thể được sử dụng như thanh ghi segment thêm; cũng được sử dụng trong các hướng dẫn đặc biệt kéo dài các phân đoạn (như các bản sao chuỗi). lấy từ đây

http://www.hep.wisc.edu/~pinghc/x86AssmTutorial.htm


hy vọng nó sẽ giúp