WEB开发网
开发学院软件开发汇编语言 在Visual C++中使用内联汇编 阅读

在Visual C++中使用内联汇编

 2010-01-10 09:37:22 来源:WEB开发网   
核心提示:下面是更多的ASM代码美元符号$用于指定当前位置,如下所用,在Visual C++中使用内联汇编(4),常用于条件跳转:JNE $Content$5 ; 下面这条指令的长度是5个字节JMP farlabel;$Content$5,跳到了这里,我费了好大周折才发现不是CALL MessageBoxA}

下面是更多的ASM代码

美元符号$用于指定当前位置,如下所用,常用于条件跳转:

JNE $Content$5 ; 下面这条指令的长度是5个字节
  JMP farlabel;
  $Content$5,跳到了这里
  。
  。
  。
  farlabel:

七、调用函数

内联汇编调用C/C++函数必须自己清除堆栈,下面是一个调用C/C++函数例子:

#include <stdio.h>
  char szformat[] = "%s %sn";
  char szHello[] = "Hello";
  char szWorld[] = " world";
  void main()
  {
  __asm
  {
  MOV EAX, OFFSET szWorld
  PUSHEAX
  MOV EAX, OFFSET szHello
  PUSHEAX
  MOV EAX, OFFSET szformat
  PUSHEAX
  CALLprintf
  //内联汇编调用C函数必须自己清除堆栈
  //用不使用的EBX寄存器清除堆栈,或ADD ESP, 12
  POP EBX
  POP EBX
  POP EBX
  }
  }

注意:函数参数是从右向左压栈。

不能够访问C++中的类成员函数,但是可以访问extern "C"函数。

如果调用Windows API函数,则不需要自己清除堆栈,因为API的返回指令是RET n,会自动清除堆栈比如下面的例子:

#include <windows.h>
char szAppName[] = "API Test";
void main()
{
char szHello[] = "Hello, world!";
__asm
{
PUSHMB_OKorMB_ICONINformATION
PUSHOFFSET szAppName; 全局变量用OFFSEt
LEA EAX, szHello; 局部变量用LEA
PUSHEAX
PUSH0
CALLDWORD PTR [MessageBoxA] ; 注意这里,我费了好大周折才发现不是CALL MessageBoxA
}
}

一般来说,在Visual C++中使用内联汇编是为了提高速度,因此这些函数调用尽可能用C/C++写。

上一页  1 2 3 4 5  下一页

Tags:Visual 使用 内联

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接