Chào các bạn! Vì nhiều lý do từ nay Truyen2U chính thức đổi tên là Truyen247.Pro. Mong các bạn tiếp tục ủng hộ truy cập tên miền mới này nhé! Mãi yêu... ♥

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: Truyen247.Pro

Tags: #dương