以下是我的代码:
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
我知道该程序不正确。以下是我对此的问题(我正在尝试学习程序):
endp
还是 [name] endp
(多本书给我多个答案)imul
会在AL
中返回18?怎么样?ret
语句之后,程序跳转到上一个语句,而不是程序结束后的语句非常感谢帮助!
答案 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