寄存器
|
状态
|
eax
|
用于保存输出值,但是可能在函数返回之前被修改
|
ebx
|
用于指向全局偏移表,必须保留
|
ecx
|
在函数中可用
|
edx
|
在函数中可用
|
ebp
|
C程序使用它作为堆栈基址指针;必须保留
|
esp
|
C程序使用它作为堆栈基址指针;必须保留
|
edi
|
C程序使用它作为堆栈基址指针;必须保留
|
esi
|
C程序使用它作为局部寄存器;必须保留
|
ST(0)
|
保存浮点输出值
|
ST(1)-ST(7)
|
在函数中可用
|
.section .text .type func, @function func: pushl %ebp movl %esp, %ebp subl $12, %esp #为函数局部变量保留堆栈空间,可以保存3个4字节的数据值。在函数中,相对于ebp寄存器引用局部变量。 pushl %edi pushl %esi pushl %ebx # here is function code popl %ebx popl %esi popl %edi movl %ebp, %esp popl %ebp ret该模板可以用于C/C++函数使用的所有汇编语言函数。
# Makefile for linux as CFLAGS= -Wall -g ASFLAGS= -gstabs SRC_BIN=target_bin SRC_C=$(wildcard *.c) SRC_S=$(wildcard *.s) SRC_OBJ=$(SRC_C:.c=.o) SRC_OBJ+=$(SRC_S:.s=.o) all: $(SRC_BIN) $(SRC_BIN): $(SRC_OBJ) $(CC) -o $@ $(SRC_OBJ) clean: $(RM) $(SRC_OBJ) $(SRC_BIN) *~ .PHONY: all clean
# add.s .type add, @function .globl add add: pushl %ebp # 因为该函数不影响ebx,edi、esi寄存器,所以开头和结尾没有包含它们。 movl %esp, %ebp movl 8(%ebp), %eax addl 12(%ebp), %eax movl %ebp, %esp popl %ebp ret
include <stdio.h> int add(int, int); int main(int argc, const char *argv[]) { int ret; ret = add(7, 11); printf("The return value is %d.\n", ret); return 0; }
$ make cc -Wall -g -c -o main.o main.c as -gstabs -o add.o add.s cc -o target_bin main.o add.o $ ./target_bin The return value is 18. $
原文地址:http://blog.csdn.net/shallnet/article/details/45651601