Tinh tong 1 day so nguyen (asm C++)
Bài 4
;---------------------------------------
; Tính tổng một dãy số nguyên |
;---------------------------------------
Phân công nhiệm vụ :
- Ngôn ngữ C++:
· Nhận số lượng thành phần n,
· Nhận các số của dãy số đưa vào một mảng,
· Gọi chương trình con tính tổng các thành phần của mảng 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ác thành phần của mảng.
Cách 1: Hàm Assembly không đối (n và địa chỉ a[0] khai báo biến toàn cục)
Tệp C++:
#include <iotream.h>
#include <conio.h>
int n, a[100];
extern int SUM();
void main(void)
{
clrscr();
cout<<”
Hay vao so luong thanh phan : “; cin>>n;
for (i=0;i<n;i++)
{
cout<<”
a[“<<i<<”] = “;
cin>>a[i];
cout<<”
Tong cua day so nguyen la : “<<SUM();
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _n:word, _a:dword
.CODE
PUBLIC @SUM$qv
@SUM$qv PROC
mov cx,_n ; cx = n
mov ax,SEG _a ; ax = phần địa chỉ segment của a[0]
mov es,ax ; es = phần địa chỉ segment của a[0]
mov bx,OFSET _a ; bx = phần địa chỉ offset của a[0]
xor ax,ax ; ax = tổng và lúc đầu tổng = 0
L1:
add ax.es:[bx] ; ax = ax + a[i] (do es:[bx] trỏ đến)
add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a
loop L1
ret
@SUM$qv ENDP
END
Cách 2: Hàm Assembly có 2 đối (n và địa chỉ a[0] là tham số thực của hàm-để vào stack)
Tệp C++:
#include <iotream.h>
#include <conio.h>
extern int SUM(int i1, int far *i2);
void main(void)
{
int n,a[100];
clrscr();
cout<<”
Hay vao so luong thanh phan : “; cin>>n;
for (i=0;i<n;i++)
{
cout<<”
a[“<<i<<”] = “;
cin>>a[i];
cout<<”
Tong cua day so nguyen la : “<<SUM(n,a);
getch();
}
Tệp Assembly:
.MODEL large
.CODE
PUBLIC @SUM$qini
@SUM$qini PROC
push BP
mov BP,SP
mov cx,[BP+6] ; cx = n (lấy từ stack)
les bx,[BP+8] ; es:[bx] trỏ đến a[0]
xor ax,ax ; ax = tổng lúc đầu tổng = 0
L1:
add ax.es:[bx] ; ax = ax + a[i] (do es:[bx] trỏ đến)
add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a
loop L1
pop BP ; Hồi phục giá trị BP
ret
@SUM$qini ENDP
END
Bạn đang đọc truyện trên: TruyenTop.Vip