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

Đề tài: cách định nghĩa một hàm bằng asm trong C ?

  1. #1
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Mặc định cách định nghĩa một hàm bằng asm trong C ?

    khi em viết một hàm đơn giản thế này:
    Visual C++ Code:
    1. int aaa()
    2. {
    3.     return 1;
    4. }

    mã asm của nó:
    Code:
    int aaa()
    {
    push        ebp  
    mov         ebp,esp  
    sub         esp,0C0h  
    push        ebx  
    push        esi  
    push        edi  
    lea         edi,[ebp-0C0h]  
    mov         ecx,30h  
    mov         eax,0CCCCCCCCh  
    rep stos    dword ptr es:[edi]  
    	return 1;
    mov         eax,1  
    }
    pop         edi  
    pop         esi  
    pop         ebx  
    mov         esp,ebp  
    pop         ebp  
    ret
    em thấy phần bắt đầu và kết thúc hàm hơi rườm rà, liệu có cách nào định nghĩa một hàm full asm không ạ ? (hoăc là có cách nào xóa phần mã trình biên dịch tự sinh khi bắt đâu, kết thúc hàm ?).

    thanks.

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

    C Code:
    1. extern "C" __declspec(naked) int __stdcall aaa()
    2.  
    3. {
    4.     __asm
    5.     {
    6.         mov eax, 1
    7.         ret
    8.     }
    9. }

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

    hmm về khoản này thì compiler VC++ sướng thật
    Với gcc/g++ thì phức tạp hơn nhiều :(

    C++ Code:
    1. extern "C" {int aaa();}
    2.  
    3. int main() {...}
    4. __asm(
    5.   ".globl _aaa\n"
    6.   "_aaa:"
    7.   "movl $1,%eax"
    8.   "ret"
    9. )

    Chú ý là phần assembly phải đặt trong đoạn ".text" ==> phải đặt sau 1 function definition khác (hoặc trực tiếp thêm ".text" vào). Đây là lý do mình vứt nó sau main()
    Cái này cũng ít dùng thôi. Vì bình thường cơ chế inline là quá đủ. Bạn dịch ra thấy dài dòng là vì bạn compile ở debug mode, ở release mode nó sẽ tự inline thôi (cần thì khai báo inline int xxx() cho chắc thêm).
    Trước giờ mình xài mỗi 1 lần cho lệnh rdtsc

  4. #4
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    quá chuẩn, thank 2 pro.

    công nhận inline asm trong gcc nhìn khó chịu quá.
    VC++ có cái #pragma dễ dùng, thích đặt hàm nào trong section nào cũng dc hết.
    VS # 1.

    @ fbchicken :
    rdtsc ?

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

    à, rdtsc là lệnh read time-stamp counter, đếm xung clock của CPU
    Thỉnh thoảng mình dùng cho những chỗ cần độ chính xác thời gian cao (clock() có độ chính xác chỉ tầm 18ms)
    Bạn google là biết ngay mà

    @pkthanh92: Mình chỉ nói là về khoản naked function đó thì VC++ sướng hơn thôi. Còn mỗi cái có 1 cái hay khác nhau > mình vẫn khoái g++ hơn. bcc (borland) là lởm nhất :( Hồi trước là fan của Delphi / BCBuilder mà không trụ được phải chạy
    Đã được chỉnh sửa lần cuối bởi fbchicken : 04-08-2011 lúc 11:15 PM.

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

    Mặc định cách định nghĩa một hàm bằng asm trong C ?

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    quá chuẩn, thank 2 pro.

    công nhận inline asm trong gcc nhìn khó chịu quá.
    VC++ có cái #pragma dễ dùng, thích đặt hàm nào trong section nào cũng dc hết.
    VS # 1.

    @ fbchicken :
    rdtsc ?
    rdtsc http://faydoc.tripod.com/cpu/rdtsc.htm
    http://en.wikipedia.org/wiki/Time_Stamp_Counter

    nói chung là 1 cái trả về thời gian tính theo tick từ lúc bật máy, nó được lưu trong eax( phần low)và edx ( high )

    bạn dùng google đi chứ

  7. #7
    Ngày gia nhập
    04 2011
    Bài viết
    81

    tùy thuộc trình biên dịch thôi, tiếc là trình biên dịch tcc không hỗ trợ hàm này
    live free or die
    phamthechung0@gmail.com

  8. #8
    Ngày gia nhập
    08 2011
    Bài viết
    98

    À,cái này bạn viết lại prolog và epilog cho hàm.Chú ý các convention mà bạn chọn mà clean stack cho phù hợp.

    đây là cách viết trên VS :

    http://msdn.microsoft.com/en-us/library/6xy06s51.aspx
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  9. #9
    Ngày gia nhập
    09 2011
    Bài viết
    84

    khi biên dịch bằng gcc nên optimize nó bằng option: -O2 hay 3 để nó ít ra mã tùm lum
    nên dùng trình biên dịch mới gcc-4.6.x mới vì nó optimize mã tốt hơn. Mặc định -O2 không có -fomit-frame-pointer với version trước 4.6.x
    RISC better than CISC
    phamthechung0@gmail.com

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

  1. Xu thế thay đổi nghành công nghệ thông tin trong nước
    Gửi bởi anhduongtalents trong diễn đàn Kinh nghiệm CNTT
    Trả lời: 1
    Bài viết cuối: 11-06-2012, 09:06 AM
  2. Đề xuất Đề nghị xóa bài viết "Suy nghĩ của 1 lập trình viên" trong mục KN
    Gửi bởi Trinh_lam93 trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 9
    Bài viết cuối: 28-01-2012, 12:23 AM
  3. Công nghệ mới giúp ứng dụng tinh nghệ trong ngăn ngừa và điều trị ung thư
    Gửi bởi vesim trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 31-08-2011, 02:39 PM
  4. Tuổi nghề của người trong ngành công nghệ phần mềm???
    Gửi bởi vuduykhanh trong diễn đàn Kinh nghiệm CNTT
    Trả lời: 19
    Bài viết cuối: 11-03-2010, 04:58 PM
  5. Các nghề trong lĩnh vực Công nghệ Thông tin.
    Gửi bởi tinlouis trong diễn đàn Tuyển dụng - Việc làm CNTT
    Trả lời: 3
    Bài viết cuối: 25-05-2009, 02:22 PM

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