将下面这段代码转化成MIPS汇编指令void skb_insert(struct sk_buff *old, struct sk_buff *newsk, struct sk_buff_head *list); static inline void __skb_insert(struct sk_buff *newsk, struct sk_buff *prev, struct sk_buff *next, struct sk_buff_head *list) { newsk->next = next; newsk->prev = prev; next->prev = prev->next = newsk; list->qlen++; }
时间: 2024-01-11 07:03:15 浏览: 74
mips汇编指令学习
5星 · 资源好评率100%
以下是将该段代码转化成MIPS汇编指令的过程:
```
skb_insert:
addi $sp, $sp, -16 # 为保存寄存器分配16字节的栈空间
sw $ra, 12($sp) # 保存返回地址
sw $s0, 8($sp) # 保存$s0寄存器
sw $s1, 4($sp) # 保存$s1寄存器
move $s0, $a0 # 将old保存到$s0
move $s1, $a1 # 将newsk保存到$s1
lw $t0, 12($a2) # 将list->next保存到$t0
lw $t1, 8($s1) # 将newsk->prev保存到$t1
lw $t2, 4($s1) # 将newsk->next保存到$t2
sw $a2, 0($sp) # 保存list指针到栈空间
jal __skb_insert # 调用__skb_insert函数
lw $ra, 12($sp) # 恢复返回地址
lw $s0, 8($sp) # 恢复$s0寄存器
lw $s1, 4($sp) # 恢复$s1寄存器
addi $sp, $sp, 16 # 释放栈空间
jr $ra # 返回
__skb_insert:
addi $sp, $sp, -16 # 为保存寄存器分配16字节的栈空间
sw $ra, 12($sp) # 保存返回地址
sw $s0, 8($sp) # 保存$s0寄存器
sw $s1, 4($sp) # 保存$s1寄存器
sw $s2, 0($sp) # 保存$s2寄存器
move $s0, $a0 # 将newsk保存到$s0
move $s1, $a1 # 将prev保存到$s1
move $s2, $a2 # 将next保存到$s2
sw $zero, 0($s0) # newsk->next = NULL
sw $s1, 4($s0) # newsk->prev = prev
sw $s2, 0($s0) # newsk->next = next
sw $s0, 4($s1) # prev->next = newsk
sw $s0, 0($s2) # next->prev = newsk
lw $t0, 0($sp) # 将list指针从栈空间中恢复到$t0
lw $t1, ($t0) # 将list->qlen保存到$t1
addi $t1, $t1, 1 # list->qlen++
sw $t1, ($t0) # 将list->qlen保存回list
lw $ra, 12($sp) # 恢复返回地址
lw $s0, 8($sp) # 恢复$s0寄存器
lw $s1, 4($sp) # 恢复$s1寄存器
lw $s2, 0($sp) # 恢复$s2寄存器
addi $sp, $sp, 16 # 释放栈空间
jr $ra # 返回
```
其中,`skb_insert`函数将`old`、`newsk`和`list`分别保存到`s0`、`s1`和`s2`寄存器中,然后将`list`指针保存到栈空间中,并调用`__skb_insert`函数。`__skb_insert`函数将`s0`、`s1`和`s2`分别保存到`newsk`、`prev`和`next`寄存器中,然后按照`__skb_insert`函数中的C代码逐行转化为汇编指令。最后再从栈空间中恢复`list`指针,并将`list->qlen`加1,最后释放栈空间并返回。
阅读全文