c语言调用汇编实现阶乘,汇编语言实现阶乘

java递归实现阶乘

static int fact(int n) {

if (n == 0) {

return 1;

}

return fact(n - 1) * n;

}

public static void main(String[] args) {

System.out.println(fact(5));

}

汇编实现阶乘

# 开始递归函数调用

addiu $sp, $0, 0x10010080 # 初始化栈地址

# 压栈入参

addiu $s0, $0, 5 # n=5

sw $s0, 0($sp) # n=5 压栈

addiu $sp, $sp, -4 # 栈指针-4

jal FACT # 跳转fact函数(FACT只是标志位,并没有函数) 跳转地址:a1

nop

j END # 跳转END,结束

nop

FACT: # fact函数体

# 压栈返回地址

sw $ra, 0($sp) # 跳转地址压栈:a1 a2 a3 a4 a5 a6

addiu $sp, $sp, -4 # 栈指针-4

#读取入参

lw $s0, 8($sp) # 读取入参 n=5 4 3 2 1 0

#压栈返回值

sw $0, 0($sp) # 返回值压栈(占位)0 0 0 0 0 0

addiu $sp, $sp, -4 # 栈指针-4

#递归base条件

# if (n == 0) { return 1}

bne $s0, $0, RECURSION # 如果5!=0则跳转RECURSION 4!=0 3!=0 2!=0 1!=0

nop

# 读取下返回地址

lw $t1, 8($sp) # a6

# 出栈:返回值,返回地址

addiu $sp, $sp, 8 # 站指针+8

# 压栈返回值

addiu $s0, $zero, 1 # return 1

sw $s0, 0($sp) # 栈 a6->1

addiu $sp, $sp, -4 # 栈指针-4

jr $t1 # 跳转:a6

nop

RECURSION : # recursion

# return fact(n-1) * n

#压栈参数

addiu $s1, $s0, -1 # 参数4 (n-1) 3 2 1 0

sw $s1, 0($sp) # 参数压栈:4 3 2 1 0

addiu $sp, $sp, -4 # 栈指针-4

jal FACT # 跳转fact函数 跳转地址:a2 a3 a4 a5 a6

nop

# 现在的栈是什么样子的? 参数 | 返回地址 | 返回值 | 子函数的参数 | 子函数的返回值 | 当前SP

# 当前参数

lw $s0, 20($sp) # 加载参数:1 2 3 4 5

# 子函数返回值

lw $s1, 4($sp) # 返回值 1 1 2 6 24

# 返回地址

lw $t1, 16($sp) # 返回地址:a5 a4 a3 a2

mult $s1, $s0 # 1X1 1x2 2x3 6x4 24x5

mflo $s2 # 1x1=1 1x2=2 2x3=6 6x4=24 24x5=120

# 出栈:

addiu $sp, $sp, 16 # 栈指针+16

# 返回值压栈

sw $s2, 0($sp) # 栈a5->1 a4->2 a3->6 a2->24 a1->120

addiu $sp, $sp, -4 # 栈指针-4

jr $t1 # 跳转:a5 a4 a3 a2 a1

nop

END:

使用MARS模拟器编写

汇编是完全面向过程的语言,是CPU指令的可读形式

汇编从上往下顺序执行,高级语言中的流程控制语句如if,while等在汇编中就是各种跳转

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值