1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

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

38 2,8K 104
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đ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 đề Các bài tập mẫu ngôn ngữ assembly
Trường học Trường Đại Học Công Nghệ Thông Tin - ĐH Quốc Gia Hà Nội
Chuyên ngành Computer Science
Thể loại Bài tập mẫu
Thành phố Hà Nội
Định dạng
Số trang 38
Dung lượng 3,86 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

CAC BAI TAP MAU THUAN TUY NGON NGU ASSEMBLY

Khi chương trình chạy yêu cầu có dang :

Hay vao a : -4 Hay vaon: 3 -4 luy thua 3 la : -64

mov bx,ax ;bx=a

HienString M2 ; Hiện thông báo M2 (“Hay vao n: ‘) call VAO SON ; Nhận giá trịn

HienString crlf ; Quay đầu dòng và xuống hàng

mov ax,bx 3 ax=a

call HIEN SON ; Hiện giá trị a lên màn hình

HienString M3 ; Hiện 2 chữ “ luy thua “

call HIEN_SO_N ; Hién gia tri n lên màn hình

HienString M4 ; Hiện chữ “ la : “

Trang 2

mov ax,Ï ; Gan ax=1

and cx,cx ; Liéu gia tri n (cx=n) có bang 0?

LAP: ; còn không thì thực hiện vòng lặp tính a lũy thừa n mul bx ¡ ax=ax*bx

loop LAP

HIEN:

call HIEN SON ; Hiện giá trị a lũy thừa n (giá trị có trong ax)

HienString M5 ; Hiện thông bao M5 (‘Co tiep tue CT (c/k) ?’ )

mov ah,1 ; Cho nhan 1 ky ty tir ban phim

int 21h

cmp al,'c' ; Ky tu vira nhan co phai 1a ky tu ‘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

Trang 3

call VAO SO_N_ ; Nhận 1 số vào từ bàn phím

HienString M2 ; Hiện thông báo M2 (“Giai thua cua °)

call HIEN SON ; Hiện giá trịn

HienString M3 ¡ Hiện thông báo M3 ( la : °)

mov ax,Ï ;ax=l

cmp cx,2 ; Liệu n<2

LAP: ; còn không thì thực hiện vòng lặp tính n!

mul cx 3 ax=ax*cx

loop LAP

HIEN:

call HIEN_SO_N ; Hién gia tri n! (co trong ax)

HienString M4 ; Hién thong bao M4 (‘Co tiep tuc CT (c/k) ?’)

mov ah,1 ; Cho nhan 1 ky ty tir ban phim

int 21h

cmp al,'c' ; Ky tu vira nhan co phai 1a ky tu ‘c’ ?

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

MI db 13,10,'Hay vao so thu I: $

M2 db 13,10,Hay vao so thu 2: $'

M3 db 13,10,'Trung binh cong 2 so nguyen la : $'

dautru db '-$'

Trang 4

HienString MI ¡ Hiện thông báo MI (“Hay vao so thu [ : °)

call VAO SO_N_ ; Nhận giá trị số thứ I

mov bx,ax ; bx = giá trị số thứ I

HienString M2 ; Hiện thông báo M2 (“Hay vao so thu 2 : ‘)

call VAO SO_N_ ; Nhận giá trị số thứ 2

HienString M3 : Hiện thông báo M3 (“Trung binh cong 2 so nguyen la :”) add ax,bx ; Tổng 2 số (ax=ax+bx)

and ax,ax ; Giá trị tổng là âm hay dương?

jns Ll ; Tổng là dương thì nhảy đến LI

HienString dautru ; còn âm thì hiện dau ‘-‘

neg ax ; va déi dấu số bị chia

LI:

shr ax,1 ¡ Chia đôi làm tròn dưới

pushf ; Cất giá trị cờ vào stack (thực chất là giá trị cờ Carry)

call HIEN SON ; Hiện giá trị trung bình cộng làm tròn dưới

popf ; Lấy lại giá trị cờ từ stack (lấy lại trạng thai bit cờ Carry)

HienString M4 ; còn Carry # 0 thì hiện thêm “.5” lên màn hình

L2:

HienString M5 ; Hiện thông báo MS (“Co tiep tuc CT (c/k)? °)

mov ah,1 ; Cho nhan | ky tu tir ban phim

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 nhan 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

Trang 5

Hay vao so luong thanh phan : 4 a[0] = -10

a[]= 5 a[2] = -15

a[3] = 8

Day so vua vao la:-10 5 -15 8

Tong day so nguyen la : -12

M6 db 10,13,'Tong day so nguyen la : $'

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

HienString M2 ¡ Hiện thông bao M2 (‘a[‘)

mov ax,i ; Hiện giá trị I

call HIEN SO_N

HienString M3 ; Hién thong bao M3 (‘] =’)

call VAO SO_N_ ; Nhận các thành phần a[ï]

mov [bx],ax ; Đưa giá trị a[ï] vào mảng a do bx trỏ đến

inc i ; Tang gia tri i lén 1

add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a

loop LI

Trang 6

; Vòng lặp đưa các số của mảng lên màn hình

mov ax,[bx] ; ax=a[i]

call HIEN SO_N ; Hién gia tri a[i] lén man hinh

HienString M5 ; Hiện 2 đấu cách (space)

add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng

loop L2

; Vòng lặp tính tổng

HienString M6 ; Hiện thông báo M6 (‘Tong day so nguyen la : ‘)

mov cx,sltp ; cx=số lượng thành phần của mảng (chi số vòng lặp)

lea bx,a ; bx trỏ đến a[0] (con tré offset)

xor ax,aXx ; ax chứa tông (lúc đầu bằng 0)

; add bx,2 ; bx trỏ đến thành phần tiếp theo cia manga |

call HIEN SO N ; Hiện giá trị tống

HienString M7 ; Hiện thông báo M7 (Co tiep tuc CT (c/k) ?”)

mov ah,l ¡ Chờ nhận I ký tự từ bàn phím

int 21h

cmp al,'c' ; Ky tu vira nhan co phai 1a ky tu ‘c’ ?

Jmp PS ; Còn không thì quay về đầu (bắt đầu lại chương trình)

Trang 7

loop L3

b) Tổng các thành phân dương của mảng

L3:

mov dx,[bx] 3 dx = ali]

and dx,dx ; Dựng cờ dấu (S=1 thì dx chứa số âm, S=0 thì dx chứa số đương)

Js L4 ; Nếu giá trị a[ï] â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

shr đx,l ; Bit thâp nhất vào cờ Carry (C=1-> a[ï] là lẻ, C=0 -> a[ï] là chẵn)

add ax,[bx] ; còn giá trị a[ï] là chăn thì thì cộng vào tổng nằm ở ax

; 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) |

Co tiep tuc CT (c/k)?

Trang 8

INCLUDE lib1l.asm

-MODEL small

.STACK 100h

.DATA

MI db 10,13,'Hay vao so bi chia : $'

M2 db 10,13,'Hay vao so chia : $'

HienString M1 ; Hiện thông bao M1 (‘Hay vao so bi chia : ‘)

call VAO SO_N_ ; Nhận giá trị số bị chia

mov bx,ax

HienString M2

; bx = số bị chia

; Hiện thông báo M2 (Hay vao so chia : °)

call VAO SO_N_ ; Nhận giá trị số chia (ax = số chia)

HienString M3 ; Hign thong bao M3 (‘Thuong la : *)

and ax,ax ; Dung co dau của số bi chia (dau thuong cling dấu số bị chia) Jns CHIAI ; Nếu dấu số bị chia là đương thì nhảy đến nhãn CHIAI

; còn nếu số bị chia là âm thì hiện dấu °-' lên màn hình (dấu âm)

¡ Đôi dâu sô bị chia (đê thành sô nguyên dương)

; Dựng cờ của phan du (Z=1 thi du=0, còn Z=0 thi du40)

; Du bang 0 thi nhảy đến kết thúc qua trinh 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 ; Dua phan du vao ax

mul si ; Nhân phần dư cho 10

div bx ; dx:ax chia cho bx

call HIEN SON ; Hiện giá trị của thương lên màn hình

and dx,dx

jz KT

loop CHIA2

; Dựng cờ của phần dư (Z= 1 thi du=0, còn Z=0 thi du40)

; Phân dư băng 0 thì nhảy đên kết thúc quá trình chia

Trang 9

KT:

HienString M4 ¡ Hiện dòng nhac M4 (‘Co tiep tuc CT (c/k) ?’)

mov ah,1 ; Cho nhan 1 ky tự từ bàn phim

int 21h

cmp al,'c' ; Ky tu vira nhan co phai 1a ky tu ‘c’ ?

jne Exit ; Nếu không phải thì nhảy đến nhan 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 (cong sai) va ul (gia tri thanh phan dau tién) |

Khi chương trình chạy yêu cầu có dang :

Hay vaon: 3 Hay vaod: 2 Hay vao u1: 1 Tong cap so cong la : 9

M4 db 10,13,’ Tong cap so cong la : $”

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

HienString MI ¡ Hiện thông báo MI (“Hay vao n: °)

call VAO SON ; Nhận giá trịn

HienString M2 ; Hién thong bao M2 (’Hay vao d : °)

Trang 10

call VAO SON ; Nhận giá trị d

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 dong nhac M4 (‘Co tiep tuc CT (c/k) ?’)

mov ah,1 ; Cho nhan I 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 phan)|

; q (công bi) va ul (giá trị thành phân đâu tiên) |

Khi chương trình chạy yêu cầu có dang :

Hay vaon: 3 Hay vaoq: 2 Hay vao u1: 1 Tong cap so nhan la : 7

Trang 11

M4 db 10,13,’ Tong cap so nhan la : $”

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

; Neu khong phai thì nhảy đên nhãn Exit (về DOS)

; Con không thì quay vê đâu (bắt đâu lại chương trình)

; Vé DOS

Khi chương trình chạy yêu cầu có dang :

Trang 12

Hay vaoN: 5 Tong tu 1 den 5 la: 15

HienString M1 ; Hién thong bao M1 (‘Hay vao N : ‘)

call VAO SON ; Nhận giá trịN

Mov Cx,ax ; cx = N (chi số vòng lặp)

HienString M2 ¡ Hiện thông báo M2 (”Tong tu | den ‘)

call HIEN SON ; Hiện giá trịN

HienString M3 ; Hiện thông báo M3 € la : °)

dec cx ; Giam cx di 1 (n-1)

LI:

add ax,cx ¡ aX = ax†cx

loop LI

call HIEN SO_N_ ; Hiện giá trị biểu thức

HienString M4 ; Hiện đòng nhắc M4 (“Co tiep tuc CT (c/k) 2’)

mov ah,1 ; Cho nhan | ky tu tir ban phim

int 21h

emp al,'c' ¡ Ký tự vừa nhận có phai 1a ky tu ‘ce’ ?

jne Exit ; Nếu không phải thì nhảy đến nhãn Exit (vé DOS)

Trang 13

LIEN KET NGON NGU BAC CAO VOI ASSEMBLY

Phan cong nhiém vu :

— Ngôn ngữ C``:

« Nhậna vàn,

¢ Goi chuong trinh con tinh a" 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 a"

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

cout<<”\nHay vao a : “; cin>>a;

cout<<”\nHay vao n: “; cin>>n;

cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LTQ);

and cx,cx ; Dung co dé xét ligu n = 0

Jz L2 ; Nếu n = 0 thì nhảy đến L2

LI:

mul bx ; còn n # 0 thì tiến hành vòng lặp tính a"

Trang 14

cout<<”\nHay vao a : “; cin>>a;

cout<<”\nHay vao n: “; cin>>n;

cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT(a);

Trang 15

Cách 3: Hàm Assembly có 2 đối (avàn đều là tham số thực)

cout<<”\nHay vao a : “; cin>>a;

cout<<”\nHay vao n : “; cin>>n;

cout<<”n”<<a<<” luy thua “<<n<<” la : “<<LT(a,n);

Trang 16

« Nhậnn, -

» - 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 : Chuong trinh con tinh n!

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

cout<<”\nHay vao n: “; cin>>n;

cout<<”\nGiai thua cua ”<<n<<” la : “<<GTQ;

Trang 17

extern int GT(int i);

void main(void)

int n;

clrscr();

cout<<”\nHay vao n : “; cin>>n;

cout<<”\nGiai thưa cua ”<<n<<” la : “<<GT(n);

mov cx,[BP+6] ; cx =a (lay giá trị n trong stack đưa vào cx)

« _ Gọi chương trình con tính trung bình cộng đo 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 (sol, so2 va flag khai báo biến toàn cục)

Trang 18

cout<<”\nHay vao sol : “; cin>>sol;

cout<<”\nHay vao so2 : “; cin>>so2

cout<<”\nTrung binh cong 2 so nguyen la : “<<AVERAGE()+0.5* flag;

mov ax, sol ¡ ax =sol

mov bx, so2 5 ax = so2

add ax,bx 3 ax = ax + bx (ax =sol + so2)

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

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

Trang 19

clrscr();

cout<<”\nHay vao sol : “; cin>>sol;

cout<<”\nHay vao so2 : “; cin>>so2

cout<<”\nTrung binh cong 2 so nguyen la : “<<AVERAGE(so1,so2)+0.5* flag; getch();

add ax,bx ¡ ax = ax + bx (ax =sol + so2)

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

Jnc Ll ; Nếu tổng là chăn (C=0) thì nhảy đến LI

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

cout<<”\nHay vao sol : “; cin>>sol;

cout<<”\nHay vao so2 : “; cin>>so2

cout<<”\nTrung binh cong 2 so nguyen la : “<<AVERAGE(sol,so2,&flag)+0.5*flag;

getch();

Trang 20

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

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

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

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

« _ 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ữ Assembiy : 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)

Trang 21

mov ax,SEG a ; ax = phan dia chỉ segment của a[0]

mov es,ax ;€S= phần địa chỉ segment của a[0]

mov bx,OFSET a ;bx= phan dia chi offset cua a[0]

xor aXx,ax ; ax = tổng và lúc đầu tổng = 0

Li:

add _ ax.es:[bx] ; ax =ax + a[ï] (đo es:[bx] trỏ đến)

add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a

Trang 22

les bx,[BP+8] ; es:[bx] trỏ đến a[0]

xor aX,AaX ; ax = tổng lúc đầu tông = 0

LI:

add ax.es:[bx] ; ax =ax + a[ï] (đo es:[bx] trỏ đến)

add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a loop LI

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

Trang 23

extern int TONGQ;

void main(void)

t

clrscr();

cout<<”\nHay vao n: “; cin>>N;

cout<<”\nTong tu 1 den “<<N<<” la : “<<TONG();

cout<<”\nHay vao N : “; cin>>N;

cout<<”\nTong tu 1 den ”<<N<<” la : “<<TONG(N);

getch();

}

Tép Assembly:

-MODEL large

Trang 24

mov cx,[BP+6] ; ex =a (lấy giá trị n trong stack dua vao cx)

; Tống cấp số cộng khi biết n (số lượng thành phần)

; d(công sai) và ul (giá trị thành phần đầu tiên) |

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

— Ngôn ngữ C'`:

« Nhậnn,d vàuIl,

« _ 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à ul khai báo biến toàn cục) Tép C`”:

cout<<”\nHay vao n : “; cin>>n;

cout<<”\nHay vao d : “; cin>>d;

cout<<”\nHay vao ul : “; cin>>ul;

cout<<”\nTong cap so cong la : “<<CSC();

Ngày đăng: 11/05/2014, 00:09

TỪ KHÓA LIÊN QUAN

w