unix系统使用汇编语言进行求和

main:
    //保存调用者栈基地址,并为main()函数分配新栈空间
    pushl %ebp	//保存调用者(这里是操作系统)的栈基地址,%ebp栈底
    movl %esp, %ebp	//将调用者的栈基地址指向其栈顶,%esp栈顶
    subl $32, %esp      //将当前栈顶减去32个字节,为main()函数分配32个字节栈空间
    
    movl $5, 20(%esp)	//将把5存入当前栈顶往上移动20字节位置
    movl %3, 24(%esp)	//将把5存入当前栈顶往上移动24字节位置

    movl 24(%esp), %eax	//将24(%esp)处的内存值传送到eax寄存器中
    movl %eax, 4(%esp)	//将eax寄存器中的值传送到了4(%esp)处
    movl 20(%esp), %eax	//将20(%esp)处的内存值传送到eax寄存器中
    movl %eax, (%esp)	//将eax寄存器中的值传送到了(%esp)处,即栈顶

    call add	//调用add函数
    movl %eax, 28(%esp)	//将eax寄存器的值传送到28(%esp)处
    
    movl $0, %eax	//将0传送到寄存器eax里
    leave
    ret


add:
	pushl %ebp	//保存调用者(这里是main函数)的栈基地址,%ebp栈底
    movl %esp, %ebp	//将调用者的栈基地址指向其栈顶,%esp栈顶
    subl $16,   %esp	//将当前栈顶(位置已经发生了变化,指针指向了为main新增的8个字节的方法栈顶)减去16个字节,为add()函数分配16个字节栈空间
    movl 12(%ebp), %eax		//将当前栈底往高低址方向偏移12个字节处(即main函数存放的4(%esp))的数据取出,并传送给eax寄存器
    movl 8(%ebp), %edx		//将当前栈底往高低址方向偏移8个字节处(即main函数存放的(%esp))的数据取出,并传送给eax寄存器
    addl %edx, %eax			//将edx寄存器的数据与eax寄存器的数据相加,并将结果存入eax寄存器里
    movl %eax, -4(%ebp)		//将eax寄存器的数据放入当前栈底往低地址4个字节处
    movl -4(%ebp), %eax		//将当前栈底往低地址4个字节处数据放入eax寄存器
    leave
    ret

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三月泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值