Trang 2 trên tổng số 3 Đầu tiênĐầu tiên 123 Cuối cùngCuối cùng
Từ 11 tới 20 trên tổng số 23 kết quả

Đề tài: Hợp ngữ & Inline assembler

  1. #11
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    Mặc định Hợp ngữ & Inline assembler

    Theo bài viết ở https://www.codeproject.com/Articles/15971/Using-Inline-Assembly-in-C-C
    tôi dịch với MinGW (gcc-tdm-1) 4.9.2 được ra exe file, nhưng chạy lỗi

    Sửa lại chạy tốt
    C Code:
    1. #include <stdio.h>
    2.  
    3. void main2(int arg1, int arg2) {
    4.     int add, sub, mul, quo, rem;
    5.     //
    6.     __asm__ ( "addl %%ebx, %%eax;" : "=a" (add) : "a" (arg1) , "b" (arg2) );
    7.     __asm__ ( "subl %%ebx, %%eax;" : "=a" (sub) : "a" (arg1) , "b" (arg2) );
    8.     __asm__ ( "imull %%ebx, %%eax;" : "=a" (mul) : "a" (arg1) , "b" (arg2) );
    9.     __asm__ ( "movl $0x0, %%edx;"
    10.               "movl %2, %%eax;"
    11.               "movl %3, %%ebx;"
    12.               "idivl %%ebx;" : "=a" (quo), "=d" (rem) : "g" (arg1), "g" (arg2) );
    13.     //
    14.     printf( "%d + %d = %d\n", arg1, arg2, add );
    15.     printf( "%d - %d = %d\n", arg1, arg2, sub );
    16.     printf( "%d * %d = %d\n", arg1, arg2, mul );
    17.     printf( "%d / %d = %d\n", arg1, arg2, quo );
    18.     printf( "%d %% %d = %d\n", arg1, arg2, rem );
    19. }
    20.  
    21. int main() {
    22.     int arg1, arg2;
    23.  
    24.     printf( "Enter two integer numbers : " );
    25.     scanf( "%d%d", &arg1, &arg2 );
    26.     /*
    27.     printf("\narg1 = %d", arg1);
    28.     printf("\narg2 = %d\n\n", arg2);
    29.     */
    30.     main2(arg1, arg2);
    31.     //
    32.     return 0 ;
    33. }

    hình minh hoạ:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		_asm_gcc2.jpg
Lần xem:	2
Size:		39.6 KB
ID:		51001

    Phọt mô xa 2016

  2. #12
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    Hàm tính sin theo degree cho trình biên dịch gcc 4.9.2

    C++ Code:
    1. #include <stdio.h>
    2. #include <math.h>
    3.  
    4. float sinx( float degree ) {
    5.     float result, two_right_angles = 180.0f ;
    6.     __asm__ __volatile__ (
    7.         "fld %1;"
    8.         "fld %2;"
    9.         "fldpi;"
    10.         "fmulp;"
    11.         "fdivp;"
    12.         "fsin;"
    13.         "fstp %0;" : "=m" (result) : "g"(two_right_angles), "g" (degree)
    14.     ) ;
    15.     return result ;
    16. }
    17.  
    18. int main(){
    19.     float x, y;
    20.     printf("\ninput (degree)x = "); scanf("%f", &x);
    21.     //
    22.     y = sinx(x); printf("\n(Calc) y = %f", y);
    23.     y = sin(x*M_PI/180.0f); printf("\n(Math) y = %f", y);
    24. }
    Biên dịch:
    gcc -o sinAsm.exe sinAsm.cpp

    Phọt mô xa 2016

  3. #13
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    Như trên, các TBD c/c++ thường có tuỳ chọn convert từ c file sang asm file.
    Lẽ nào vc (Microsoft) lại không có ?

    Phọt mô xa 2017

  4. #14
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    Xoá hết luôn cả topic, chứ xoá lẻ thì ý nghĩa chi mót

    Phọt mô xa 2017

  5. #15
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    Mặc định Phân tích một số ra thửa số nguyên tố

    Phân tích một số ra thửa số nguyên tố, viết cho TBD Borland C, hàm CanBac2 có thể thay bằng sqrt có sẵn trong std.

    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. float CanBac2(float val){
    5.     asm{
    6.         FLD val
    7.         FSQRT
    8.         FWAIT
    9.     }
    10. }
    11.  
    12. int NT(int n){
    13.     int R = CanBac2(n);
    14.     for (int i = 2; i <= R; i++)
    15.         if (n % i == 0) return i;
    16.     return n;
    17. }
    18.  
    19. int main(){
    20.     int m, n, dem = 1;
    21.     cout << "Phan tich mot so ra thua so nguyen to (PtTsNt)\n";
    22.     cout << "Input n: "; cin >> n;
    23.     if(n < 0){
    24.         cout << "Input n < 0\n";
    25.         return -1;
    26.     }
    27.    
    28.     cout << "\nPtTsNt :\n" << n << " = ";
    29.     m = NT(n);
    30.     while(m != n){
    31.         dem++;
    32.         cout << m << " * ";
    33.         n = n / m;
    34.         m = NT(n);
    35.     }
    36.     cout << m << endl << endl;
    37.     //
    38.     cout << "kq = " << dem << " TsNt\n";
    39. }
    thử test
    Cmd Code:
    1. F:\_Abc_\_Test_\_CViet_>primes
    2. Phan tich mot so ra thua so nguyen to (PtTsNt)
    3. Input n: 127381
    4.  
    5. PtTsNt :
    6. 127381 = 17 * 59 * 127
    7.  
    8. kq = 3

    Phọt mô xa 2017

  6. #16
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    Mặc định Hợp ngữ & Inline assembler

    Chưa bàn về tối ưu, với vc có thể sửa lại

    C++ Code:
    1. #define tbd_vc
    2.  
    3. #include <iostream>
    4. using namespace std;
    5.  
    6. float CanBac2(float val){
    7. #if defined(tbd_vc)
    8.     __asm{
    9.         FLD val
    10.         FSQRT
    11.         FWAIT
    12.     }
    13. #else      
    14.     asm{
    15.         FLD val
    16.         FSQRT
    17.         FWAIT
    18.     }
    19. #endif     
    20. }
    21.  
    22. int NT(int n){
    23.     int R = CanBac2(n);
    24.     for (int i = 2; i <= R; i++)
    25.         if (n % i == 0) return i;
    26.     return n;
    27. }
    28.  
    29. int main(){
    30.     int m, n, dem = 1;
    31.     cout << "Phan tich mot so ra thua so nguyen to (PtTsNt)\n";
    32.     cout << "Input n: "; cin >> n;
    33.     if(n < 0){
    34.         cout << "Input n < 0\n";
    35.         return -1;
    36.     }
    37.    
    38.     cout << "\nPtTsNt :\n" << n << " = ";
    39.     m = NT(n);
    40.     while(m != n){
    41.         dem++;
    42.         cout << m << " * ";
    43.         n = n / m;
    44.         m = NT(n);
    45.     }
    46.     cout << m << endl << endl;
    47.     //
    48.     cout << "\nkq = " << dem << " TsNt\n";
    49. }

    kiểm test:
    Cmd Code:
    1. F:\_Abc_\_Test_\_CViet_>cl /EHsc primes.cpp
    2. Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
    3. Copyright (C) Microsoft Corporation.  All rights reserved.
    4.  
    5. primes.cpp
    6. Microsoft (R) Incremental Linker Version 10.00.30319.01
    7. Copyright (C) Microsoft Corporation.  All rights reserved.
    8.  
    9. /out:primes.exe
    10. primes.obj
    11.  
    12. F:\_Abc_\_Test_\_CViet_>primes
    13. Phan tich mot so ra thua so nguyen to (PtTsNt)
    14. Input n: 127381
    15.  
    16. PtTsNt :
    17. 127381 = 17 * 59 * 127
    18.  
    19.  
    20. kq = 3 TsNt
    21.  
    22. F:\_Abc_\_Test_\_CViet_>

    Phọt mô xa 2017

  7. #17
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    Còn lại với gcc (MinGW) thì viết như thế nào cái hàm CanBac2 ?

    Phọt mô xa 2017

  8. #18
    Ngày gia nhập
    09 2016
    Bài viết
    1,028

    với c++ (MinGW):

    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. //c++ -o SoNtC.exe SoNtC.cpp
    4.  
    5. float CanBac2(float val){
    6.     float kq ;
    7.     __asm__ __volatile__ ("fld %1;"
    8.                           "fsqrt;"
    9.                           "fstp %0;" : "=m" (kq) : "g"(val)
    10.     ) ;
    11.     return kq ;
    12. }
    13.  
    14. int NT(int n){
    15.     int R = CanBac2(n);
    16.     for (int i = 2; i <= R; i++)
    17.         if (n % i == 0) return i;
    18.     return n;
    19. }
    20.  
    21. int main(){
    22.     int m, n, dem = 1;
    23.     cout << "Phan tich mot so ra thua so nguyen to (PtTsNt)\n";
    24.     cout << "Input n: "; cin >> n;
    25.     if(n < 0){
    26.         cout << "Input n < 0\n";
    27.         return -1;
    28.     }
    29.    
    30.     cout << "\nPtTsNt :\n" << n << " = ";
    31.     m = NT(n);
    32.     while(m != n){
    33.         dem++;
    34.         cout << m << " * ";
    35.         n = n / m;
    36.         m = NT(n);
    37.     }
    38.     cout << m << endl << endl;
    39.     //
    40.     cout << "kq = " << dem << " TsNt\n";
    41. }
    Kiểm test, biên dịch
    c++ -o SoNtC.exe SoNtC.cpp



    Phọt mô xa 2017

  9. #19
    Ngày gia nhập
    08 2017
    Bài viết
    956

    Thật đáng tiếc
    Nên biết dù chưa dùng tới.

  10. #20
    Ngày gia nhập
    08 2017
    Bài viết
    956

    Số ngẫu nhiên trong ngôn ngữ pascal

    Pascal Code:
    1. ...
    2. var
    3.   RandSeed: Longint = 0;    { Base for random number generator }
    4. ...
    5. function GetGOT: LongWord; export;
    6. begin
    7.   asm
    8.   MOV Result,EBX
    9.   end;
    10. end;
    11. ...
    12. function Random(const ARange: Integer): Integer;
    13. {$IF DEFINED(CPU386)}
    14. asm
    15. {     ->EAX     Range   }
    16. {     <-EAX     Result  }
    17.         PUSH    EBX
    18. {$IFDEF PIC}
    19.         PUSH    EAX
    20.         CALL    GetGOT
    21.         MOV     EBX,EAX
    22.         POP     EAX
    23.         MOV     ECX,[EBX].OFFSET RandSeed
    24.         IMUL    EDX,[ECX],08088405H
    25.         INC     EDX
    26.         MOV     [ECX],EDX
    27. {$ELSE}
    28.         XOR     EBX, EBX
    29.         IMUL    EDX,[EBX].RandSeed,08088405H
    30.         INC     EDX
    31.         MOV     [EBX].RandSeed,EDX
    32. {$ENDIF}
    33.         MUL     EDX
    34.         MOV     EAX,EDX
    35.         POP     EBX
    36. end;
    37. {$ELSEIF DEFINED(CLR)}
    38. begin
    39.   InitRandom;
    40.   Result := RandomEngine.Next(ARange);
    41. end;
    42. {$ELSE}
    43.   {$MESSAGE ERROR 'Random(Int):Int unimplemented'}
    44. {$IFEND}

    nó chứa trong file:
    ...\source\Win32\rtl\sys\System.pas

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