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