[ C\C++ ] Ví dụ: nhúng Assembly trong C\C++ [ Assembly ]

Nhúng Assembly trong C\C++:

* Ví dụ 1:
  - Nhập vào số nguyên n (1<=n<=10, n chẵn)
  - Tính S=2!+4!+6!+...+n!

[Code Turbo C++]
/* Nhúng mã Assembly trong C++ */

#include<iostream.h>
#include<conio.h>

// khai bao
int n;

// Nhap n (thoa man 1 <= n <= 10, n la so chan)
void Nhap(){
  cout<<"\n - Nhap n: ";
  do{
     cout<<"\n n= "; cin>>n;
     if(n<1||n>10||n%2!=0)
         cout<<"\n Nhap lai n!";
   } while(n<1||n>10||n%2!=0);
}

// Tinh giai thua
int GiaiThua(int a){
   int gt=1;
                // for(int i=1;i<=a;i++)
                //     gt*=i;
// nhung assembly
    char a1 =(char)a;
    asm xor ax,ax    // xoa thanh ghi ax
    asm mov bl,1    // bien chi so
    Tinh:
           asm mov ax,gt     // ax=gt
           asm mul bl          // ax=ax*bl
           asm mov gt,ax     // gt=ax
           asm inc bl           // bl=bl+1
           asm cmp bl,a1     // so sanh bl voi a1
           asm jg Thoat1     // nhay neu bl > a1
           asm jmp Tinh
     
     Thoat1:
      return gt;
}


// Tinh tong s=2!+4!+6!+...+n!
int TongGT(int n){
    int tong=0;
                   // for(int i=2;i<=n;i=i+2)
                   //       tong=tong+GiaiThua(i);
     int gt;
     char j, t=(char)n;
// Nhung Assembly
     asm xor dx,dx   // xoa dx
     asm mov bh,2   // i=2
     Tinh1:
              asm mov j,bh       // j=bh
              asm mov dx,tong  // dx=tong
              gt=GiaiThua(j);
              asm add dx,gt       // dx=dx+gt
              asm mov tong,dx  // tong=dx
              asm add bh,2        // bh=bh+2
              asm cmp bh,t        // so sanh bh voi t
              asm jg Thoat2       // nhay neu bh > t
              asm jmp Tinh1

      Thoat2:
       return tong;
}

// ham chinh-----------------
void main(){
   Nhap();
   // in ket qua
   cout<<"\n - Tong S= "<<TongGT(n);
   getch();

}

[Tải chương trình về máy tại đây]
--------------------------------------------------------
* Ví dụ 2: 
 - Nhập vào ma trận vuông chứa 0/1, kích thước n (1 < n < 6)
 - In ma trận vừa nhập
 - Số lần xuất hiện của số 1
 - Kiểm tra tính đối xứng của ma trận

[Code Turbo C++]
#include<iostream.h>
#include<conio.h>

void main(){
 // khai bao
 int a[5][5],n;
 int i,j;
 // nhap n
 do{
  cout<<"\n n= "; cin>>n;
  if(n<2||n>5)
cout<<"\n Nhap lai n!";
 }while(n<2||n>5);

 // nhap ma tran
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
do{
cout<<"\n a["<<i<<"]["<<j<<"]= "; cin>>a[i][j];
if(a[i][j]!=1&&a[i][j]!=0)
cout<<"\n Nhap lai a["<<i<<"]["<<j<<"] !";
}while(a[i][j]!=1&&a[i][j]!=0);

  // in ma tran

 for(i=0;i<n;i++)
 {
for(j=0;j<n;j++)
cout<<a[i][j]<<"\t";
  cout<<"\n";
  }

/* dem so lan xuat hien cua 1 (nhung assembly) */
  // chuyen doi mang a thanh mang 1 chieu
  int a1[25];
  int k=0;
  for(i=0;i<n;i++)
for(j=0;j<n;j++)
 a1[k++]=a[i][j];
// thuc hien dem
  int size=n*n, dem=0;
  asm mov ax,0 // chua bien dem
  asm lea dx,a1
  asm mov di,dx
  asm mov bx,0
  Dem1:
 asm cmp bx,size
 asm je Thoat
 asm mov dx,[di]
 asm cmp dx, 1
 asm je bang
 asm jmp khongbang
 bang:
asm inc ax
 khongbang:
asm inc di
asm inc di
asm inc bx
asm jmp Dem1
Thoat:
 asm mov dem,ax
cout<<"\n - So lan xuat hien cua 1 :"<<dem;

/* kiem tra tinh doi xung */
  char n1=(char)n,j1;
  int t,t1,t2;
  asm mov cx,0
  for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
t=a[i][j1];
t1=a[j1][i];
asm mov ax,t1
asm mov dx,t
asm cmp ax,dx
asm jne KhacNhau
asm jmp Lap1
KhacNhau:
 asm mov cx,1
 break;
Lap1:
}

asm mov t2,cx
if (t2==0)
cout<<"\n - Ma tran doi xung !";
else
 cout<<"\n - Ma tran khong doi xung !";


 getch();
}