汇编语言学习系列 函数实现

以下代码示范交换a和b两个整数的函数,编译环境Ubuntu14.04(32位)

假如要实现以下C代码

复制代码
#include <stdio.h>
void swap(int *xp, int *yp)
{
    int x = *xp;
    int y = *yp;
    
    *xp = y;
    *yp = x;
}
int main()
{
    int a = 534, b = 1057;
    swap(&a, &b);
    printf("%d\n", a);
    printf("%d\n", b);
    return 0;
}
复制代码
  • 汇编代码如下:
复制代码
.section .data
        a: .int 534
        b: .int 1057
        format: .asciz "%d\n"
.section .text
.global _start
_start:
        pushl %ebp
        movl %esp, %ebp
        subl $24, %esp  #给栈分配内存24字节保存局部变量

        movl $a, %eax
        movl %eax, 4(%esp)

        movl $b, %eax
        movl %eax, (%esp)
                
        call swap  #调用swap函数
        
        pushl a  #打印a
        pushl $format
        call printf
        
        pushl b  #打印b
        pushl $format
        call printf
        
        movl $0, (%esp)
        call exit
            
swap:
        pushl %ebp  #保存调用前栈帧地址
        movl %esp, %ebp  
        pushl %ebx  #根据习惯,保存寄存器ebx
        
        movl 8(%ebp), %edx    #get xp
        movl 12(%ebp), %ecx    #get yp
        
        movl (%edx), %ebx    #get x
        movl (%ecx), %eax    #get y
        
        movl %eax, (%edx)
        movl %ebx, (%ecx)
        
        popl %ebx
        popl %ebp
        
        ret
复制代码
  • 编译

 as swap.s -o swap.o

  • 链接

ld -lc -I /lib/ld-linux.so.2 swap.o -o swap

  • 执行

 ./swap


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值