汇编语言学习系列 函数实现
原创
©著作权归作者所有:来自51CTO博客作者每天在编程的原创作品,请联系作者获取转载授权,否则将追究法律责任
以下代码示范交换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 -oswap
./swap