c语言中mips jal指令,看明白了一段mips汇编

正 文

看明白了一段mips汇编(2006/4/29 15:34)

今天总算看明白了网上一段mips汇编代码,感觉很爽阿,呵呵,只是让大虾见笑了。原文章(包含该代码)在如下网址:http://www.xtrj.org/mips/, 题目是MIPS体系结构剖析,编程与实践(作者:张福新,陈怀临, 2002)

C代码如下:

~/ vi Hello.c

"Hello.c" [New file]

/* Example to illustrate mips register convention

* -Author: BNN

* 11/29/2001

*/

int addFunc(int,int);

int subFunc(int);

void main()

{

int x,y,z;

x= 1;

y=2;

z = addFunc(x,y);

}

int addFunc(int x,int y)

{

int value1 = 5;

int value2;

value2 = subFunc(value1);

return (x+y+value2);

}

int subFunc(int value)

{

return value--;

}

反汇编代码后的代码:

/* main Function */

0000000000000000 :

/*create a stack frame by moving the stack pointer 8

*bytes down and meantime update the sp value

*/

0: 27bdfff8 addiu $sp,$sp,-8/* Save the return address to the current sp position.*/

4: afbf0000 sw $ra,0($sp)

8: 0c000000 jal 0 /* nop is for the delay slot */

c: 00000000 nop

/* Fill the argument a0 with the value 1 */

10: 24040001 li $a0,1

/* Jump the addFunc */

14: 0c00000a jal 28/* NOTE HERE: Why we fill the second argument

*behind the addFunc function call?

* This is all about the "-O1" compilation optimizaiton.

* With mips architecture, the instruciton after jump

* will also be fetched into the pipline and get

* exectuted. Therefore, we can promise that the

* second argument will be filled with the value of

* integer 2.

*/

18: 24050002 li $a1,2

/*Load the return address from the stack pointer

* Note here that the result v0 contains the result of

* addFunc function call

*/

1c: 8fbf0000 lw $ra,0($sp)/* Return */

20: 03e00008 jr $ra/* Restore the stack frame */

24: 27bd0008 addiu $sp,$sp,8

/* addFunc Function */

0000000000000028 :

/* Create a stack frame by allocating 16 bytes or 4

* words size

*/

28: 27bdfff0 addiu $sp,$sp,-16

/* Save the return address into the stack with 8 bytes

* offset. Please note that compiler does not save the

* ra to 0($sp).

*Think of why, in contrast of the previous PowerPC

* EABI convention

*/

2c: afbf0008 sw $ra,8($sp)

/* We save the s1 reg. value into the stack

* because we will use s1 in this function

* Note that the 4,5,6,7($sp) positions will then

* be occupied by this 32 bits size register

*/

30: afb10004 sw $s1,4($sp)

/* Withe same reason, save s0 reg. */

34: afb00000 sw $s0,0($sp)/* Retrieve the argument 0 into s0 reg. */

38: 0080802d move $s0,$a0

/* Retrieve the argument 1 into s1 reg. */

3c: 00a0882d move $s1,$a1

/* Call the subFunc with a0 with 5 */

40: 0c000019 jal 64 /* In the delay slot, we load the 5 into argument a0 reg

*for subFunc call.

*/

44: 24040005 li $a0,5

/* s0 = s0+s1; note that s0 and s1 holds the values of

* x,y, respectively

*/

48: 02118021 addu $s0,$s0,$s1

/* v0 = s0+v0; v0 holds the return results of subFunc

*call; And we let v0 hold the final results

*/

4c: 02021021 addu $v0,$s0,$v0

/*Retrieve the ra value from stack */

50: 8fbf0008 lw $ra,8($sp)

/*!!!!restore the s1 reg. value */

54: 8fb10004 lw $s1,4($sp)

/*!!!! restore the s0 reg. value */

58: 8fb00000 lw $s0,0($sp)

/* Return back to main func */

5c: 03e00008 jr $ra/* Update/restore the stack pointer/frame */

60: 27bd0010 addiu $sp,$sp,16

/* subFunc Function */

0000000000000064 :

/* return back to addFunc function */

64: 03e00008 jr $ra

/* Taking advantage of the mips delay slot, filling the

* result reg v0 by simply assigning the v0 as the value

*of a0. This is a bug from my c source

* codes--"value--". I should write my codes

* like "--value", instead.

68: 0080102d move $v0,$a0

为便于察看,我已经将指令全部高亮为蓝色。如果对MIPS指令不熟,看起来还是比较废劲的哦。我是对着指令解释,并画图,废了九牛二虎之力阿。搞懂后,有种毛塞顿开,总算打开门之感,颇为爽!.^_^偶正致力于往底层驱动发展,此番进步亦算是鼓励了。忘高手或者有心往此方面发展的朋友,多多交流哦。

评 论

12楼 hdguy 发表于 2007/12/11 13:47 回复

不好意思,很久没有看MIPS了,不少都忘记了。

11楼 tjh(游客) 发表于 2007/9/24 11:08 回复

******这是一个Reset.S启动代码文件帮忙分析一下********** LEAF(__reset_vector) .set noreorder MFC0( t0, C0_PRId) lit1, M_PRIdImp | M_PRIdCoID and t0, t1 lit1, PRID_IMP_4Kec | PRID_COMP_MIPS beqt1, t0, is_4Kec nop li t1, 0x1000; 1: addiu t1, -1 bne t1, zero, 1b nop lat0, av_entry jalrt0 /*5280 will auto flush cache after reset */ nop is_4Kec: /* set EJ_TDO to 4mA , for ICE help*/ lwt0,0xb801a150 ; or t0, 0x4; sw t0, 0xb801a150; /* Clear watch registers */ MTC0(zero, C0_WatchLo) MTC0(zero, C0_WatchHi) /* Disable interrupts and KSU field (power up issue) */ MFC0( k0, C0_Status) lik1, ~(M_StatusIE | M_StatusKSU) andk0, k1 MTC0(k0, C0_Status) 1: lik1, KSEG1BASE lak0, _reset_handler_le /* Defined in linker script */ ork0, k1/* Make sure it is uncached */ jrk0 nop /*cy test */ error: 1: b 1b nop .org 0x200 1:b1b/* Stay here */ nop .org 0x280 1:b1b/* Stay here */ nop .org 0x300 1:b1b/* Stay here */ nop .org 0x380 li t1, 0x49; sw t1, 0xb801b200; 1:/* Stay here */ b 1b nop .org 0x400 1:b1b/* Stay here */ nop .org 0x480 mtc0 v0, C0_DESAVE li v0, KSEG0(SYS_EJTAG_RAM_VECTOR_OFS) jrv0 mfc0 v0, C0_DESAVE .org 0x500 /* 0xBFC00500 Vector table for shell functions */ END(__reset_vector)

10楼 warrior(游客) 发表于 2007/4/23 14:03 回复

另外。。。 这段 4: afbf0000 sw $ra,0($sp) 8: 0c000000 jal 0 /* nop is for the delay slot */ c: 00000000 nop 怎么又JAL回前面的0地址了。。。。。。

9楼 warrior(游客) 发表于 2007/4/23 09:42 回复

兄弟~我也想要份MIPS汇编指令的文档,我目前是做底层和BSP开发,前面几个月做的是ARM9的,下一个项目用的是MIPS的,所以想提前准备点知识 EMAIL: [email protected] 多谢了

8楼 hdguy 发表于 2007/1/22 10:12 回复

TO crystal: 1c: 8fbf0000 lw $ra,0($sp) 举这个例子来说,前面的1C就是指令的地址了,8fbf0000应该就是后面的汇编指令的二进制编码,有兴趣的话,你可以仔细核对一下,看是不是

7楼 hdguy 发表于 2007/1/22 10:10 回复

不好意思,那些反汇编后的信息很多我也不知道什么意思。应该是编译器提供的一些关于各种代码段什么的说明,这个可能需要找具体的编译器和汇编器说明了

6楼 crystal(游客) 发表于 2007/1/19 16:02 回复

你好,我将MIPS的二进制文件进行反汇编,发现除了主函数外还有很多其它的信息,这些信息分别都是什么内容。望交流~~~~~~~~~~~~~~~ xinru0199◎sina.com

5楼 Robin(游客) 发表于 2006/11/16 13:42 回复

给我一份mips汇编指令集文档吧,谢谢 pooli*163.com *替换为@ 谢谢~

4楼 hdguy 发表于 2006/8/30 11:07 回复

这些资料都可以到网上找得到的,如有需要你可以留下email

3楼 张贤义(游客) 发表于 2006/8/20 10:18 回复

请问你有MIPS指令的解释文档吗?

我现在看操作系统,学习使用nachos, 源代码中有部分

是MIPS汇编代码,指令看不明白。

联系QQ:20558641

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值