在8086汇编中查找数字的阶乘

时间:2017-03-09 13:03:03

标签: assembly x86-16

以下是我的代码:

data segment
num db 05h
fact db 02h
data ends
code segment
assume cs:code, ds:data
start: mov dx,data
mov ds,dx
mov al,01h
mov bl,num
inc bl
call prc
prc proc
imul fact
inc fact
cmp fact,bl
jz endproc
call prc
endproc: mov fact,al
ret
prc endp
mov ah,4ch
int 21h
code ends
end start

我知道该程序不正确。以下是我对此的问题(我正在尝试学习程序):

  1. 要结束某个程序,我们是直接写endp 还是 [name] endp(多本书给我多个答案)
  2. 当它达到4 * 6的乘法时,imul会在AL中返回18?怎么样?
  3. ret语句之后,程序跳转到上一个语句,而不是程序结束后的语句
  4. 非常感谢帮助!

2 个答案:

答案 0 :(得分:1)

  

要结束一个程序,我们直接写endp或[name] endp

尝试看看......我相信要么会奏效。包括名称可以提高清晰度。

  

当它达到4 * 6的乘法时,imul在al中返回18?如何?

因为4次6是24(十进制),十六进制是18。

  

在ret语句之后,程序跳转到前一个语句,而不是程序结束后的语句

ret导致执行从调用过程的点继续。由于您的过程调用自身 - 即它 recurses - ret指令可能导致它返回到ret指令之前的行,因为相应的call是之前的行那。可能,(第二个)call指令实际上应该是jmp指令,以返回到过程的开始而不递归。然后,ret将始终返回原始call之后的指令。

然而,在那时,你有另一个问题。由于您在调用点之后立即执行了该过程,因此ret指令将导致执行在过程开始时恢复;当它再次达到ret时,您的程序可能会崩溃。在程序结束后编写的代码应该移动,以便它在调用点之后(即它应该在调用点和程序之间)。

答案 1 :(得分:0)

;以下程序用于在8086汇编中查找数字的阶乘 包括emu8086.inc

org 100h


 call input
 call check
 call factorial
ret

input proc
  lea dx,msg
  mov ah,9  
  int 21h  ;to print the string

  mov ah,1
  int 21h    ;input from the user one character
  sub al,30h ;to change the ascii into our decimal number
  mov ch,al

  mov ah,1
  int 21h
  sub al,30h
  mov cl,al
  print '!'
 ret
  input endp

check proc
    cmp ch,0  ;ch-0
    je fact ;if they are equal jump to the factorial

    lea dx,msg2
    mov ah,9
    int 21h
     hlt
ret 
 check endp

fact: 
factorial proc
    lea dx,msg1
    mov ah,9
    int 21h

    mov ax,1 ;initialize
label:
    cmp cx,0
    je quit
    mul cx ;ax=ax*cx
    loop label
quit: 
  call print_num_uns ;to print the number found in ax register
ends   
factorial endp

mov ah,4ch    ;to return control to the operating system
int 21h 

msg db 'Enter the number: $'
msg1 db 10,13,'The factorial is: $'                                  
msg2 db 10,13,'The factorial is out of bound,sorry we can not help you $'
define_print_num_uns

end