1. Trang chủ
  2. » Luận Văn - Báo Cáo

Viết chương trình thực hiện 4 chức năng chức năng type more, chức năng tính giá trị biểu thức a

17 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Viết Chương Trình Thực Hiện 4 Chức Năng Chức Năng Type More, Chức Năng Tính Giá Trị Biểu Thức A
Tác giả Nguyễn Nhật Long, Toàn Ch& V', Hà Nội
Người hướng dẫn Đặng Thành Phu
Trường học Hà Nội
Thể loại bài tập lớn
Năm xuất bản 2023
Thành phố Hà Nội
Định dạng
Số trang 17
Dung lượng 605,67 KB

Nội dung

Cơ chế liên kết ngôn ngữ Assembly...2II... Ngôn ngữ Assembly- Ngôn ngữ Assembly là ngôn ngữ bậc thấp.- Ưu điểm:Chạy nhanh và tiết kiệm bộ nhớ.Dễ dàng thâm nhập trực tiếp vào các thiết bị

Trang 1

Hà N i - Năm 2023 ộ

Gi ng Viên Hả ướng Dẫẫn : Đ ng Thành Phuặ

L p : AAS3132023.001ớ

Sinh Viên Th c Hi n : Nguyêẫn Nh t Long -17A10010223-17A01ự ệ ậ Toàn Ch& V' -17A10010275-17A01

1

Trang 2

MỤC LỤC

I Mở đầu về lập trình hệ thống 2

1 Ngôn ngữ Assembly 2

2 Cơ chế liên kết ngôn ngữ Assembly 2

II Nội dung đề tài bài tập lớn 3

III Các công cụ hỗ trợ 3

1 Các macro hỗ trợ 3

2 Các chương trình con 4

IV Cách thực hiện 7

V Tài liệu tham khảo 16

1

Trang 3

I Mở đầu về lập trình hệ thống

1 Ngôn ngữ Assembly

- Ngôn ngữ Assembly là ngôn ngữ bậc thấp.

- Ưu điểm:

Chạy nhanh và tiết kiệm bộ nhớ

Dễ dàng thâm nhập trực tiếp vào các thiết bị phần cứng như: vùng nhớ, các cổng, các thanh ghi,…

- Nhược điểm:

Khó viết vì phải am hiểu sâu về phần cứng

Khó khăn trong việc kiểm tra lỗi

Khó khăn trong việc chuyển giao chương trình lên các máy tính

có cấu trúc khác nhau

- Ứng dụng:

Các chương trình của ROM BIOS,

Các chương trình trong các hệ thống nhúng,

Các chương trình tạo và diệt VIRUS

2 Cơ chế liên kết ngôn ngữ Assembly

- Cơ chế liên kết ngôn ngữ Assembly với bất kỳ một ngôn ngữ bậc cao

nào về cơ bản là giống nhau Do vậy, nếu nắm vững cơ chế liên kết giữa ngôn ngữ Assembly với một ngôn ngữ bậc cao nào đó thì sẽ dễ dàng hiểu được sự liên kết ngôn ngữ Assembly với một loại ngôn ngữ bậc cao khác

- Nhìn chung có hai cách thường dùng để liên kết ngôn ngữ Assembly

với ngôn ngữ bậc cao, đó là:

Inline Assembly với cơ chế chèn một khối lệnh Assembly vào chương trình được viết bằng ngôn ngữ bậc cao và

Viết tách biệt module (tệp) của ngôn ngữ bậc cao và module (tệp) của ngôn ngữ Assembly

2

Trang 4

- Để phần nào hiểu được cơ chế liên kết ngôn ngữ Assembly với ngôn

ngữ bậc cao, trong phần này đề cập đến sự liên kết giữa ngôn ngữ Assembly với ngôn ngữ C/C ++

II Nội dung đề tài bài tập lớn

- Viết chương trình thực hiện 4 chức năng:

Chức năng TYPE | more

Chức năng tính giá trị biểu thức an

Chức năng hiện địa chỉ cơ sở của videoram

Chức năng thoát khỏi chương trình

III. Các công cụ hỗ trợ

1 Các macro hỗ trợ

- Macro hiện một xâu ký tự kết thúc bằng ‘$’ ra màn hình.

HienString MACRO xau

push AX DX mov DX,offset xau ; DX tro den dau xau mov AH,9 ; Chuc nang hien 1 xau ky tu int 21h ; (ket thuc bang '$') len man hinh pop DX AX

ENDM

- Macro xóa màn hình.

clrscr MACRO

push AX mov AH,0fh ; Chuc nang lay mode man hinh hien thoi int 10h ; va so mode nam o AL

mov AH,0 ; Chuc nang dat mode cho man hinh int 10h ; so mode can dat nam o AL pop AX

3

Trang 5

2 Các chương trình con

- Chương trình con nhận một số nguyên vào từ bàn phím.

VAO_SO_N PROC

push BX CX DX SI

mov BX,10 ; Mot so hang nhan

xor CX,CX ; Phan so da vao truoc (luc dau bang 0) mov SI,CX ; Co dau cua so (luc dau coi nhu so duong) VSN1:

mov AH,1 ; Cho 1 ky tu tu ban phim

int 21h

cmp AL,0dh ; Ky tu vua vao la phim Enter

je VSN3

cmp AL,'-' ; Ky tu vua vao la dai '-'

jne VSN2 ; Khong phai dau '-' thi nhay

inc SI ; con khong thi co dau len 1

jmp VSN1

VSN2:

sub AL,30h ; Chuyen ky tu vua vao tu ma ASCII sang dang so

xor AH,AH ; AH=0 (AX la so vua vao)

xchg AX,CX ; Doi cheo so vua vao va phan so da vao truoc mul BX ; Nhan phan so da vao truoc voi 10

add CX,AX ; Cong so vua vao voi phan so da vao sau khi nhan 10

jmp VSN1

VSN3:

and SI,SI ; Dung co ZF (Neu SI#0 thi so vao la am)

jz VSN4 ; So vua vao la duong thi nhay

4

Trang 6

neg CX ; Bu 2 gia tri vua vao de duoc so am

VSN4:

mov AX,CX

pop SI DX CX BX

ret

VAO_SO_N ENDP

- Chương trình con hiện số n ra màn hình dạng cơ số 10.

VAO_SO_N PROC

push BX CX DX SI

mov BX,10 ; Mot so hang nhan

xor CX,CX ; Phan so da vao truoc (luc dau bang 0) mov SI,CX ; Co dau cua so (luc dau coi nhu so duong) VSN1:

mov AH,1 ; Cho 1 ky tu tu ban phim

int 21h

cmp AL,0dh ; Ky tu vua vao la phim Enter

je VSN3

cmp AL,'-' ; Ky tu vua vao la dai '-'

jne VSN2 ; Khong phai dau '-' thi nhay

inc SI ; con khong thi co dau len 1

jmp VSN1

VSN2:

sub AL,30h ; Chuyen ky tu vua vao tu ma ASCII sang dang so xor AH,AH ; AH=0 (AX la so vua vao)

xchg AX,CX ; Doi cheo so vua vao va phan so da vao truoc mul BX ; Nhan phan so da vao truoc voi 10

add CX,AX ; Cong so vua vao voi phan so da vao sau khi nhan 10

jmp VSN1

5

Trang 7

and SI,SI ; Dung co ZF (Neu SI#0 thi so vao la am)

jz VSN4 ; So vua vao la duong thi nhay

neg CX ; Bu 2 gia tri vua vao de duoc so am

VSN4:

mov AX,CX

pop SI DX CX BX

ret

VAO_SO_N ENDP

- Chương trình con hiện một số nguyên trong thanh ghi ax ra màn hình

dạng cơ số hexa

HIEN_HEXA PROC

push ax bx cx dx

mov bx,16 ; BX=so chia

xor cx,cx ; CX=so lan cat vao stack (luc dau=0)

HSH1:

xor dx,dx ; DX=0

div bx ; DX:AX chia cho 16 (DX luon=0) cmp dx,10 ; Lieu so du nho hon 10 (tu 0 den 9) ?

jb HSH2 ; Dung thi nhay

add dx,7 ; Con khon thi dx=dx+7

HSH2:

add dx,30h ; Chuyen so du dang so ra dang ASCII

push dx ; Cat vao stack

inc cx ; So lan cat vao stack tang len 1

and ax,ax ; Lieu thuong da bang 0 ?

jnz HSH1 ; Chua bang khong thi tiep tuc thuat toan chia HSH3: ; con khong thi tao vong lap lay tu stack cac gia pop ax ; tri da cat va hien ra man hinh

6

Trang 8

mov ah,0eh int 10h loop HSH3 mov al,'h' ; Hien them chu 'h' phia sau so hexa vua hien mov ah,0eh

int 10h pop dx cx bx ax ret

HIEN_HEXA ENDP

- Chương trình con nhận tên tệp vào từ bàn phím.

GET_FILE_NAME PROC

push ax bx cx dx mov ah,0ah ; Chuc nang nhan 1 xau tu int 21h ; ban phim va de vao buff mov bx,dx ; bx tro den dau buf inc bx ; bx tro den byte chua so luong ky tu da vao mov cl,[bx] ; cl=so luong ky tu thuc te da vao

xor ch,ch ; ch=0 de cx=cl inc bx ; bx tro den byte dau tien chua ky tu da vao add bx,cx ; bx tro den byte chua 0dh (Enter) mov [bx],ch ; Cho byte do bang 0 pop dx cx bx ax

ret GET_FILE_NAME ENDP

IV Cách thực hiện

- Liên kết giữa ngôn ngữ C++ và Assembly với sự phân công nhiệm vụ như sau: Tệp ngôn ngữ C++ viết chương trình chính làm nhiệm vụ hiện màn hình giới thiệu và màn hình chức năng và Ngôn ngữ

7

Trang 9

Assembly thiết lập 4 hàm: HIENTEP(), LUYTHUA(), DCVRAM(), VeDOS()

- Chương trình chính viết bằng C++

#include <iostream.h>

#include <conio.h>

extern HIENTEP();

extern LUYTHUA();

extern DCVRAM();

extern VeDOS();

void main()

{

char tl;

cn;int

clrscr();

cout<<"\n Truong Dai Hoc Mo Ha Noi";

cout<<"\n Khoa Cong Nghe Thong Tin";

cout<<"\n -o0o -";

cout<<"\n\n\n BAI TAP LON ";

cout<<"\n\n\n Cac sinh vien thuc hien:";

cout<<"\n Nguyen Nhat Long Lop:17A01"; cout<<"\n Toan Chi Vi Lop:17A01";

cout<<"\n\n\n Co tiep tuc CT (c/k)?";

tl=getch();

(tl== )if 'c'

{

L1:

a;int

clrscr();

cout<<"\n CAC CHUC NANG CUA BAI TAP LON";

8

Trang 10

cout<<"\n -";

cout<<"\n\n\n 1 Chuc nang hien noi dung tep"; cout<<"\n 2 Tinh a luy thua n";

cout<<"\n 3 Dia chi co so videoram";

cout<<"\n 4 Ve DOS";

cout<<"\n\n\n Hay chon: ";

cin>>cn;

switch(cn){

case : HIENTEP();1 break;

case : LUYTHUA();2 break;

case : DCVRAM();3 break;

case : VeDOS();4 break;

default: cout<<"\n Khong co chuc nang nay";break; }

cout<<"\n Co tiep tuc chuc nang khac:";

tl=getch();

if(tl=='c') goto L1;

}

}

- Hàm HIENTEP()

INCLUDE lib1.asm

.MODEL small

.DATA

hx db 13,10,' CHUC NANG HIEN NOI DUNG MOT TEP'

db 13,10,' -*** -'

db 13,10,13,10,' Hay vao ten tep can hien: $'

kc db 13,10,13,10,'$'

9

Trang 11

Err_O db 13,10,' Khong mo duoc tep !$'

Err_R db 13,10,' Khong doc duoc tep !$'

Err_W db 13,10,' Khong ghi duoc tep !$'

Err_C db 13,10,' Khong dong duoc tep !$'

buff db 30

db ?

file_name db 13,10, 30 dup(?)

the_tep dw ?

dem db 512 dup(?)

more db 13,10,' More $'

tieptuc db 13,10,' Co tiep tuc CT (c/k) ? $'

.CODE

PUBLIC @HIENTEP$qv

@HIENTEP$qv PROC L_CT0: clrscr HienString hx ; Hien thong bao hx

lea dx,buff ; DX tro den byte dau cua buff

call GET_FILE_NAME ; Vao ten tep can hien

HienString kc

lea dx,file_name ; Mo tep da co de doc

mov al,0 ; De doc

mov ah,3dh ; Chuc nang mo tep da co

int 21h

jnc L_CT1 ; CF=0 (mo tep tot) thi nhay den L_CT1,

HienString Err_O ; con neu co loi CF=1 thi bao loi

jmp Exit_CT ; roi nhay ve Exit_CT

L_CT1:

mov the_tep,ax ; Neu mo tep tot thi dua the tep co trong AX->bien the_tep

10

Trang 12

L_CT2: ; Vong lap doc 512 byte cua tep -> vung dem mov bx,the_tep ; BX=the tep copy di

mov cx,512 ; So luong byte can doc

lea dx,dem ; DX tro den dau vung dem

mov ah,3fh ; Chuc nang doc

int 21h

jnc L_CT3 ; CF=0 (doc tot) thi nhay den L_CT3,

HienString Err_R ; con CF=1 (khong doc duoc) hien thong bao err_r neu doc tep bi loi (CF=1)

jmp DONG_TEP ; roi nhay ve DONG_TEP

L_CT3:

and ax,ax ; Lieu so luong byte thuc te da doc duoc bang 0 ?

jz DONG_TEP ; ZF=0 (dung bang 0 la het tep) thi nhay den dong cac tep va ket thuc

mov bx,1 ; con khong bang 0 thi tien hanh dua ra man hinh voi the tep=1

mov cx,ax ; Dua so luong byte doc duoc vao cx

lea dx,dem ; DX tro den vung dem chua so lieu can dua ra man hinh mov ah,40h ; Chuc nang hien(ghi tep voi the tep bang 1) int 21h

jnc L_CT ; CF=0 (ghi tep tot) thi nhay den L_CT,

HienString Err_W ; con CF=1 thi hien thong bao err_w (khong ghi duoc)

jmp DONG_TEP ; roi nhay ve DONG_TEP

L_CT:

HienString more ; Hien chu More len man hinh

mov ah,1 ; cho 1 ky tu tu ban phim

int 21h

11

Trang 13

jmp L_CT2 ; Nhay ve tiep tuc doc va hien

DONG_TEP:

mov bx,the_tep ; Chuc nang dong tep

mov ah,3eh

int 21h

jnc Exit_CT ; CF=0 (dong tep tot) thi nhay ve Exit_CT, HienString Err_C ; con CF=1 (khong dong duoc) thi hien loi Exit_CT:

HienString tieptuc ; Hien thong bao tiep tuc

mov ah,1 ; cho 1 ky tu tu ban phim

int 21h

cmp al,'c' ; Ky tu vao co phai 'c'

jne Thoat_CT ; Khong phai 'c'thi nhay de Thoat_CT jmp L_CT0 ; con dung la 'c' thi nhay ve L_CT0 Thoat_CT:

ret ; ve DOS

@HIENTEP$qv ENDP

INCLUDE lib3.asm ; lib3.asm chua CT con GET_FILE_NAM

END

- Hàm LUYTHUA()

INCLUDE lib1.asm

.MODEL small

.DATA

m1 db 13,10,' CHUC NANG TINH a LUY THUA n'

db 13,10,' -*** -'

db 13,10,13,10,' Hay vao a: $'

m2 db 13,10,' Hay vao n: $'

crlf db 13,10,' $'

12

Trang 14

m3 db ' luythua $'

m4 db ' la: $'

m5 db 13,10,' Co tiep tuc CT (c/k)? $'

.CODE

PUBLIC @LUYTHUA$qv

@LUYTHUA$qv PROC

L0:

clrscr ; Xoa man hinh

HienString m1 ; Hien thong bao m1

call VAO_SO_N ; Nhan gia tri a

mov bx,ax ; BX=gia tri cua a

HienString m2 ; Hien thong bao m2

call VAO_SO_N ; Nhan gia tri n

mov cx,ax ; CX=gia tri cua n

HienString crlf ; Hien xuong hang, quay dau dong mov ax,bx ; AX=gia tri a

call HIEN_SO_N ; Hien gia tri a

HienString m3 ; Hien thong bao ' luy thua ' mov ax,cx ; AX=gia tri n

call HIEN_SO_N ; Hien gia tri n

HienString m4 ; Hien ' la: '

mov ax,1 ; AX=1 (tich ban dau bang 1) and cx,cx ; Dung co ZF

jz HIEN ; Neu ZF=0 (n=0) ti nhay den HIEN, LAP:

mul bx ; AX=AX*BX

loop LAP

HIEN:

13

Trang 15

call HIEN_SO_N ; Hien ket qua a luy thua n co trong AX HienString m5 ; Hien thong bao m5

mov ah,1 ; Cho an 1 phim

int 21h

cmp al,'c' ; Lieu phim am la 'c'

jne EXIT ; Khong phai thi nhay ve EXIT de ket thuc CT, jmp L0 ; con dung la chu 'c' thi nhay ve L0 de tiep tuc CT EXIT:

ret

@LUYTHUA$qv ENDP

INCLUDE lib2.asm

END

- Hàm VDRAM()

INCLUDE lib1.asm

.model small

.data

m1 db 13,10,' CHUC NANG HIEN DIA CHI CO SO CUA VIDEORAM'

db 13,10,' -*** -'

db 13,10,13,10,' Dia chi co so VIDEORAM la: $'

tieptuc db 13,10,' An phim bat ky de tiep tuc CT $'

.code

PUBLIC @DCVRAM$qv

@DCVRAM$qv PROC

clrscr ; Xoa man hinh

HienString m1 ; Hien thong bao m1

int 11h ; Noi dung o nho co dia chi 0:410h -> AL and al,00110000b ; Tach 2 bit chua thong tin ve loai dieu khien man hinh

14

Trang 16

cmp al,00110000b ; Kiem tra 2 bit 5,6 co bang 1 1 khong?

je MONO ; Neu bang 1 1 thi nhay den MONO, mov ax,0B000h ; con khong thi gan d/c co so VIDEORAM color -> AX

jmp HIEN

MONO:

mov ax,0B800h ; 2 bit bang 11 thi gan dia chi com so VIDEORAM -> AX

HIEN:

call HIEN_HEXA ; Hien dia chi co so VIDEORAM HienString tieptuc ; Hien thong bao tieptuc

mov ah,1 ; Cho an mot phim

int 21h

ret

@DCVRAM$qv ENDP

INCLUDE lib2.asm ; Chua CT con HIEN_HEXA

END

- Hàm VeDOS()

INCLUDE lib1.asm

.MODEL small

.CODE

PUBLIC @VeDOS$qv

@VeDOS$qv PROC

clrscr

mov ah,4ch

int 21h

ret

@VeDOS$qv ENDP

END

15

Trang 17

- Kết luận: Các hàm chạy đúng chức năng Liên kết ngôn ngữ Assembly

với ngôn ngữ C hoặc C là giống nhau, chỉ khác có tên hàm của ngôn ++ ngữ Assembly

V Tài liệu tham khảo

- Turbo Assembler Ver.4.0 (User Guide) Borland International, INC

1800 GREEN HILLS ROAD, 1993

- Turbo Assembler Ver.4.0 (Quick Reference Guide) Borland

International, INC 1800 GREEN HILLS ROAD, 1993

- Turbo Assembler và ứng dụng, Đặng Thành Phu, NXB Khoa học và

Kỹ thuật, 2007

- Lập trình trên môi trường Windows với MFC, Dương Thăng Long,

NXB Khoa học và Kỹ thuật, 2006

- PC System Programming – An in depth reference for DOS

programmer, Michael Tischer, Abacus, 1990

- Công cụ phần mềm hỗ trợ THELP

16

Ngày đăng: 08/04/2024, 12:52

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w