首页
社区
课程
招聘
[旧帖] [转帖] 如何在DEV C++里嵌入汇编 0.00雪花
发表于: 2010-9-30 12:25 1961

[旧帖] [转帖] 如何在DEV C++里嵌入汇编 0.00雪花

2010-9-30 12:25
1961
呵呵,这方面的资料很多,但是东是东一鳞西一爪的。这篇也算我自己的一个小总结吧!

在Dev C++里使用内联汇编的格式不同于VC的,这一点需要注意:
VC里采用的是Intel的格式,而Dev C++采用的是AT&A的汇编格式。

如下例:

#include<stdio.h>
int main(){
  printf("Test inline asm\n");
  //在此插入一个int 3中断
  _asm int 3      //此处采用的就是Intel的汇编格式
  return 0;
}

这个可以在VC下编译通过,但用Dev C++则编译出错,原因就在内联的汇编!如果需要转移到Dev C++下,则应将那句汇编更改为:
__asm__("int $3");
完整的如下:

#include<stdio.h>
int main(){
  printf("Test inline asm\n");
  __asm__("int $3");
  return 0;
}

在AT&A里,引用值需要前加"$"标记,而且引用寄存器时也需要加一个前缀"%",如:
mov $789,%eax
另外,不可以直接引用变量,而只能引用全局变量,同时在引用时,需要在其前加一下划线"_",另外就是操作数的方向也与Intel的语法相反,如:
mov $789,%eax    //=============是把789赋值给EAX
其方向是:                       operator1------------------->operator2
而在Intel下则是反过来的:operator1<-------------------operator2

一个完整的示例如下:

#include<stdio.h>

int a;
int main(){
  
  printf("Test inline asm\n");
  __asm("mov $789,%eax");
  __asm("mov %eax,_a");
  printf("A is : %d\n",a);
  return 0;
}

//这里大家也应该注意到了,对于__asm__与__asm标签是不区分的!同样适用!!

当然,如果汇编的语句较多,可以用一个标记来标记,如:

__asm(
  "mov $123,%eax\n\
  mov %eax,_a"
);

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ljx0305/archive/2010/08/23/5831742.aspx

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
干嘛要用Dev C++有什么优势么
2010-9-30 12:44
0
雪    币: 47
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
最主要的是DEV编辑小程序比较方便  还有就是对标准C的支持比较好  其他的也没什么了吧
2010-9-30 20:32
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
太高深了  俺都不懂啊   呵呵
2010-10-6 12:15
0
雪    币: 218
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
很不错,学习了
2017-9-12 21:17
0
游客
登录 | 注册 方可回帖
返回
//