zoukankan      html  css  js  c++  java
  • 汇编语言学习系列 函数实现

    以下代码示范交换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
    ", a);
        printf("%d
    ", b);
        return 0;
    }
    • 汇编代码如下:
    .section .data
            a: .int 534
            b: .int 1057
            format: .asciz "%d
    "
    .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

  • 相关阅读:
    preprocess
    数组
    共用体
    动态内存管理函数
    C链表
    文件的定位与出错检查
    字符串读写函数
    C文件操作
    位运算
    爱好-超级IP:超级IP
  • 原文地址:https://www.cnblogs.com/csu_xajy/p/4271113.html
Copyright © 2011-2022 走看看