Các bài tập mẫu ngôn ngữ Assembly

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.

 

doc38 trang | Chia sẻ: netpro | Lượt xem: 25050 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Các bài tập mẫu ngôn ngữ Assembly, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ì cộng vào tổng nằm ở ax L4: add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a loop L3 b) Tổng các thành phần dương của mảng L3: mov dx,[bx] ; dx = a[i] and dx,dx ; Dựng cờ dấu (S=1 thì dx chứa số âm, S=0 thì dx chứa số dương) js L4 ; Nếu giá trị a[i] âm thì nhảy add ax,[bx] ; còn giá trị a[i] dương thì cộng vào tổng nằm ở ax L4: add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a loop L3 c) Tổng các thành phần chẵn của mảng L3: mov dx,[bx] ; dx = a[i] shr dx,1 ; Bit thấp nhất vào cờ Carry (C=1-> a[i] là lẻ, C=0 -> a[i] là chẵn) jc L4 ; Nếu giá trị a[i] là lẻ thì nhảy đến l4 add ax,[bx] ; còn giá trị a[i] là chẵn thì thì cộng vào tổng nằm ở ax L4: add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a d) Tổng các thành phần lẻ của mảng L3: mov dx,[bx] ; dx = a[i] shr dx,1 ; Bit thấp nhất vào cờ Carry (C=1-> a[i] là lẻ, C=0 -> a[i] là chẵn) jnc L4 ; Nếu giá trị a[i] là chẵn thì nhảy đến nhãn L4 add ax,[bx] ; còn giá trị a[i] là lẻ thì cộng vào tổng nằm ở ax L4: add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a Bài 5 ;--------------------------------------------- ; Chia 2 số với số bị chia là nguyên | ; còn số chia là nguyên dương | ; ( 2 chữ số sau dấu thập phân) | ;--------------------------------------------- Khi chương trình chạy yêu cầu có dang : Hay vao so bi chia : -20 Hay vao so chia : 3 Thuong la : -6.66 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm .MODEL small .STACK 100h .DATA M1 db 10,13,'Hay vao so bi chia : $' M2 db 10,13,'Hay vao so chia : $' M3 db 10,13,'Thuong la : $ ' dautru db '-$' daucham db '.$' M4 db 10,13,'Co tiep tuc (c/k) ? $' .CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xóa màn hình HienString M1 ; Hiện thông báo M1 (‘Hay vao so bi chia : ‘) call VAO_SO_N ; Nhận giá trị số bị chia mov bx,ax ; bx = số bị chia HienString M2 ; Hiện thông báo M2 (’Hay vao so chia : ‘) call VAO_SO_N ; Nhận giá trị số chia (ax = số chia) xchg ax,bx ; Đổi chéo (ax=số bị chia, bx=số chia) HienString M3 ; Hiện thông báo M3 (‘Thuong la : ‘) and ax,ax ; Dựng cờ dấu của số bị chia (dấu thương cùng dấu số bị chia) jns CHIA1 ; Nếu dấu số bị chia là dương thì nhảy đến nhãn CHIA1 HienString dautru ; còn nếu số bị chia là âm thì hiện dấu ‘-‘ lên màn hình (dấu âm) neg ax ; Đổi dấu số bị chia (để thành số nguyên dương) CHIA1: xor dx,dx ; dx = 0 div bx ; dx:ax chia cho bx (ax=thương còn dx=dư) call HIEN_SO_N ; Hiện giá trị của thương lên màn hình and dx,dx ; Dựng cờ của phần dư (Z=1 thì dư=0, còn Z=0 thì dư≠0) jz KT ; Dư bằng 0 thì nhảy đến kết thúc quá trình chia HienString daucham ; còn không thì hiện dấu chấm (‘.’) và tiếp tục chia mov cx,2 ; Số chữ số sau dấu thập phân mov si,10 ; si = 10 CHIA2: mov ax,dx ; Đưa phần dư vào ax mul si ; Nhân phần dư cho 10 div bx ; dx:ax chia cho bx call HIEN_SO_N ; Hiện giá trị của thương lên màn hình and dx,dx ; Dựng cờ của phần dư (Z=1 thì dư=0, còn Z=0 thì dư≠0) jz KT ; Phần dư bằng 0 thì nhảy đến kết thúc quá trình chia loop CHIA2 KT: HienString M4 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) mov ah,1 ; Chờ nhận 1 ký tự từ bàn phím int 21h cmp al,'c' ; Ký tự vừa nhận có phải là ký tự ‘c’ ? jne Exit ; Nếu không phải thì nhảy đến nhãn Exit (về DOS) jmp PS ; Còn không thì quay về đầu (bắt đầu lại chương trình) Exit: mov ah,4ch ; Về DOS int 21h INCLUDE lib2.asm END PS Bài 6 ;----------------------------------------------------------------- ; Tổng cấp số cộng khi biết n (số lượng thành phần) | ; d (công sai) và u1 (giá trị thành phần đầu tiên) | ;----------------------------------------------------------------- Khi chương trình chạy yêu cầu có dang : Hay vao n : 3 Hay vao d : 2 Hay vao u1 : 1 Tong cap so cong la : 9 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm .MODEL small .STACK 100h .DATA M1 db 10,13,'Hay vao n : $' M2 db 10,13,'Hay vao d : $' M3 db 10,13,'Hay vao u1 : $ ' M4 db 10,13,’ Tong cap so cong la : $’ M5 db 10,13,'Co tiep tuc (c/k) ? $' .CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xóa màn hình HienString M1 ; Hiện thông báo M1 (‘Hay vao n : ‘) call VAO_SO_N ; Nhận giá trị n mov cx,ax ; cx = n HienString M2 ; Hiện thông báo M2 (’Hay vao d : ‘) call VAO_SO_N ; Nhận giá trị d mov bx,ax ; bx = d HienString M3 ; Hiện thông báo M3 (’Hay vao u1 : ‘) call VAO_SO_N ; Nhận giá trị u1 mov dx,ax ; dx = ax = u1 (ax = tổng = u1; dx =ui và lúc đầu bằng u1) dec cx ; Giảm cx đi 1 (n-1) L1: add dx,bx ; dx = ui add ax,dx ; ax = tổng loop L1 HienString M4 ; Hiện thông báo M3 (‘Tong cap so cong la : ‘) call HIEN_SO_N ; Hiện tổng cấp số cộng HienString M5 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) mov ah,1 ; Chờ nhận 1 ký tự từ bàn phím int 21h cmp al,'c' ; Ký tự vừa nhận có phải là ký tự ‘c’ ? jne Exit ; Nếu không phải thì nhảy đến nhãn Exit (về DOS) jmp PS ; Còn không thì quay về đầu (bắt đầu lại chương trình) Exit: mov ah,4ch ; Về DOS int 21h INCLUDE lib2.asm END PS Bài 7 ;----------------------------------------------------------------- ; Tổng cấp số nhân khi biết n (số lượng thành phần) | ; q (công bội) và u1 (giá trị thành phần đầu tiên) | ;----------------------------------------------------------------- Khi chương trình chạy yêu cầu có dang : Hay vao n : 3 Hay vao q : 2 Hay vao u1 : 1 Tong cap so nhan la : 7 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm .MODEL small .STACK 100h .DATA M1 db 10,13,'Hay vao n : $' M2 db 10,13,'Hay vao q : $' M3 db 10,13,'Hay vao u1 : $ ' M4 db 10,13,’ Tong cap so nhan la : $’ M5 db 10,13,'Co tiep tuc (c/k) ? $' .CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xóa màn hình HienString M1 ; Hiện thông báo M1 (‘Hay vao n : ‘) call VAO_SO_N ; Nhận giá trị n mov cx,ax ; cx = n HienString M2 ; Hiện thông báo M2 (’Hay vao q : ‘) call VAO_SO_N ; Nhận giá trị q mov bx,ax ; bx = q HienString M3 ; Hiện thông báo M3 (’Hay vao u1 : ‘) call VAO_SO_N ; Nhận giá trị u1 mov si,ax ; si = ax = u1 (si = tổng = u1; ax =ui và lúc đầu bằng u1) dec cx ; Giảm cx đi 1 (n-1) L1: mul bx ; ax = ax*bx = ui add si,ax ; si = tổng loop L1 HienString M4 ; Hiện thông báo M3 (‘Tong cap so nhan la : ‘) mov ax,si ; Chuyển tổng từ si đến ax call HIEN_SO_N ; Hiện tổng cấp số nhân HienString M5 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) mov ah,1 ; Chờ nhận 1 ký tự từ bàn phím int 21h cmp al,'c' ; Ký tự vừa nhận có phải là ký tự ‘c’ ? jne Exit ; Nếu không phải thì nhảy đến nhãn Exit (về DOS) jmp PS ; Còn không thì quay về đầu (bắt đầu lại chương trình) Exit: mov ah,4ch ; Về DOS int 21h INCLUDE lib2.asm END PS Bài 8 ;--------------------------- ; Tính biểu thức | ;--------------------------- Khi chương trình chạy yêu cầu có dang : Hay vao N : 5 Tong tu 1 den 5 la : 15 Co tiep tuc CT (c/k)?_ INCLUDE lib1.asm .MODEL small .STACK 100h .DATA M1 db 10,13,'Hay vao N : $' M2 db 10,13,'Tong tu 1 den $' M3 db 10,13,' la : $ ' M4 db 10,13,'Co tiep tuc (c/k) ? $' .CODE PS: mov ax,@data mov ds,ax CLRSCR ; Xóa màn hình HienString M1 ; Hiện thông báo M1 (‘Hay vao N : ‘) call VAO_SO_N ; Nhận giá trị N mov cx,ax ; cx = N (chỉ số vòng lặp) HienString M2 ; Hiện thông báo M2 (’Tong tu 1 den ‘) call HIEN_SO_N ; Hiện giá trị N HienString M3 ; Hiện thông báo M3 (’ la : ‘) dec cx ; Giảm cx đi 1 (n-1) L1: add ax,cx ; ax = ax+cx loop L1 call HIEN_SO_N ; Hiện giá trị biểu thức HienString M4 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’) mov ah,1 ; Chờ nhận 1 ký tự từ bàn phím int 21h cmp al,'c' ; Ký tự vừa nhận có phải là ký tự ‘c’ ? jne Exit ; Nếu không phải thì nhảy đến nhãn Exit (về DOS) jmp PS ; Còn không thì quay về đầu (bắt đầu lại chương trình) Exit: mov ah,4ch ; Về DOS int 21h INCLUDE lib2.asm END PS LIÊN KẾT NGÔN NGỮ BẬC CAO VỚI ASSEMBLY Bài 1 ;-------------------------------------------------------------------------- ; a lũy thừa n (với a là số nguyên và n là số nguyên dương) | ;-------------------------------------------------------------------------- Phân công nhiệm vụ : Ngôn ngữ C++ : Nhận a và n, Gọi chương trình con tính an 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 an Cách 1: Hàm Assembly không đối (a và n khai báo biến toàn cục) Tệp C++: #include #include int a,n; extern int LT(); void main(void) { clrscr(); cout>a; cout>n; cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT(); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _a:word, _n:word .CODE PUBLIC @LT$qv @LT$qv PROC mov bx,_a ; bx = a mov cx,_n ; cx = n mov ax,1 ; ax = 1 and cx,cx ; Dựng cờ để xét liệu n = 0 jz L2 ; Nếu n = 0 thì nhảy đến L2 L1: mul bx ; còn n # 0 thì tiến hành vòng lặp tính an loop L1 L2: ret @LT$qv ENDP END Cách 2: Hàm Assembly có 1 đối (a là tham số thực và n vẫn khai báo biến toàn cục) Tệp C++: #include #include int n; extern int LT(int i1); void main(void) { int a; clrscr(); cout>a; cout>n; cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT(a); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _n:word .CODE PUBLIC @LT$qi @LT$qi PROC push BP ; Cất giá trị BP hiện thời vào stack mov BP,SP ; BP = SP mov bx,[BP+6] ; bx = a (lấy giá trị a trong stack đưa vào bx) mov cx,_n ; cx = n mov ax,1 ; ax = 1 and cx,cx ; Dựng cờ để xét liệu n = 0 jz L2 ; Nếu n = 0 thì nhảy đến L2 L1: mul bx ; còn n # 0 thì tiến hành vòng lặp tính an loop L1 L2: pop BP ; Hồi phục giá trị của BP ret @LT$qi ENDP END Cách 3: Hàm Assembly có 2 đối (a và n đều là tham số thực) Tệp C++: #include #include extern int LT(int i1, int i2); void main(void) { int a,n; clrscr(); cout>a; cout>n; cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT(a,n); getch(); } Tệp Assembly: .MODEL large .CODE PUBLIC @LT$qii @LT$qii PROC push BP mov BP,SP mov bx,[BP+6] ; bx = a (lấy giá trị a trong stack đưa vào bx) mov cx,[BP+8] ; cx = n (lấy giá trị n trong stack đưa vào cx) mov ax,1 ; ax = 1 and cx,cx ; Dựng cờ để xét liệu n = 0 jz L2 ; Nếu n = 0 thì nhảy đến L2 L1: mul bx ; còn n # 0 thì tiến hành vòng lặp tính an loop L1 L2: pop BP ; Hồi phục giá trị BP ret @LT$qii ENDP END Bài 2 ;---------------------- ; n! (n từ 0 đến 7) | ;---------------------- Phân công nhiệm vụ : Ngôn ngữ C++ : Nhận n, Gọi chương trình con tính n! 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 n! Cách 1: Hàm Assembly không đối (n khai báo biến toàn cục) Tệp C++: #include #include int n; extern int GT(); void main(void) { clrscr(); cout>n; cout<<”\nGiai thua cua ”<<n<<” la : “<<GT(); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _n:word .CODE PUBLIC @GT$qv @GT$qv PROC mov cx,_n ; cx = n mov ax,1 ; ax = 1 cmp cx,2 ; So sánh n < 0 (tức là n=0 hoặc 1) jb L2 ; Nếu n < 0 thì nhảy đến L2 L1: mul cx ; còn n ≥ 0 thì tiến hành vòng lặp tính n! loop L1 L2: ret @GT$qv ENDP END Cách 2: Hàm Assembly có 1 đối (n là tham số thực) Tệp C++: #include #include extern int GT(int i); void main(void) { int n; clrscr(); cout>n; cout<<”\nGiai thưa cua ”<<n<<” la : “<<GT(n); getch(); } Tệp Assembly: .MODEL large .CODE PUBLIC @GT$qi @GT$qi PROC push BP mov BP,SP mov cx,[BP+6] ; cx = a (lấy giá trị n trong stack đưa vào cx) mov ax,1 ; ax = 1 cmp cx,2 ; So sánh n < 0 (tức là n=0 hoặc 1) jb L2 ; Nếu n < 0 thì nhảy đến L2 L1: mul cx ; còn n ≥ 0 thì tiến hành vòng lặp tính n! loop L1 L2: pop BP ; Hồi phục giá trị BP ret @GT$qi ENDP END 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 #include int so1,so2,flag=0; extern int AVERAGE(); void main(void) { clrscr(); cout>so1; cout>so2 cout<<”\nTrung 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: ret @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 #include int flag=0; extern int AVERAGE(itn i1, int i2); void main(void) { int so1,so2; clrscr(); cout>so1; cout>so2 cout<<”\nTrung 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 ret @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 #include extern int AVERAGE(itn i1, int i2,int far* i3); void main(void) { int so1,so2,flag=0; clrscr(); cout>so1; cout>so2 cout<<”\nTrung 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 ret @AVERAGE$qiini ENDP END 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 #include int n, a[100]; extern int SUM(); void main(void) { clrscr(); cout>n; for (i=0;i<n;i++) { cout<<”\na[“<<i<<”] = “; cin>>a[i]; cout<<”\nTong 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 #include extern int SUM(int i1, int far *i2); void main(void) { int n,a[100]; clrscr(); cout>n; for (i=0;i<n;i++) { cout<<”\na[“<<i<<”] = “; cin>>a[i]; cout<<”\nTong 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ài 5 ;----------------------------------------- ; Tính biểu thức | ;----------------------------------------- Phân công nhiệm vụ : Ngôn ngữ C++ : Nhận N, Gọi chương trình con tính 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 Cách 1: Hàm Assembly không đối (N khai báo biến toàn cục) Tệp C++: #include #include int N; extern int TONG(); void main(void) { clrscr(); cout>N; cout<<”\nTong tu 1 den “<<N<<” la : “<<TONG(); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _N:word .CODE PUBLIC @TONG$qv @TONG$qv PROC mov cx,_N ; cx = N mov ax,cx ; ax = N dec cx ; cx= N-1 L1: add ax,cx ; ax = tổng loop L1 L2: ret @TONG$qv ENDP END Cách 2: Hàm Assembly có 1 đối (N là tham số thực) Tệp C++: #include #include extern int TONG(int i); void main(void) { int N; clrscr(); cout>N; cout<<”\nTong tu 1 den ”<<N<<” la : “<<TONG(N); getch(); } Tệp Assembly: .MODEL large .CODE PUBLIC @TONG$qi @TONG$qi PROC push BP mov BP,SP mov cx,[BP+6] ; cx = a (lấy giá trị n trong stack đưa vào cx) mov ax,cx ; ax = N dec cx ; cx= N-1 L1: add ax,cx ; ax = tổng loop L1 L2: pop BP ; Hồi phục giá trị BP ret @TONG$qi ENDP END Bài 6 ;----------------------------------------------------------------- ; Tổng cấp số cộng khi biết n (số lượng thành phần) | ; d (công sai) và u1 (giá trị thành phần đầu tiên) | ;----------------------------------------------------------------- Phân công nhiệm vụ : Ngôn ngữ C++ : Nhận n,d và u1, Gọi chương trình con tính tổng cấp số 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 tổng cấp số cộng Cách 1: Hàm Assembly không đối (n,d và u1 khai báo biến toàn cục) Tệp C++: #include #include int n,d,u1; extern int CSC(); void main(void) { clrscr(); cout>n; cout>d; cout>u1; cout<<”\nTong cap so cong la : “<<CSC(); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _n:word, _d:word,_u1:word .CODE PUBLIC @CSC$qv @CSC$qv PROC mov cx,_n ; cx = n mov bx,_d ; bx = d mov ax,_u1 ; ax = u1 mov dx,ax ; dx = u1 dec cx ; cx = n-1 L1: add dx,bx ; dx = ui add ax,dx ; ax = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 ret @CSC$qv ENDP END Cách 2: Hàm Assembly có 1 đối (n là tham số thực - cất vào stack, còn d,u1 vẫn là biến toàn cục) Tệp C++: #include #include int d,u1; extern int CSC(int i1); void main(void) { int n; clrscr(); cout>n; cout>d; cout>u1; cout<<”\nTong cap so cong la : “<<CSC(n); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _d:word, _u1:word .CODE PUBLIC @CSC$qi @CSC$qi PROC push BP mov BP,SP mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack) mov bx,_d ; bx = d mov ax,_u1 ; ax = u1 mov dx,ax ; dx = u1 dec cx ; cx = n-1 L1: add dx,bx ; dx = ui add ax,dx ; ax = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 pop BP ; Hồi phục giá trị của BP ret @CSC$qi ENDP END Cách 3: Hàm Assembly có 2 đối (n, d là tham số thực - cất vào satck, còn u1 vẫn là biến toàn cục) Tệp C++: #include #include int u1; extern int CSC(int i1,int i2); void main(void) { int n,d; clrscr(); cout>n; cout>d; cout>u1; cout<<”\nTong cap so cong la : “<<CSC(n,d); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _u1:word .CODE PUBLIC @CSC$qii @CSC$qii PROC push BP mov BP,SP mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack) mov bx,[BP+8] ; bx = d (lấy giá trị d từ stack) mov ax,_u1 ; ax = u1 mov dx,ax ; dx = u1 dec cx ; cx = n-1 L1: add dx,bx ; dx = ui add ax,dx ; ax = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 pop BP ; Hồi phục giá trị BP ret @CSC$qii ENDP END Cách 4: Hàm Assembly có 3 đối (n, d và u1 đều là tham số thực - cất vào satck) Tệp C++: #include #include extern int CSC(int i1,int i2,int i3); void main(void) { int n,d,u1; clrscr(); cout>n; cout>d; cout>u1; cout<<”\nTong cap so cong la : “<<CSC(n,d,u1); getch(); } Tệp Assembly: .MODEL large .CODE PUBLIC @CSC$qiii @CSC$qiii PROC push BP mov BP,SP mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack) mov bx,[BP+8] ; bx = d (lấy giá trị d từ stack) mov ax,[BP+10] ; ax = u1 (lấy từ stack) mov dx,ax ; dx = u1 dec cx ; cx = n-1 L1: add dx,bx ; dx = ui add ax,dx ; ax = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 pop BP ; Hồi phục giá trị BP ret @CSC$qiii ENDP Bài 7 ;----------------------------------------------------------------- ; Tổng cấp số nhân khi biết n (số lượng thành phần) | ; q (công bội) và u1 (giá trị thành phần đầu tiên) | ;----------------------------------------------------------------- Phân công nhiệm vụ : Ngôn ngữ C++ : Nhận n,q và u1, Gọi chương trình con tính tổng cấp số nhân 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ấp số nhân Cách 1: Hàm Assembly không đối (n,q và u1 khai báo biến toàn cục) Tệp C++: #include #include int n,q,u1; extern int CSN(); void main(void) { clrscr(); cout>n; cout>q; cout>u1; cout<<”\nTong cap so cong la : “<<CSN(); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _n:word, _q:word,_u1:word .CODE PUBLIC @CSN$qv @CSN$qv PROC mov cx,_n ; cx = n mov bx,_q ; bx = q mov ax,_u1 ; ax = u1 mov si,ax ; si = u1 dec cx ; cx = n-1 L1: mul bx ; ax = ui *q add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 mov ax,si ; Đưa giá trị tổng có ở si vào ax ret @CSN$qv ENDP END Cách 2: Hàm Assembly có 1 đối (n là tham số thực - cất vào stack, còn q và u1 vẫn là biến toàn cục) Tệp C++: #include #include int q,u1; extern int CSN(int i1); void main(void) { int n; clrscr(); cout>n; cout>d; cout>u1; cout<<”\nTong cap so cong la : “<<CSN(n); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _q:word,_u1:word .CODE PUBLIC @CSN$qi @CSN$qi PROC push BP mov BP,SP mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack) mov bx,_q ; bx = q mov ax,_u1 ; ax = u1 mov si,ax ; si = u1 dec cx ; cx = n-1 L1: mul bx ; ax = ui *q add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 mov ax,si ; ax = giá trị tổng pop BP ; Hồi phục giá trị BP ret @CSN$qi ENDP END Cách 3: Hàm Assembly có 2 đối (n, q là tham số thực - cất vào satck, còn u1 vẫn là biến toàn cục) Tệp C++: #include #include int u1; extern int CSN(int i1,int i2); void main(void) { int n,q; clrscr(); cout>n; cout>d; cout>u1; cout<<”\nTong cap so cong la : “<<CSN(n,q); getch(); } Tệp Assembly: .MODEL large .DATA EXTRN _u1:word .CODE PUBLIC @CSN$qii @CSN$qii PROC push BP mov BP,SP mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack) mov bx,[BP+8] ; bx = q (lấy giá trị d từ stack) mov ax,_u1 ; ax = u1 mov si,ax ; si = u1 dec cx ; cx = n-1 L1: mul bx ; ax = ui *q add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 mov ax,si ; ax = giá trị tổng pop BP ; Hồi phục giá trị BP ret @CSN$qii ENDP END Cách 4: Hàm Assembly có 3 đối (n, q và u1 đều là tham số thực - cất vào satck) Tệp C++: #include #include extern int CSN(int i1,int i2,int i3); void main(void) { int n,q,u1; clrscr(); cout>n; cout>d; cout>u1; cout<<”\nTong cap so cong la : “<<CSN(n,q,u1); getch(); } Tệp Assembly: .MODEL large .CODE PUBLIC @CSN$qiii @CSN$qiii PROC push BP mov BP,SP mov cx,[BP+6] ; cx = n (lấy giá trị n từ stack) mov bx,[BP+8] ; bx = q (lấy giá trị q từ stack) mov ax,[BP+10] ; ax = u1 (lấy từ stack) mov si,ax ; si = u1 dec cx ; cx = n-1 L1: mul bx ; ax = ui add si,ax ; si = (tổng các thành phần từ u1 đến ui-1) + ui loop L1 mov ax,si ; ax = tổng cấp số nhân pop BP ; Hồi phục giá trị BP ret @CSN$qiii ENDP END CÁC BÀI TẬP LẬP TRÌNH HỆ THỐNG Bài 1 Hãy viết chương trình cho biết máy tính bạn đang dùng có ổ mềm nào hay không? Nếu có thì bao nhiêu ổ? Cách giải : Chú ý byte của có địa chỉ 0:410h của vùng dữ liệu ROM BIOS có chứa các thông tin liên quan đến thông tin về ổ đĩa mềm, cụ thể như sau : x x x số lượng ổ mềm

Các file đính kèm theo tài liệu này:

  • docbaitapmau.doc
  • asmLIB1.ASM
  • asmLIB2.ASM
  • asmLIB3.ASM