tui làm theo hướng dẫn trong cu ố n sách: Các bài tập lập trình bằng ngôn ngữ assembly"" của tác gi ả đặng thành phu assembly yêu c ầu của bài toán là th ế này: xây dự ng ng tệp vd.asm có nhi ệm vụ +truy ền vào 1 s ố tự nhiên n + gọi hàm Factorial trong file vd2.asm ( hàm Factorial là hàm tính giai th ừ a của 1 số ) tệp vd2.asm có nhiệm vụ: viết chương trình con tính n! nhưng khi chạy em không in ra đượ c kế t quả như mong muốn: VD như bài ở dưới đây em cho n =4 mà giai th ừ a nó tính ra l ại =0
tệp vd.asm ASM Code: .model small .stack 100h .data public n
n dw ? extrn fv: fv: word
m1 m2 m3 m4
db 'hay cho vao so n:$' db 10 10, ,13 13, ,'giia thua cua $' db 'la: $' db 0ah 0ah, ,0dh 0dh, ,'co tiep tuc khong$'
.code extrn Factorial: proc proc Factorial:
CHuongTrinhCHinh : CHuongTrinhCHinh: mov ax ax, ,@data ds, ,ax mov ds mov n,3 call Factorial mov ax ax, ,fv call HIENSOINT ah, ,4ch mov ah int 21h HIENSOINT PROC ;Vao: AX chua noi dung ;cat giu cac thanh ghi
PUSH PUSH PUSH PUSH OR JNL
AX BX CX DX AX,AX AX, END_IF1
;AX<0 ;Khong phai so am
;Dung
PUSH MOV
AX ;Cat so can dua ra AL, AL , '-' ;Hien thi dau tru
AH, 2 INT 21H AX POP NEG AX ; Chuyen so can in ra so duong END_IF1: XOR CX, CX ;Xoa CX de dem cac chu so thap phan MOV BX, 10 MOV
REPEAT2: DX, DX XOR ;XOA DX DIV BX ;CHIA AX CHO 10 DX PUSH ;CAT SO DU INC CX ;TANG CX AX, AX OR ;THUONG=0? JNE REPEAT2 ;HIEN THI KET QUA
AH, 2
MOV
PRINTF: DX DL, 30H 21H PRINTF
POP OR INT LOOP
; doi so ra ki tu ; lap cho toi khi CX = 0
;KHOI PHUC CAC THANH GHI
DX CX BX AX
POP POP POP POP RET
ENDP HIENSOINT end CHuongTrinhCHinh
tệp vd2.asm
.model small .stack 100h .data extrn n: word public fv
fv dw ? Fac dw ? .code public Factorial
Factorial: mov fv,1 mov fac,2 mov cx,n mov cx,1 jbe L2
dec cx
L1: mov ax,fv mul fac mov fv,ax inc fac loop l1
L2: ret end Factorial