2013-09-30 14 views
8

Tôi đang nghiên cứu cách C++ gọi các hàm thành viên phù hợp thông qua ngôn ngữ assembly. Chương trình đơn giản mà tôi đến với là như sau:ý nghĩa của việc đặt một ngôi sao trước khi đăng ký là gì?

class A       
{        
    public:      
     virtual void show() {} 
};        

class B : public A    
{        
    public:      
     void show() {}   
};        


int main()      
{        
    A* pA = new B;    
    pA->show();     

    return 0;     
}        

lắp ráp của nó là như sau:

main: 
.LFB2: 
    .cfi_startproc 
    .cfi_personality 0x3,__gxx_personality_v0 
    pushq %rbp 
    .cfi_def_cfa_offset 16 
    movq %rsp, %rbp 
    .cfi_offset 6, -16 
    .cfi_def_cfa_register 6 
    pushq %rbx 
    subq $24, %rsp 
    movl $8, %edi 
    .cfi_offset 3, -24 
    call _Znwm   <<<================ 1 
    movq %rax, %rbx 
    movq %rbx, %rax 
    movq %rax, %rdi 
    call _ZN1BC1Ev 
.L11: 
    movq %rbx, %rax 
    movq %rax, -24(%rbp) 
    movq -24(%rbp), %rax 
    movq (%rax), %rax 
    movq (%rax), %rdx 
    movq -24(%rbp), %rax 
    movq %rax, %rdi 
    call *%rdx    <<<=== 2 
    movl $0, %eax 
    addq $24, %rsp 
    popq %rbx 
    leave 
    ret 
    .cfi_endproc 

câu hỏi của tôi là:

  1. Tôi tìm kiếm google cho nwm, nó chỉ nói với tôi rằng c + + sử dụng nó để cấp phát bộ nhớ, một số có thể cho tôi biết thêm về nó? là nó trong một lib? nếu có thể, tôi có thể lấy mã nguồn của nó không? làm sao?
  2. tôi không hoàn toàn quen thuộc với cú pháp này, nó muốn làm gì?
+2

mã của bạn bị rò rỉ bộ nhớ, btw ... mỗi mới phải phù hợp với một xóa ... – Goz

+4

@Goz: Rất có thể Alex đã biết điều này và chỉ đơn giản là muốn tạo một [Ngắn, Tự chứa, Sửa (Compilable), Ví dụ] (http://meta.stackexchange.com/questions/22754/sscce-how-to-provide-examples-for-programming-questions). –

+0

@Goz, tôi nghĩ rằng Martin Liversage đã trả lời mối quan tâm của bạn, cảm ơn Martin vì câu trả lời của bạn và cảm ơn Goz vì đã chỉ ra cho tôi. – Alex

Trả lời

11

* được sử dụng trước các địa chỉ tuyệt đối trong AT & Cú pháp lắp ráp T cho lệnh gọi hoặc lệnh nhảy. Điều này có nghĩa là nó sẽ nhảy đến địa chỉ chứa trong thanh ghi. Cách thay thế là một bước nhảy tương đối, liên quan đến lệnh hiện tại.

Từ GNU as manual:

AT & T tuyệt đối (như trái ngược với PC tương đối) nhảy/toán hạng cuộc gọi được bắt đầu bằng `* '; chúng không bị giới hạn trong cú pháp Intel.

Trong mã của bạn, bạn nên có cuộc gọi đến địa chỉ trong sổ đăng ký. Gọi số pA->show() yêu cầu tìm kiếm để biết hàm nào được gọi đúng là. Điều này là bởi vì nó là một chức năng ảo trên lớp A.

+0

Tôi viết bài này để đảm bảo rằng tôi hiểu nó chính xác. theo liên kết mà bạn cung cấp, có nghĩa là nó sẽ gọi hàm bắt đầu tại địa chỉ được lưu trữ trong thanh ghi đó? – Alex

+0

@GavinSmith, Đăng ký cũng có thể chứa một khoản bù đắp mà bạn có thể chuyển đến, thay vì địa chỉ tuyệt đối không? Nếu không, trích dẫn này sẽ không có ý nghĩa. – Devolus

+1

@Devolus Có cho cả hai. Tôi đã cập nhật câu trả lời của mình để đề cập đến điều này. –

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