汇编语言9内嵌汇编

C语言 内嵌汇编

void main()
{
char ps[20] = "aaaaaaaaaa\n";
char *p1 =ps;

//用汇编语句改写下面2句代码
ps[3]=‘b‘;
printf(ps);
}

//等价的写法1:
void main()
{
char ps[20] = "aaaaaaaaaa\n";
char *p1 =ps;
HMODULE hmod =GetModuleHandle("msvcr90.DLL");
if (hmod)
{
PVOID pfun =GetProcAddress(hmod, "printf");
if (pfun)
{
__asm
{
//&p1才是存放指针p1的内存, [p1]表示取去p1的值。
//有点绕吧, 这里 p1是指针的实体, 不是要理解为它的值
mov eax, dword ptr [p1]
//[eax] 表示取eax 存放的内容. 现在eax为p1的值
mov byte ptr [eax+3],0x62
push dword ptr[p1]
call pfun
mov eax ,1
add esp,4
}
}
FreeLibrary(hmod);
}
}

//等价的写法2:
void main()
{
char ps[20] = "aaaaaaaaaa\n";
char *p1 =ps;
HMODULE hmod =GetModuleHandle("msvcr90.DLL");
if (hmod)
{
PVOID pfun =GetProcAddress(hmod, "printf");
if (pfun)
{
__asm
{
//[ps+3]表示取第3个元素,虽然C语言里面数组名就是指针,汇编里面不能直接写为等价
mov byte ptr [ps+3],0x62
push dword ptr[p1]
call pfun
mov eax ,1
pop ebx //相当于esp+=4
}
}
FreeLibrary(hmod);
}
}

//写法3:
void main()
{
char ps[20] = "aaaaaaaaaa\n";
char *p1 =ps;
HMODULE hmod =GetModuleHandle("msvcr90.DLL");
if (hmod)
{
PVOID pfun =GetProcAddress(hmod, "printf");
if (pfun)
{
__asm
{
mov ecx,10
mov ebx, 0
//把ps全部替换成bbbbbbbb
s: mov byte ptr [ps+ebx],0x62
inc ebx
loop s
push dword ptr[p1]
call pfun
mov eax ,1
pop ebx
}
}
FreeLibrary(hmod);
}
}

时间: 2024-08-08 17:36:35

汇编语言9内嵌汇编的相关文章

汇编语言10内嵌汇编

1.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值.它们经常共同用语实现子程序的设计. 2.ret指令用栈中的数据,修改IP的内容,从而实现近转移. 3.retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. 4.CPU执行ret指令时,相当于进行: pop IP 执行retf指令时,相当于进行: pop IP pop CS 5.CPU执行call指令时,进行两步操作: (1)将当前的IP或CS和IP压入栈中: (2)转移 6.call指令不能实现短转移

AT&T汇编语言与GCC内嵌汇编,Linux内核数据结构之链表

最近在看<Linux内核源代码情景分析>,作者毛德操.书中刚开始介绍了AT&T汇编语言与GCC内嵌汇编,以及Linux内核数据结构之链表.可惜书中介绍的不够全面.因为推荐大家阅读下面两篇文章.很不错. AT&T汇编语言与GCC内嵌汇编:http://grid.hust.edu.cn/zyshao/Teaching_Material/OSEngineering/Chapter2.pdf. Linux内核数据结构之链表:http://www.cnblogs.com/Anker/p/

内嵌汇编

static inline void arch_spin_lock(arch_spinlock_t *lock) {     unsigned long tmp; __asm__ __volatile__( "1: ldrex   %0, [%1]\n"           "   teq %0, #0\n"                         WFE("ne") "   strexeq %0, %2, [%1]\n&quo

内存四域,变量声明和定义,寄存器,c内嵌汇编,auto,堆栈,常量,静态变量

 1.内存四大区域 2.在程序中,变量的声明可以有多份,定义只能有一份 3.寄存器在cpu里面,没有地址 4.c语言内嵌汇编语言 5.auto变量 自动分配内存,自动释放内存. 6.栈的大小由编译器决定 修改栈的方式,右击项目à属性à配置属性à链接器à系统à堆栈保留大小 7.卡死cpu,卡死内存的程序 8.在堆上申请空间后赋值后,不可以释放内容.要通过free方法进行释放对空间. 9.常量字符串在代码区.代码区是智能读的. 10.常量本质 10.静态变量,全局变量的差别 A全局变量可以跨文件

VC内嵌汇编基础知识

http://www.cppblog.com/xingkongyun/archive/2008/12/21/70003.html 为了加速游戏,一提起汇编语言,大家也许会感到很神秘.其实如果你学起来就会发现,它并非想象中那样难.特别是内嵌汇编,由于它和C++紧密结合, 使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来比较容易.使用内嵌汇编,特别是使用MMX指令,可以大大提高各种游戏中常见特效的速 度,对于编出一个漂亮的游戏非常重要.学好汇编语言还有一个特别有趣的用处:可以观察和看懂

C语言内嵌汇编

1.C语言内嵌汇编 1.1内嵌汇编的语法 1.2内嵌汇编示例 #include <stdio.h> int main() { int result = 0; int input = 1; int a = 1; int b = 2; asm volatile ( "movl %1, %0\n" // 通过占位符指定交互的变量 : "=r"(result) // 输出变量,与汇编交互 : "r"(input) // 输出变量,与汇编交互

64位驱动里实现内嵌汇编

有些操作非要使用汇编语言不可,比如想获取 CPU 的信息,必须用 CPUID 指令,但是64 位的微软编译器都不再允许内嵌汇编了,这可怎么办呢?标准方法是使用 ASM 文件和 C文件进行混合编译,但这种方法很麻烦,特别是只要嵌入一小段汇编的情况下.所以我的解决方法是,用软件把汇编转换成机器码,然后直接执行机器码.64 位汇编转换机器码的工具可以用我的 X64ASM_TO_X64BIN(http://www.vbasm.com/thread-5651-1-1.html).先来说说如何使用 X64A

GCC在C语言中内嵌汇编 asm __volatile__ 【转】

转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作. 1.简单的内嵌汇编 例: __asm__ __volatile__("hlt"); "__asm__"表示后面的

arm 内嵌汇编

内嵌汇编代码,每一个input和output operand,由被方括号[]中的符号名,限制字符串,圆括号中的C表达式构成 // example static inline void __down_write(struct rw_semaphore *sem) {     long oldcount; #ifndef    CONFIG_SMP     oldcount = sem->count;     sem->count += RWSEM_ACTIVE_WRITE_BIAS; #else