Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Trình biên dịch C sinh mã máy như thế nào

  1. #1
    Ngày gia nhập
    07 2011
    Bài viết
    25

    Mặc định Trình biên dịch C sinh mã máy như thế nào

    Mình có đọc bài viết về cách tối ưu hóa code C/C++ thì có đoạn là

    Code:
    int a, b, c, d, e;
    e = a*b + a*c; 
    Trình biên dịch phát sinh mã hợp ngữ như sau: 
     
    mov eax, dword ptr [a] 
    
    imul eax, dword ptr [b] 
    
    mov ecx, dword ptr [a] 
    
    imul ecx, dword ptr [c]
    add eax, ecx  
    
    mov dword ptr [e], eax
    mình cũng có học qua môn CTMT và HN nên cũng hiểu sơ sơ cách làm việc ở mức HN

    Mình muốn hỏi là làm cách nào để biết trình biên dịch C dịch ra mã ASM như thế nào(tức là dùng tool gì để xem nó convert qua thế nào(trên cả windows và linux)... )?
    Ngoài ra các lệnh như printf ... thì trình biên dịch làm như thế nào.

  2. #2
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    Nếu bạn dùng VS thì trong đó nó đã hỗ trợ việc Disassembly một chương trình, trong quá trình Debug thì Peter cũng rất hay sử dụng chức năng này để theo dõi diễn biến và cách thức làm việc của các lệnh, đồng thời truy tìm bugs. Còn nếu bạn dùng các biên dịch không hỗ trợ tính năng này thì sau khi build ra exe thì bạn có thể xem mã ASM thông qua các tools như IDA, OllyDbg,... Đó là trên Windows, còn trên Linux thì Peter không rõ. Nhưng thông thường Peter thích thằng IDA hơn, vì nó rõ ràng và trực quan (tuy chức năng quá nhiều),.... Have fun!

    @quangnh89:
    @peter : cái tool IDA đắt lắm anh ạ, có tiền người ta cũng không bán đâu, phải chứng minh được mình thuộc công ty bảo mật và trước đấy đã từng mua Licence rồi thì họ mới cho mua.
    Anh xài đồ chùa mà, nhưng như thế cũng thấy quá đủ với mình rồi thì phải, thằng này dùng thích thật - ngay khi mới dùng anh đã thích rồi, hì hì.
    Đã được chỉnh sửa lần cuối bởi peterdrew : 21-07-2011 lúc 09:09 PM. Lý do: add: @quangnh89:

  3. #3
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Trích dẫn Nguyên bản được gửi bởi clone Xem bài viết
    Mình có đọc bài viết về cách tối ưu hóa code C/C++ thì có đoạn là

    Code:
    int a, b, c, d, e;
    e = a*b + a*c; 
    Trình biên dịch phát sinh mã hợp ngữ như sau: 
     
    mov eax, dword ptr [a] 
    
    imul eax, dword ptr [b] 
    
    mov ecx, dword ptr [a] 
    
    imul ecx, dword ptr [c]
    add eax, ecx  
    
    mov dword ptr [e], eax
    mình cũng có học qua môn CTMT và HN nên cũng hiểu sơ sơ cách làm việc ở mức HN

    Mình muốn hỏi là làm cách nào để biết trình biên dịch C dịch ra mã ASM như thế nào(tức là dùng tool gì để xem nó convert qua thế nào(trên cả windows và linux)... )?
    Ngoài ra các lệnh như printf ... thì trình biên dịch làm như thế nào.

    Các lệnh như printf thì trình biên dịch dùng lệnh CALL , khi Import thư viện chứa hàm printf, trình loader sẽ fix lại IAT và để DWORD trỏ tới địa chỉ hàm printf.

    khi dùng chỉ CALL DWORD PTR [địa chỉ của printf]

    tất nhiên phải truyền tham số. Nói chung là khá phức tạp

    Để hiểu vấn đề bạn cần có kiến thức về các mảng sau:
    ASM
    Calling convention
    Chương trình dịch
    PE file structure
    Import Address Table
    Cách load của windows loader

    Tiện thể cho mình hỏi là CTMT và HN là 2 môn gì thế

    @peter : cái tool IDA đắt lắm anh ạ, có tiền người ta cũng không bán đâu, phải chứng minh được mình thuộc công ty bảo mật và trước đấy đã từng mua Licence rồi thì họ mới cho mua.

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    25

    Chính là môn "cấu trúc máy tính và hợp ngữ"

    Mình debug các chương trình trên VS đều phải nhảy qua các lệnh xuất vì nó ra "tùm lum" cái.

    Có cách nào mình chỉ xem trình biên dịch sinh mã ở 1 đoạn code nhất định hay không,vì mình dùng các ứng dụng disasembly như W32DASM để xem 1 file đã biên dịch thì nó ra nhiều quá,cả mấy chục ngàn dòng.
    Còn như bạn nói thì cần nắm thêm cấu trúc PE của file.Mình muốn xem trình biên dịch sinh mã asm thế nào thì chắc cũng không cần xem phần này cho lắm(hồi mình làm bài tập hệ điều hành về truyền file dung lượng lớn cũng được học về cấu trúc PE này rồi)

  5. #5
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Có đấy, đó là đánh dấu địa chỉ của đoạn code cần xem rồi nhảy tới đấy

    Nhưng với VS, có lúc build ra thế này, có lúc build ra thế khác do nó cố gắng tối ưu nhất có thể

Các đề tài tương tự

  1. [bada] thư viện static lib do gcc biên dịch ra trong app được biên dịch g++
    Gửi bởi Iphone4 trong diễn đàn Thắc mắc lập trình C/C++ trên Linux
    Trả lời: 2
    Bài viết cuối: 10-08-2011, 04:53 PM
  2. Thắc mắc ko bít dùng trình biên dịch gì với trường hợp này
    Gửi bởi thienmakb trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 9
    Bài viết cuối: 23-12-2010, 04:05 AM
  3. Cấp phát bộ nhớ tiền biên dịch trong c++ như thế nào?
    Gửi bởi shadows102 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 7
    Bài viết cuối: 29-08-2010, 12:49 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn