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

Bài tập mẫu NN assembly

38 244 0
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 đề Bài tập mẫu NN assembly
Định dạng
Số trang 38
Dung lượng 3,69 MB

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

Nội dung

Bài tập mẫu Assembly

Trang 1

CAC BAI TAP MAU THUAN TUY NGON NGU ASSEMBLY Bail

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

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

mov cx,ax ;cxX=n

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

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

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

mov ax,cx ; ax=n

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 giá trị n (cx=n) có bằng 0 ?

jz HIEN ; Nếu bằng 0 thì nhảy đến nhãn HIEN

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

loop LAP

HIEN:

call HIEN_SO_N ; Hién gia tri a lũy thừa n (giá trị co trong ax)

HienString M5 ; Hiện thông báo MS (“Co tiep tục CT (c/k) ?? ) mov ah,1 ; Chờ nhận 1 ky ty tir ban phim

int 21h

emp al,'c' ; Ky ty via nhan co phai 1a ky ty ‘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 I số vào từ bàn phím

mOV CX,aX ;cx=n

HienString M2 ; Hién thong bao M2 (‘Giai thua cua ‘)

call HIEN_SO_N ; Hién gia trin

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

moV ax,Ï 3 ax=]

cmp cx,2 ; Ligun <2

jb HIEN ; Đúng là < 2 thì nhảy đến nhãn HIEN

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

loop LAP

HIEN:

call HIEN SON ; Hiện giá trị n! (có trong ax)

HienString M4 ; Hién thong bao 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' ; Ky tu vira nhan 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 ; Con khéng thi quay vé dau (bat dau lai chuong trinh) Exit:

mov ah,4ch ; Vé DOS

M1 _— db 13,10,Hay vao so thu l: $'

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

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

dautru db '-$'

Trang 4

; còn âm thì hiện dấu ‘-‘

; va déi dau số bị chia

; Chia đôi làm tròn dưới

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

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

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

; Nếu Carry=0 (giá trị tổng là chăn) thì nhảy

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

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

; Chờ nhận 1 ký tự từ bàn phím

; Ký tự vừa nhận có phải là ký tự “c” ?

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

; Còn 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 5

Hay vao so luong thanh phan : 4

a[0] = -10 a[1|= 5 a[2]= -f5

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 M1 ; Hiện thông báo MI (“Hay vao so luong thanh phan :”)

call VAO SO_N_ ; Nhận số lượng thành phần

mov sltp,ax ; Cất giá trị số lượng thành phần vào biến sltp

HienString M2 ; Hiện thông báo M2 (‘a[*)

mOV aX,I ; Hiện giá trị 1

call HIEN SON

HienString M3 ¡ Hiện thông bao M3 (‘] =’)

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

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

inc i ; Tang gia tri i 1én 1

add bx,2 ; bx tro dén thành phan tiếp theo của mang a

loop LI

Trang 6

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

HienString M4 ; Hién thong bao M4 (‘Day so vua vao la : °)

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

lea bx,a ; bx trỏ đến a[0]

L2:

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

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

HienString MS ; Hiện 2 dấ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 ; CXx=sỐ lượng thành phần của mảng (chỉ số vòng lặp)

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

XOT aX,AaX ; ax chứa tổng (lúc đầu bằng 0)

|

bx,2 ; bx tro dén thanh phan tiép theo cua 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,1 ; Cho nhan 1 ký tự từ bàn phím

int 21h

cmp al,'c' ; Ky tự vừa nhận co phai la 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)

Trang 7

loop L3

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

L3:

mov dx,[bx] ; dx =al[i]

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

Js L4 ; Nếu giá trị a[ï] âm thì nhảy

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

shr dx,1 ; Bit thap nhat vao co Carry (C=1-> a[ï] là lẻ, C=0 -> a[i] 1a chin)

je 14 ; Nếu giá trị a[ï] là lẻ thì nhảy đến 14

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ố chỉa 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)?_

Trang 8

INCLUDE lib1.asm

MODEL small

.STACK 100h

DATA

MI đb 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 ;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=s6 bi chia, bx=s6 chia)

HienString M3 ; Hién thong bao M3 (‘Thuong la : °)

and ax,ax ; Dung cờ dau của số bị chia (đấu thương cùng dau sé bi chia)

jns CHIAI ; Nếu dau sé bi chia là đương thì nhảy đến nhãn CHIA I

HienString đautru ; còn nếu số bị chia là âm thì hiện đấu ‘-‘ 1én màn hình (dấu âm)

neg ax ; Déi dau số bị chia (để thành số nguyên dương)

CHIAI:

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 ; Dung cờ của phần dư (Z=1 thi du=0, còn Z=0 thi du40)

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 dau thập phân

mov si,10 ;SI= 10

CHIA2:

mov ax,dx ; Dua phan du vao ax

mul si ; Nhan phan du 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 ; Dung cờ của phần dư (Z=1 thi du=0, còn Z=0 thi du40)

jz KT ; Phan du bang 0 thì nhảy đến kết thúc quá trình chia

loop CHIA2

Trang 9

; Nêu không phải 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)

Tong cap so cong la : 9

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

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

Trang 10

call VAO SON

; Hiện thông báo M3 (Hay vao ul : °)

; Nhan gia tri ul

; dx =ax =ul (ax = téng = ul; dx =u; va luc dau bang u,)

; Giam cx di 1 (n-1)

3 dx = Uj, jax = tong

; Hign thong bao M3 (‘Tong cap so cong la : *)

; Hién tong cấp, số cộng

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

; Chờ nhận I ký tự từ bàn phím

; Ký tự vừa nhận có phải là ký tự “c” ?

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

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

; Về DOS

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

; q (công bội) và ul (gia tri thành phần đầu tiên) |

Tong cap so nhan la : 7

Trang 11

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

MS db 10,13,Co tiep tuc (c/k) ? $"

HienString MI ; 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 SON ; Nhận giá trị q

HienString M3 ; Hiện thông báo M3 (“Hay vao ul : °)

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

mov si,ax ; si=ax =ul (si = tong = ul; ax =u; va luc dau bằng u) dec cx ; Giam cx di 1 (n-1)

LI:

mul bx 5 ax = ax*bx = uj

add si,ax ; sỉ = tổng

loop LI

HienString M4 ; Hiện thông bao M3 (‘Tong cap so nhan la : *)

mov ax,Si ; Chuyén tong tir si dén ax

call HIEN SO _N_ ; Hién tong cap sé nhan

HienString MS ; Hiện dòng nhac M4 (‘Co tiep tuc CT (c/K) ?°)

mov ah,l ; Cho nhận I ký tự từ bàn phím

int 21h

cmp al,'c' ; Ky tu vira nhan 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

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 gia tri N

mov Cx,ax ; ex =N (chỉ số vòng lặp)

HienString M2 ; Hién thong bao M2 (’Tong tu 1 den ‘)

call HIEN_SO_N ; Hién gia tri N

HienString M3 ; Hién thong bao M3 (’ la: *)

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

LI:

add ax,cx 3 ax = axtcx

loop LI

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

HienString M4 ; Hiện dòng nhac M4 (‘Co tiep tuc CT (c/K) ?°)

mov ah,l ; Cho nhận I ký tự từ bàn phím

int 21h

cmp al,'c' ; Ky tu vira nhan 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

Trang 13

LIEN KET NGON NGU BAC CAO VOI ASSEMBLY Bail

; 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ậna vàn,

« - Gọi chương trình 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 va 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;

mov ax,Ï ;ax= ]

and cx,cx ; Dung co để xét liệu 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);

mov ax,1 jax=1

and cx,cx ; Dung co để xét liệu n= 0

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

mov ax,1 jax=1

and cx,cx ; Dung co để xét liệu n= 0

Trang 16

e Nhann, „

¢ Goi chuong trinh con tinh n! do Assembly viét,

e _ 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 I: 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;

clrser();

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

cout<<”\nGiai thua cua ”<<n<<” la : “<<GT(n);

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

mov ax,Ï jax=1

« _ 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)

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;

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

sar ax,Ì ; ax = chia đôi làm tron dưới

Trang 19

clrscr();

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

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

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

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

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

jne LI ; Nếu tổng là chin (C=0) thi nhay dén L1

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

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

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

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

getch();

Trang 20

add ax,bx 3 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 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

e 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 tinh 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 chi segment cua a[0]

mov es,ax ; es = phan dia chi segment cua a[0]

mov bx,OFSET _a ; bx = phần địa chỉ offset của a[0]

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

LI:

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

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

Trang 22

mov cx,[BP+6] ;cx=n (lay tir stack)

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

XOT aX,aX ; ax = tổng lúc đầu tổng = 0

LI:

add ax.es:[bx] ; ax = ax + a[ï] (do 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 gid tri BP

Ngày đăng: 09/05/2014, 12:04

TỪ KHÓA LIÊN QUAN

w