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... ♥

Tbc 2 so nguyen (asm C++)

Bài 3

;---------------------------------------

; Trung bình cộng 2 số nguyên |

;---------------------------------------

Phân công nhiệm vụ :

-      Ngôn ngữ C++:

·         Nhận  2 số nguyên,

·         Gọi chương trình con tính trung bình cộ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 trung bình cộng 2 số nguyên

Cách 1: Hàm Assembly không đối (so1, so2 và flag khai báo biến toàn cục)

Tệp C++:

#include <iotream.h>

#include <conio.h>

int so1,so2,flag=0;

extern int AVERAGE();

void main(void)

{

                        clrscr();

                        cout<<”

Hay vao so1 : “; cin>>so1;

                        cout<<”

Hay vao so2 : “; cin>>so2

                        cout<<”

Trung binh cong 2 so nguyen la : “<<AVERAGE()+0.5*flag;

                        getch();

}

Tệp Assembly:

.MODEL large

.DATA

 EXTRN _so1:word,_so2:word,_flag:word

.CODE

 PUBLIC @AVERAGE$qv

@AVERAGE$qv  PROC

                        mov  ax,_so1             ; ax = so1

                        mov  bx,_so2                        ; ax = so2

                        add   ax,bx                 ; ax = ax + bx (ax = so1 + so2)

                        sar    ax,1                   ; ax = chia đôi làm tròn dưới

                        jnc    L1                      ; Nếu tổng là chẵn (C=0) thì nhảy đến L1

                        mov  cx,1                   ; còn không thì biến cờ flag =1

            mov  _flag,cx

    L1:

@AVERAGE$qv  ENDP

                        END

Cách 2: Hàm Assembly có 2 đối (giá trị so1,so2 là tham số thực - cất vào stack, còn flag vẫn là biến toàn cục)

Tệp C++:

#include <iotream.h>

#include <conio.h>

int flag=0;

extern int AVERAGE(itn i1, int i2);

void main(void)

{

                        int so1,so2;

                        clrscr();

                        cout<<”

Hay vao so1 : “; cin>>so1;

                        cout<<”

Hay vao so2 : “; cin>>so2

                        cout<<”

Trung binh cong 2 so nguyen la : “<<AVERAGE(so1,so2)+0.5*flag;

                        getch();

}

Tệp Assembly:

.MODEL large

.DATA

 EXTRN _flag:word

.CODE

 PUBLIC @AVERAGE$qii

@AVERAGE$qii  PROC

                        push  BP

                        mov  BP,SP

                        mov  ax,[BP+6]        ; ax = so1

                        mov  bx,[BP+8]        ; ax = so2

                        add   ax,bx                 ; ax = ax + bx (ax = so1 + so2)

                        sar    ax,1                   ; ax = chia đôi làm tròn dưới

                        jnc    L1                      ; Nếu tổng là chẵn (C=0) thì nhảy đến L1

                        mov  cx,1                   ; còn không thì biến cờ flag =1

            mov  _flag,cx

    L1:

                        pop  BP                      ; Hồi phục giá trị BP

@AVERAGE$qii  ENDP

                        END

Cách 3: Hàm Assembly có 3 đối (giá trị so1,so2, flag là tham số thực - cất vào stack)

Tệp C++:

#include <iotream.h>

#include <conio.h>

extern int AVERAGE(itn i1, int i2,int far* i3);

void main(void)

{

                        int so1,so2,flag=0;

                        clrscr();

                        cout<<”

Hay vao so1 : “; cin>>so1;

                        cout<<”

Hay vao so2 : “; cin>>so2

                        cout<<”

Trung binh cong 2 so nguyen la : “<<AVERAGE(so1,so2,&flag)+0.5*flag;

                        getch();

}

Tệp Assembly:

.MODEL large

.CODE

 PUBLIC @AVERAGE$qiini

@AVERAGE$qiini  PROC

                        push  BP

                        mov  BP,SP

                        mov  ax,[BP+6]        ; ax = so1

                        mov  bx,[BP+8]        ; ax = so2

                        add   ax,bx                 ; ax = ax + bx (ax = so1 + so2)

                        sar    ax,1                   ; ax = chia đôi làm tròn dưới

                        jnc    L1                      ; Nếu tổng là chẵn (C=0) thì nhảy đến L1

                        mov  cx,1                   ; còn không thì biến cờ flag =1

                        les     bx,[BP+10]      ; es:[bx] trỏ đến vùng nhớ chứa biến cờ flag

            mov  es:[bx],cx

    L1:

                        pop  BP                      ; Hồi phục giá trị BP

@AVERAGE$qiini  ENDP

                        END

Bạn đang đọc truyện trên: Truyen247.Pro

Tags: #dương