mov ax,@data
mov ds,ax
clrscr
HienString M1 ; Hiện thông báo M1 (‘Hay vao a : ‘)
call VAO_SO_N ; Nhận giá trị a
mov bx,ax ; bx = a
HienString M2 ; Hiện thông báo M2 (‘Hay vao n : ‘)
call VAO_SO_N ; Nhận giá trị n
mov cx,ax ; cx = n
HienString crlf ; Quay đầu dòng và xuống hàng
38 trang |
Chia sẻ: vietpd | Lượt xem: 4001 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Các bài tập mẫu thuần túy ngôn ngữ assembly, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CÁC BÀI TẬP MẪU THUẦN TÚY
NGÔN NGỮ ASSEMBLY
Bài 1
;--------------------------------------------------------------------------
; a lũy thừa n (với a là số nguyên và n là số nguyên dương) |
;--------------------------------------------------------------------------
Khi chương trình chạy yêu cầu có dang :
Hay vao a : -4
Hay vao n : 3
-4 luy thua 3 la : -64
Co tiep tuc CT (c/k)?_
INCLUDE lib1.asm
.MODEL small
.STACK 100h
.DATA
M1 db 13,10,'Hay vao a : $'
M2 db 13,10,'Hay vao n : $'
crlf db 13,10,'$'
M3 db ' luy thua $'
M4 db ' la : $'
M5 db 13,10,'Co tiep tuc CT (c/k)? $'
.CODE
PS:
mov ax,@data
mov ds,ax
clrscr
HienString M1 ; Hiện thông báo M1 (‘Hay vao a : ‘)
call VAO_SO_N ; Nhận giá trị a
mov bx,ax ; bx = a
HienString M2 ; Hiện thông báo M2 (‘Hay vao n : ‘)
call VAO_SO_N ; Nhận giá trị n
mov cx,ax ; cx = n
HienString crlf ; Quay đầu dòng và xuống hàng
mov ax,bx ; ax=a
call HIEN_SO_N ; 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 giá trị n lên màn hình
HienString M4 ; Hiện chữ ‘ la : ‘
mov ax,1 ; Gán 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
mul bx ; ax=ax*bx
loop LAP
HIEN:
call HIEN_SO_N ; Hiện giá trị a lũy thừa n (giá trị có trong ax)
HienString M5 ; Hiện thông báo M5 (‘Co tiep tục CT (c/k) ?’ )
mov ah,1 ; Chờ nhận 1 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 2
;----------------------
; n! (n từ 0 đến 7) |
;----------------------
Khi chương trình chạy yêu cầu có dang :
Hay vao n : 6
Giai thua cua 6 la : 720
Co tiep tuc CT (c/k)?_
INCLUDE lib1.asm
.MODEL small
.STACK 100h
.DATA
M1 db 13,10,'Hay vao n : $'
M2 db 13,10,'Giai thua cua $'
M3 db ' la : $'
M4 db 13,10,'Co tiep tuc CT (c/k)? $'
.CODE
PS:
mov ax,@data
mov ds,ax
clrscr
HienString M1 ; Hiện thông báo M1 (‘Hay vao n : ‘)
call VAO_SO_N ; Nhận 1 số vào từ bàn phím
mov cx,ax ; cx = n
HienString M2 ; Hiện thông báo M2 (‘Giai thua cua ‘)
call HIEN_SO_N ; Hiện giá trị n
HienString M3 ; Hiện thông báo M3 (‘ la : ‘)
mov ax,1 ; ax=1
cmp cx,2 ; Liệu n ≤ 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!
mul cx ; ax=ax*cx
loop LAP
HIEN:
call HIEN_SO_N ; Hiện giá trị n! (có trong ax)
HienString M4 ; Hiện thông báo M4 (‘Co tiep tuc CT (c/k) ?’)
mov ah,1 ; Chờ nhận 1 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 3
;---------------------------------------
; Trung bình cộng 2 số nguyên |
;---------------------------------------
Khi chương trình chạy yêu cầu có dang :
Hay vao so thu 1 : -12
Hay vao so thu 2 : 5
Trung binh cong 2 so nguyen la : -3.5
Co tiep tuc CT (c/k)?_
INCLUDE lib1.asm
.MODEL small
.STACK 100h
.DATA
M1 db 13,10,'Hay vao so thu 1: $'
M2 db 13,10,'Hay vao so thu 2: $'
M3 db 13,10,'Trung binh cong 2 so nguyen la : $'
dautru db '-$'
M4 db '.5$'
M5 db 13,10,'Co tiep tuc CT (c/k)? $'
.CODE
PS:
mov ax,@data
mov ds,ax
clrscr
HienString M1 ; Hiện thông báo M1 (‘Hay vao so thu 1 : ‘)
call VAO_SO_N ; Nhận giá trị số thứ 1
mov bx,ax ; bx = giá trị số thứ 1
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 L1 ; Tổng là dương thì nhảy đến L1
HienString dautru ; còn âm thì hiện dấu ‘-‘
neg ax ; và đổi dấu số bị chia
L1:
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_SO_N ; 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 thái bit cờ Carry)
jnc L2 ; Nếu Carry=0 (giá trị tổng là chẳn) thì nhảy
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 M5 (‘Co tiep tuc CT (c/k)? ‘)
mov ah,1 ; Chờ nhận 1 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 4
;-----------------------------
; Tổng 1 dãy số nguyên |
;-----------------------------
Khi chương trình chạy yêu cầu có dang :
Hay vao so luong thanh phan : 4
a[0] = -10
a[1] = 5
a[2] = -15
a[3] = 8
Day so vua vao la : -10 5 -15 8
Tong day so nguyen la : -12
Co tiep tuc CT (c/k)?_
INCLUDE lib1.asm
.MODEL small
.DATA
M1 db 10,13,'Hay vao so luong thanh phan : $'
M2 db 10,13,'a[$'
M3 db ']= $'
M4 db 10,13,'Day so vua vao la : $'
M5 db ' $'
M6 db 10,13,'Tong day so nguyen la : $'
M7 db 13,10,'Co tiep tuc CT (c/k) ? $'
sltp dw ?
i dw ?
a dw 100 dup(?)
.CODE
PS:
mov ax,@data
mov ds,ax
CLRSCR
HienString M1 ; Hiện thông báo M1 (‘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
; Vòng lặp nhận các số đưa vào mảng
mov cx,ax ; cx=số lượng thành phần (chỉ số vòng lặp LOOP)
lea bx,a ; bx là con trỏ offset của a[0]
mov i,0 ; Gán giá trị biến nhớ i=0
L1:
HienString M2 ; Hiện thông báo M2 (‘a[‘)
mov ax,i ; Hiện giá trị i
call HIEN_SO_N
HienString M3 ; Hiện thông báo M3 (‘] =’)
call VAO_SO_N ; Nhận các thành phần a[i]
mov [bx],ax ; Đưa giá trị a[i] vào mảng a do bx trỏ đến
inc i ; Tăng giá trị i lên 1
add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a
loop L1
; Vòng lặp đưa các số của mảng lên màn hình
HienString M4 ; Hiện thông báo M4 (‘Day so vua vao la : ‘)
mov cx,sltp ; cx=số lượng thành phần (chỉ 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 giá trị a[i] lên màn hình
HienString M5 ; 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 ; cx=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)
xor ax,ax ; ax chứa tổng (lúc đầu bằng 0)
;--------------------------------------------------------------------------------------
; L3: |
; add ax,[bx] ; ax=ax+a[i] |
; add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a |
; loop L3 |
;--------------------------------------------------------------------------------------
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 ; Chờ nhận 1 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
Chú ý :
a) Tổng các thành phần âm của mảng
L3:
mov dx,[bx] ; dx = a[i]
and dx,dx ; Dựng cờ dấu (S=1 thì dx chứa số âm, S=0 thì dx chứa số dương)
jns L4 ; Nếu giá trị a[i] dương thì nhảy đến L4
add ax,[bx] ; còn giá trị a[i] âm thì cộng vào tổng nằm ở ax
L4:
add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a
loop L3
b) Tổng các thành phần dương của mảng
L3:
mov dx,[bx] ; dx = a[i]
and dx,dx ; Dựng cờ dấu (S=1 thì dx chứa số âm, S=0 thì dx chứa số dương)
js L4 ; Nếu giá trị a[i] â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
L4:
add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a
loop L3
c) Tổng các thành phần chẵn của mảng
L3:
mov dx,[bx] ; dx = a[i]
shr dx,1 ; Bit thấp nhất vào cờ Carry (C=1-> a[i] là lẻ, C=0 -> a[i] là chẵn)
jc L4 ; Nếu giá trị a[i] là lẻ thì nhảy đến l4
add ax,[bx] ; còn giá trị a[i] là chẵn thì thì cộng vào tổng nằm ở ax
L4:
add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a
d) Tổng các thành phần lẻ của mảng
L3:
mov dx,[bx] ; dx = a[i]
shr dx,1 ; Bit thấp nhất vào cờ Carry (C=1-> a[i] là lẻ, C=0 -> a[i] là chẵn)
jnc L4 ; Nếu giá trị a[i] là chẵn thì nhảy đến nhãn L4
add ax,[bx] ; còn giá trị a[i] là lẻ thì cộng vào tổng nằm ở ax
L4:
add bx,2 ; bx trỏ đến thành phần tiếp theo của mảng a
Bài 5
;---------------------------------------------
; 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) |
;---------------------------------------------
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)?_
INCLUDE lib1.asm
.MODEL small
.STACK 100h
.DATA
M1 db 10,13,'Hay vao so bi chia : $'
M2 db 10,13,'Hay vao so chia : $'
M3 db 10,13,'Thuong la : $ '
dautru db '-$'
daucham db '.$'
M4 db 10,13,'Co tiep tuc (c/k) ? $'
.CODE
PS:
mov ax,@data
mov ds,ax
CLRSCR ; Xóa màn hình
HienString M1 ; Hiện thông báo 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=số bị chia, bx=số chia)
HienString M3 ; Hiện thông báo M3 (‘Thuong la : ‘)
and ax,ax ; Dựng cờ dấu của số bị chia (dấu thương cùng dấu số bị chia)
jns CHIA1 ; Nếu dấu số bị chia là dương thì nhảy đến nhãn CHIA1
HienString dautru ; còn nếu số bị chia là âm thì hiện dấu ‘-‘ lên màn hình (dấu âm)
neg ax ; Đổi dấu số bị chia (để thành số nguyên dương)
CHIA1:
xor dx,dx ; dx = 0
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 ; Dựng cờ của phần dư (Z=1 thì dư=0, còn Z=0 thì dư≠0)
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 dấu thập phân
mov si,10 ; si = 10
CHIA2:
mov ax,dx ; Đưa phần dư vào ax
mul si ; Nhân phần dư cho 10
div bx ; dx:ax chia cho bx
call HIEN_SO_N ; Hiện giá trị của thương lên màn hình
and dx,dx ; Dựng cờ của phần dư (Z=1 thì dư=0, còn Z=0 thì dư≠0)
jz KT ; Phần dư bằng 0 thì nhảy đến kết thúc quá trình chia
loop CHIA2
KT:
HienString M4 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’)
mov ah,1 ; Chờ nhận 1 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 6
;-----------------------------------------------------------------
; Tổng cấp số cộng khi biết n (số lượng thành phần) |
; d (công sai) và u1 (giá trị thành phần đầu tiên) |
;-----------------------------------------------------------------
Khi chương trình chạy yêu cầu có dang :
Hay vao n : 3
Hay vao d : 2
Hay vao u1 : 1
Tong cap so cong la : 9
Co tiep tuc CT (c/k)?_
INCLUDE lib1.asm
.MODEL small
.STACK 100h
.DATA
M1 db 10,13,'Hay vao n : $'
M2 db 10,13,'Hay vao d : $'
M3 db 10,13,'Hay vao u1 : $ '
M4 db 10,13,’ Tong cap so cong la : $’
M5 db 10,13,'Co tiep tuc (c/k) ? $'
.CODE
PS:
mov ax,@data
mov ds,ax
CLRSCR ; Xóa màn hình
HienString M1 ; 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 d : ‘)
call VAO_SO_N ; Nhận giá trị d
mov bx,ax ; bx = d
HienString M3 ; Hiện thông báo M3 (’Hay vao u1 : ‘)
call VAO_SO_N ; Nhận giá trị u1
mov dx,ax ; dx = ax = u1 (ax = tổng = u1; dx =ui và lúc đầu bằng u1)
dec cx ; Giảm cx đi 1 (n-1)
L1:
add dx,bx ; dx = ui
add ax,dx ; ax = tổng
loop L1
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 dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’)
mov ah,1 ; Chờ nhận 1 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 phần) |
; q (công bội) và u1 (giá trị thành phần đầu tiên) |
;-----------------------------------------------------------------
Khi chương trình chạy yêu cầu có dang :
Hay vao n : 3
Hay vao q : 2
Hay vao u1 : 1
Tong cap so nhan la : 7
Co tiep tuc CT (c/k)?_
INCLUDE lib1.asm
.MODEL small
.STACK 100h
.DATA
M1 db 10,13,'Hay vao n : $'
M2 db 10,13,'Hay vao q : $'
M3 db 10,13,'Hay vao u1 : $ '
M4 db 10,13,’ Tong cap so nhan la : $’
M5 db 10,13,'Co tiep tuc (c/k) ? $'
.CODE
PS:
mov ax,@data
mov ds,ax
CLRSCR ; Xóa màn hình
HienString M1 ; 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_SO_N ; Nhận giá trị q
mov bx,ax ; bx = q
HienString M3 ; Hiện thông báo M3 (’Hay vao u1 : ‘)
call VAO_SO_N ; Nhận giá trị u1
mov si,ax ; si = ax = u1 (si = tổng = u1; ax =ui và lúc đầu bằng u1)
dec cx ; Giảm cx đi 1 (n-1)
L1:
mul bx ; ax = ax*bx = ui
add si,ax ; si = tổng
loop L1
HienString M4 ; Hiện thông báo M3 (‘Tong cap so nhan la : ‘)
mov ax,si ; Chuyển tổng từ si đến ax
call HIEN_SO_N ; Hiện tổng cấp số nhân
HienString M5 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’)
mov ah,1 ; Chờ nhận 1 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 8
;---------------------------
; Tính biểu thức |
;---------------------------
Khi chương trình chạy yêu cầu có dang :
Hay vao N : 5
Tong tu 1 den 5 la : 15
Co tiep tuc CT (c/k)?_
INCLUDE lib1.asm
.MODEL small
.STACK 100h
.DATA
M1 db 10,13,'Hay vao N : $'
M2 db 10,13,'Tong tu 1 den $'
M3 db 10,13,' la : $ '
M4 db 10,13,'Co tiep tuc (c/k) ? $'
.CODE
PS:
mov ax,@data
mov ds,ax
CLRSCR ; Xóa màn hình
HienString M1 ; Hiện thông báo M1 (‘Hay vao N : ‘)
call VAO_SO_N ; Nhận giá trị N
mov cx,ax ; cx = N (chỉ số vòng lặp)
HienString M2 ; Hiện thông báo M2 (’Tong tu 1 den ‘)
call HIEN_SO_N ; Hiện giá trị N
HienString M3 ; Hiện thông báo M3 (’ la : ‘)
dec cx ; Giảm cx đi 1 (n-1)
L1:
add ax,cx ; ax = ax+cx
loop L1
call HIEN_SO_N ; Hiện giá trị biểu thức
HienString M4 ; Hiện dòng nhắc M4 (‘Co tiep tuc CT (c/k) ?’)
mov ah,1 ; Chờ nhận 1 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
LIÊN KẾT NGÔN NGỮ BẬC CAO VỚI ASSEMBLY
Bài 1
;--------------------------------------------------------------------------
; 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ận a và n,
Gọi chương trình con tính an 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 an
Cách 1: Hàm Assembly không đối (a và n khai báo biến toàn cục)
Tệp C++:
#include
#include
int a,n;
extern int LT();
void main(void)
{
clrscr();
cout>a;
cout>n;
cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT();
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _a:word, _n:word
.CODE
PUBLIC @LT$qv
@LT$qv PROC
mov bx,_a ; bx = a
mov cx,_n ; cx = n
mov ax,1 ; ax = 1
and cx,cx ; Dựng cờ để xét liệu n = 0
jz L2 ; Nếu n = 0 thì nhảy đến L2
L1:
mul bx ; còn n # 0 thì tiến hành vòng lặp tính an
loop L1
L2:
ret
@LT$qv ENDP
END
Cách 2: Hàm Assembly có 1 đối (a là tham số thực và n vẫn khai báo biến toàn cục)
Tệp C++:
#include
#include
int n;
extern int LT(int i1);
void main(void)
{
int a;
clrscr();
cout>a;
cout>n;
cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT(a);
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _n:word
.CODE
PUBLIC @LT$qi
@LT$qi PROC
push BP ; Cất giá trị BP hiện thời vào stack
mov BP,SP ; BP = SP
mov bx,[BP+6] ; bx = a (lấy giá trị a trong stack đưa vào bx)
mov cx,_n ; cx = n
mov ax,1 ; ax = 1
and cx,cx ; Dựng cờ để xét liệu n = 0
jz L2 ; Nếu n = 0 thì nhảy đến L2
L1:
mul bx ; còn n # 0 thì tiến hành vòng lặp tính an
loop L1
L2:
pop BP ; Hồi phục giá trị của BP
ret
@LT$qi ENDP
END
Cách 3: Hàm Assembly có 2 đối (a và n đều là tham số thực)
Tệp C++:
#include
#include
extern int LT(int i1, int i2);
void main(void)
{
int a,n;
clrscr();
cout>a;
cout>n;
cout<<”\n”<<a<<” luy thua “<<n<<” la : “<<LT(a,n);
getch();
}
Tệp Assembly:
.MODEL large
.CODE
PUBLIC @LT$qii
@LT$qii PROC
push BP
mov BP,SP
mov bx,[BP+6] ; bx = a (lấy giá trị a trong stack đưa vào bx)
mov cx,[BP+8] ; cx = n (lấy giá trị n trong stack đưa vào cx)
mov ax,1 ; ax = 1
and cx,cx ; Dựng cờ để xét liệu n = 0
jz L2 ; Nếu n = 0 thì nhảy đến L2
L1:
mul bx ; còn n # 0 thì tiến hành vòng lặp tính an
loop L1
L2:
pop BP ; Hồi phục giá trị BP
ret
@LT$qii ENDP
END
Bài 2
;----------------------
; n! (n từ 0 đến 7) |
;----------------------
Phân công nhiệm vụ :
Ngôn ngữ C++ :
Nhận n,
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 : Chương trình con tính n!
Cách 1: Hàm Assembly không đối (n khai báo biến toàn cục)
Tệp C++:
#include
#include
int n;
extern int GT();
void main(void)
{
clrscr();
cout>n;
cout<<”\nGiai thua cua ”<<n<<” la : “<<GT();
getch();
}
Tệp Assembly:
.MODEL large
.DATA
EXTRN _n:word
.CODE
PUBLIC @GT$qv
@GT$qv PROC
mov cx,_n ; cx = n
mov ax,1 ; ax = 1
cmp cx,2 ; So sánh n < 0 (tức là n=0 hoặc 1)
jb L2 ; Nếu n < 0 thì nhảy đến L2
L1:
mul cx ; còn n ≥ 0 thì tiến hành vòng lặp tính n!
loop L1
L2:
ret
@GT$qv ENDP
END
Cách 2: Hàm Assembly có 1 đối (n là tham số thực)
Tệp C++:
#include
#include
extern int GT(int i);
void main(void)
{
int n;
clrscr();
cout>n;
cout<<”\nGiai thưa cua ”<<n<<” la : “<<GT(n);
getch();
}
Tệp Assembly:
.MODEL large
.CODE
PUBLIC @GT$qi
@GT$qi PROC
push BP
mov BP,SP
mov cx,[BP+6] ; cx = a (lấy giá trị n trong stack đưa vào cx)
mov ax,1 ; ax = 1
cmp cx,2 ; So sánh n < 0 (tức là n=0 hoặc 1)
jb L2 ; Nếu n < 0 thì nhảy đến L2
L1:
mul cx ; còn n ≥ 0 thì tiến hành vòng lặp tính n!
loop L1
L2:
pop BP ; Hồi phục giá trị BP
ret
@GT$qi ENDP
END
Bài 3
;---------------------------------------
; Trung bình cộng 2 số nguyên |
;---------------------------------------
Phân công nhiệm vụ :
Ngôn ngữ C++ :
Nhận 2 số nguyên,
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)
Tệp C++:
#include
#include
int so1,so2,f