Trang 2 trên tổng số 2 Đầu tiênĐầu tiên 12
Từ 11 tới 18 trên tổng số 18 kết quả

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

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

    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,005

    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,005

    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,005

    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,005

    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,005

    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,005

    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,005

    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

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