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

以下代码示范交换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

时间: 2025-01-08 12:46:57

汇编语言学习系列 函数实现的相关文章

汇编语言学习系列 冒泡排序实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp; } int main() { int a[] = {3, 0, 5, 1, 4, 6, 2, 9, 8, 7}; int i ,j; for(i = 0; i < 10; i++) { for(j = i + 1; j < 10;j++) { if

汇编语言学习系列 递归实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> int refact(int n){ if(n == 1) return 1; else return n * refact(n - 1); } int main(){ int a = 4; printf("%d\n", refact(a)); return 0; } 无论对于递归实现还是循环实现,汇编都是将转换为跳转语句实现.可以把上面的代码转换为 refa

汇编语言学习系列 for循环实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> int fact_for(int n) { int i; int result = 1; for(i = 2; i <= n; i++) result *= i; return result; } int main(){ printf("%d\n", fact_for(3)); return 0; } 代码for.s .section .data n:

汇编语言学习系列 打印数组实现

假如汇编语言要实现如下C语言的功能,编译环境Ubuntu14.04(32位). #include<stdio.h> int main(){ int a[] = {3, 0, 5, 1, 4, 6, 2, 9, 8, 7}; int i; for(i = 0; i< 10; i++) printf("%d\n", a[i]); return 0; } 代码 .section .data array: .int 3, 0, 5, 1, 4, 6, 2, 9, 8, 7 l

contiki-main.c 中的process系列函数学习笔记 &lt;contiki学习笔记之六&gt;

说明:本文依然依赖于 contiki/platform/native/contiki-main.c 文件. ------------------------------------------------------------------------------------------------------------------------------------- 根据上一个笔记里面添加的printf()语句的打印信息提示,hello world 打印是在执行了 1 autostart_

Python学习系列(四)(列表及其函数)

Python学习系列(四)(列表及其函数) Python学习系列(一)(基础入门) Python学习系列(二)(基础知识) Python学习系列(三)(字符串) 一.基本概念 1,列表是什么? 一种序列型数据类型,一有序数据集合用逗号间隔用方括号括起来. 2,几种访问形式 1)索引访问,语法结构:list_name[index].注意,列表的索引值从0开始.例如: 1 >>> li=[1,2,3,4,5] 2 >>> print li[2],li[0] 3 3 1 删除

pandas.DataFrame学习系列2——函数方法(1)

DataFrame类具有很多方法,下面做用法的介绍和举例. pandas.DataFrame学习系列2--函数方法(1) 1.abs(),返回DataFrame每个数值的绝对值,前提是所有元素均为数值型 1 import pandas as pd 2 import numpy as np 3 4 df=pd.read_excel('南京银行.xlsx',index_col='Date') 5 df1=df[:5] 6 df1.iat[0,1]=-df1.iat[0,1] 7 df1 8 Open

Oracle学习系列4

Oracle学习系列4 ************************************************************************************ 数据库更新操作: 分类: 查询操作:select 更新操作:insert ,update , delete 为了保存原始的emp表的信息,在进行增删改之前备份词表: create table emp_bak as select * from emp ; //将表emp结构和数据完整的复制出来 添加数据:

Oracle学习系列3

Oracle学习系列3 ************************************************************************************ 多表查询: 1,SQL1999语法对多表查询的支持 2,分组统计及统计函数的使用 3,子查询,并结合多表查询,分组统计做复杂查询 4,数据库的更新操作 5,事务处理和数据库死锁 ****************************************************************