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