📄 cmn.asm
字号:
data segment
m_v dw 5
n_v dw 2
result dw ?
str_result db 5 dup(30h)
ask db 10,13,'DO Cmn,please input m,n: m=','$'
answer db 10,13,'The result is:','$'
data ends
stack segment
dw 128 dup(0)
tos label word
stack ends
code1 segment
main proc far
assume cs:code1,ds:data,ss:stack
start:
mov ax,stack
mov ss,ax
mov sp,offset tos
push ds
sub ax,ax
push ax
mov ax,data
mov ds,ax
;****MAIN PART****
mov ah,9
mov dx,offset ask
int 21h
mov ah,1
int 21h
sub al,030h
mov ah,0
mov m_v,ax
mov bx,ax
mov ah,2
mov dl,','
int 21h
mov dl,'n'
int 21h
mov dl,'='
int 21h
mov ah,1
int 21h
sub al,030h
mov ah,0
mov n_v,ax
mov cx,ax
mov dx,offset result
push dx
push cx
push bx
call far ptr fact
mov ax,result
mov bx,10
mov si,offset str_result
add si,4
mov byte ptr[si],'$'
dec si
mov cx,4
continue:
mov dx,0 ;一定要先将dx置0, div是把ax作被除数的低位,把dx作被除数的高位
div bx ;不能直接div 10
add dl,030h
mov byte ptr[si],dl
dec si
dec cx
cmp cx,0
jne continue
print:
mov ah,9
mov dx,offset answer
int 21h
mov dx,offset str_result
int 21h
ret
main endp
code1 ends
code segment
frame struc
save_bp dw ?
save_cs_ip dw 2 dup(?)
m dw ?
n dw ?
result_addr dw ?
frame ends
assume cs:code
fact proc far
push bp
mov bp,sp
cmp cx,1
je done
mov si,[bp].result_addr
push si
dec cx
dec bx
push cx
push bx
call fact
mov si,[bp].result_addr
mov ax,word ptr[si] ;此处一定不能用dx,即mov ax,word ptr[dx]
mul [bp].m
div [bp].n
jmp short return
done:mov ax,[bp].m
mov si,[bp].result_addr
return:
mov word ptr[si],ax
pop bp
ret 6 ;注意 ret x 中x以字节为单位
fact endp
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -