Tinh n! (lket asm va C++)
Bài 2
;----------------------
; n! (n từ 0 đến 7) |
;----------------------
Phân công nhiệm vụ :
- Ngôn ngữ C++:
· Nhận n,
· Gọi chương trình con tính n! do Assembly viết,
· Hiện kết quả lên màn hình.
- Ngôn ngữ Assembly : Chương trình con tính n!
Cách 1: Hàm Assembly không đối (n khai báo biến toàn cục)
Tệp C++:
#include <iotream.h>
#include <conio.h>
extern int GT();
void main(void)
{
clrscr();
cout<<”
Hay vao n : “; cin>>n;
cout<<”
Giai thua cua ”<<n<<” la : “<<GT();
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _n:word
.CODE
PUBLIC @GT$qv
@GT$qv PROC
mov cx,_n ; cx = n
mov ax,1 ; ax = 1
cmp cx,2 ; So sánh n < 0 (tức là n=0 hoặc 1)
jb L2 ; Nếu n < 0 thì nhảy đến L2
L1:
mul cx ; còn n ≥ 0 thì tiến hành vòng lặp tính n!
loop L1
L2:
@GT$qv ENDP
END
Cách 2: Hàm Assembly có 1 đối (n là tham số thực)
Tệp C++:
#include <iotream.h>
#include <conio.h>
extern int GT(int i);
void main(void)
{
clrscr();
cout<<”
Hay vao n : “; cin>>n;
cout<<”
Giai thưa cua ”<<n<<” la : “<<GT(n);
getch();
}
Tệp Assembly:
.MODEL large
.CODE
PUBLIC @GT$qi
@GT$qi PROC
push BP
mov BP,SP
mov cx,[BP+6] ; cx = a (lấy giá trị n trong stack đưa vào cx)
mov ax,1 ; ax = 1
cmp cx,2 ; So sánh n < 0 (tức là n=0 hoặc 1)
jb L2 ; Nếu n < 0 thì nhảy đến L2
L1:
mul cx ; còn n ≥ 0 thì tiến hành vòng lặp tính n!
loop L1
L2:
pop BP ; Hồi phục giá trị BP
@GT$qi ENDP
END
Bạn đang đọc truyện trên: Truyen247.Pro