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: truyentop.pro

Tags: #dương