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

Tags: #dương