Bài tập mẫu Assembly
Trang 1CAC 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 2mov 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 3call 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 7loop 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 8INCLUDE 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 10call 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 11M4 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 13LIEN 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 14cout<<”\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 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);
mov ax,1 jax=1
and cx,cx ; Dung co để xét liệu n= 0
Trang 16e 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 17extern 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 18cout<<”\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 19clrscr();
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 20add 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 21mov 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 22mov 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