一、递归调用
首先完成X86的递归设计,先完成一个简单的例子N!
先使用AX作为返回值的方式完成递归函数的设计,即F(N) = N ? F(N - 1) X N : 1
可以完成以下代码
CALCULATE PROC
PUSH BP
MOV BP,SP
PUSH DX
PUSH BX
MOV BX,[BP + 4]
CMP BX,0
JNZ CAL_1
MOV AX,1
JMP SHORT CAL_2
CAL_1:
PUSH BX
DEC BX
PUSH AX
PUSH BX
CALL CALCULATE
POP AX
POP BX
MUL BX
CAL_2:
MOV [BP + 6],AX
POP BX
POP DX
POP BP
RET 2
CALCULATE ENDP
可以通过上面的代码观察堆栈结构,当N == 3时,此时栈顶为0710:01DB
那么开始考虑,不讲返回值放入寄存器中,而使用堆栈传递返回值应如何构造。
可以将返回值的地址作为参数传递也可以仿照参数的写法,设计如下堆栈结构,段内调用如下
BP |
IP |
参数 |
RETURN VALUE |
针对于这样的栈结构,可以将上面的函数改写,并添加相关的函数,形成以下代码:
;利用递归求N!
STACK SEGMENT PARA STACK
STACK_AREA DW 100H DUP(0)
STACK_BTM EQU $ - STACK_AREA
STACK ENDS
DATA SEGMENT PARA
N DW 5
DATA ENDS
CODE SEGMENT PARA
ASSUME CS:CODE,DS:DATA,SS:STACK
DISP_NUM MACRO ;宏定义,输出十进制ASCII码
PUSH DX
MOV AH,2
MOV DL,AL
ADD DL,30H
INT 21H
POP DX
DISP_NUM ENDM
DIVIDE MACRO WNUM1,WNUM2
MOV AX,WNUM1
MOV BX,