在window下用gnu进行汇编编程,现在系统一般是用win7系统,中断已经完全不能用了。在windows用汇编指令输出一行字符串在控制台应用程序,比登天还难。想来想去只得想到printf这个c标准函数。在进行编程时要用这个函数知道需要引用stdio.h这个头文件,可是这个文件的实现在win7系统中对应那个系统呢?找了半天找不到,无意中用gdb调试一个c程序,发现printf的实现在win7中就是在一个dll中实现,这文件就是msvcrt.dll。看gnu怎样调用汇编:
#这是一个汇编程序,演示怎样调用c函数 .section .data LC0: .ascii "hell world\0" .section .text .globl _start .def _start; .scl 2; .type 32; .endef .def _printf;.scl 2; .type 32; .endef _start: pushl %ebp movl %esp,%ebp andl $-16,%esp subl $32, %esp pushl $LC0 call _printf movl $1,%eax leave ret |
#代表注解开始,与c的//类似
.section .data 定义一个数据区,全局变量可以存这儿
LC0:.ascii "hello world\0" 定义一个全局全量字符串,LC0代表标号,只要不是汇编的关键字,以字母与数字组合而成,因c的字符串以\0结尾。
.section .text定义表示代码区(请大家复习下c的程序内存分配)
.globl _start .globl指示符,代表码区首先要执行的函数
.def 对函数进行声明
_start:根当于一个函数开始
pushl %ebp压栈
andl $-16 ,%esp保证栈指针的地址为16的整数
subl $32,%esp 开辟32字节空间,表示栈低与栈指针之间空间量,记住pop与push指令不是访问栈的唯一方式。
as –o hello.o hello.c
ld –o hello.exe hello.o msvcrt.dll
这行的意思就是把msvcrt.dll的printf进行静态连接,生成hello.exe文件
4、关键是传给c函数的参数一定要正确,c函数一般是从右至左的方式的压栈,在汇编调用c函数时要注意。
评论