Tong cap so nhan (asm C++)
Bài 7
;-----------------------------------------------------------------
; Tổng cấp số nhân khi biết n (số lượng thành phần) |
; q (công bội) và u1 (giá trị thành phần đầu tiên) |
;-----------------------------------------------------------------
Phân công nhiệm vụ :
- Ngôn ngữ C++:
· Nhận n,q và u1,
· Gọi chương trình con tính tổng cấp số 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 tổng cấp số nhân
Cách 1: Hàm Assembly không đối (n,q và u1 khai báo biến toàn cục)
Tệp C++:
#include <iotream.h>
#include <conio.h>
int n,q,u1;
extern int CSN();
void main(void)
{
clrscr();
cout<<”
Hay vao n : “; cin>>n;
cout<<”
Hay vao q : “; cin>>q;
cout<<”
Hay vao u1 : “; cin>>u1;
cout<<”
Tong cap so cong la : “<<CSN();
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _n:word, _q:word,_u1:word
.CODE
PUBLIC @CSN$qv
@CSN$qv PROC
mov cx,_n ; cx = n
mov bx,_q ; bx = q
mov ax,_u1 ; ax = u1
mov si,ax ; si = u1
dec cx ; cx = n-1
L1:
mul bx ; ax = ui*q
add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui
loop L1
mov ax,si ; Đưa giá trị tổng có ở si vào ax
@CSN$qv ENDP
END
Cách 2: Hàm Assembly có 1 đối (n là tham số thực - cất vào stack, còn q và u1 vẫn là biến toàn cục)
Tệp C++:
#include <iotream.h>
#include <conio.h>
int q,u1;
extern int CSN(int i1);
void main(void)
{
clrscr();
cout<<”
Hay vao n : “; cin>>n;
cout<<”
Hay vao d : “; cin>>d;
cout<<”
Hay vao u1 : “; cin>>u1;
cout<<”
Tong cap so cong la : “<<CSN(n);
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _q:word,_u1:word
.CODE
PUBLIC @CSN$qi
@CSN$qi PROC
push BP
mov BP,SP
mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack)
mov bx,_q ; bx = q
mov ax,_u1 ; ax = u1
mov si,ax ; si = u1
dec cx ; cx = n-1
L1:
mul bx ; ax = ui*q
add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui
loop L1
mov ax,si ; ax = giá trị tổng
pop BP ; Hồi phục giá trị BP
@CSN$qi ENDP
END
Cách 3: Hàm Assembly có 2 đối (n, q là tham số thực - cất vào satck, còn u1 vẫn là biến toàn cục)
Tệp C++:
#include <iotream.h>
#include <conio.h>
int u1;
extern int CSN(int i1,int i2);
void main(void)
{
int n,q;
clrscr();
cout<<”
Hay vao n : “; cin>>n;
cout<<”
Hay vao d : “; cin>>d;
cout<<”
Hay vao u1 : “; cin>>u1;
cout<<”
Tong cap so cong la : “<<CSN(n,q);
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _u1:word
.CODE
PUBLIC @CSN$qii
@CSN$qii PROC
push BP
mov BP,SP
mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack)
mov bx,[BP+8] ; bx = q (lấy giá trị d từ stack)
mov ax,_u1 ; ax = u1
mov si,ax ; si = u1
dec cx ; cx = n-1
L1:
mul bx ; ax = ui*q
add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui
loop L1
mov ax,si ; ax = giá trị tổng
pop BP ; Hồi phục giá trị BP
@CSN$qii ENDP
END
Cách 4: Hàm Assembly có 3 đối (n, q và u1 đều là tham số thực - cất vào satck)
Tệp C++:
#include <iotream.h>
#include <conio.h>
extern int CSN(int i1,int i2,int i3);
void main(void)
{
int n,q,u1;
clrscr();
cout<<”
Hay vao n : “; cin>>n;
cout<<”
Hay vao q : “; cin>>d;
cout<<”
Hay vao u1 : “; cin>>u1;
cout<<”
Tong cap so cong la : “<<CSN(n,q,u1);
getch();
}
Tệp Assembly:
.MODEL large
.CODE
PUBLIC @CSN$qiii
@CSN$qiii PROC
push BP
mov BP,SP
mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack)
mov bx,[BP+8] ; bx = q (lấy giá trị q từ stack)
mov ax,[BP+10] ; ax = u1 (lấy từ stack)
mov si,ax ; si = u1
dec cx ; cx = n-1
L1:
mul bx ; ax = ui
add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui
loop L1
mov ax,si ; ax = tổng cấp số nhân
pop BP ; Hồi phục giá trị BP
@CSN$qiii ENDP
END
Bạn đang đọc truyện trên: Truyen247.Pro