Các bài tập mẫu ngôn ngữ assembly
Trang 1CAC 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 2mov 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 4HienString 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 7loop 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 8INCLUDE 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 9KT:
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 10call 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 11M4 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 13LIEN 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 14cout<<”\nHay vao a : “; cin>>a;
cout<<”\nHay vao n: “; cin>>n;
cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT(a);
Trang 15Cá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 17extern 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 18cout<<”\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 19clrscr();
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 20add 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 21mov 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 22les 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 23extern 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 24mov 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();