用VC写Assembly代码(4)
在汇编中使用printf没什么意义,这里只说明一写问题,printf 再 __asm中的使用有点复杂.先看看下面代码:
void main()
{
int t = 10;
char *szformat = "t = %d/n";
printf(szformat, t);
}
===
输出
t = 10
Press any key to continue
调试得到的汇编代码:
19: void main()
20: {
0040B770 push ebp
0040B771 mov ebp,esp
0040B773 sub esp,48h
0040B776 push ebx
0040B777 push esi
0040B778 push edi
0040B779 lea edi,[ebp-48h]
0040B77C mov ecx,12h
0040B781 mov eax,0CCCCCCCCh
0040B786 rep stos dword ptr [edi]
21: int t = 10;
0040B788 mov dword ptr [ebp-4],0Ah
22: char *szformat = "t = %d/n";
0040B78F mov dword ptr [ebp-8],offset string "%d/n" (0041ff6c)
23: printf(szformat, t);
0040B796 mov eax,dword ptr [ebp-4]
0040B799 push eax
0040B79A mov ecx,dword ptr [ebp-8]
0040B79D push ecx
0040B79E call printf (0040b6f0)
0040B7A3 add esp,8
24: }
如果我们用感觉上的方法写个__asm 代码,会写成这样(我一开始是写成这样的):
#include <stdio.h>
void asm()
{
int t = 10;
char *szformat = "t = %d/n";
__asm
{
push t
lea eax, szformat
push eax
call printf
add esp, 8
}
}
void main()
{
asm();
}
===
输出
lAPress any key to continue
哦,不!怎么和我们要的完全不一样呢?
怎么办,先看看他的汇编代码:
3: void asm()
4: {
0040B770 push ebp
0040B771 mov ebp,esp
0040B773 sub esp,48h
0040B776 push ebx
0040B777 push esi
0040B778 push edi
0040B779 lea edi,[ebp-48h]
0040B77C mov ecx,12h
0040B781 mov eax,0CCCCCCCCh
0040B786 rep stos dword ptr [edi]
5: int t = 10;
0040B788 mov dword ptr [ebp-4],0Ah
6: char *szformat = "t = %d/n";
0040B78F mov dword ptr [ebp-8],offset string "%d/n" (0041ff6c)
7: __asm
8: {
9: push t
0040B796 push dword ptr [ebp-4]
10: lea eax, szformat
0040B799 lea eax,[ebp-8]
11: push eax
0040B79F push eax
12: call printf
0040B7A0 call printf (0040b6f0)
13: add esp, 8
0040B7A5 add esp,8
14: }
15: }
代码区别很明显,很快我得出一下代码:
#include <stdio.h>
void asm()
{
int t = 10;
char *szformat = "t = %d/n";
__asm
{
mov eax, t
push eax
mov ecx, dword ptr [ebp-8]
push ecx
call printf
add esp, 8
}
}
void main()
{
asm();
}
===
输出
t = 10
Press any key to continue
哦!不说了,有什么不清楚,上BAIDU找找吧(虽然GOOGLE更好).
有人愿意说明一下原因吗?谢谢.
用VC写Assembly代码(4)相关推荐
- 用VC写Assembly代码
各位好,最近我在研究SHELLCODE 的编写,因为需要ASM的基础,所以用VC写一些ASM代码.有兴趣的朋友可以一起讨论.我们都欢迎你. 用VC写Assembly代码(1) 用VC写Assemb ...
- 用VC写Assembly代码(1)
VC完全可以支持所有.486指令.我们的方法是使用__asm关键字插入Assembly代码. Assembly可以完成N多C&C++不能完成的任务.这个谁动知道.所以我们到C&C++, ...
- 用VC写Assembly代码(5) --函数调用(三)
没什么好说的啦,看代码就是啦 #include <windows.h> void main() { char *a = (char*)MessageBox; __asm { pu ...
- 用VC写Assembly代码(6)--附录2[windows进程中的内存结构]
在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识. 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变 ...
- 用VC写Assembly代码(6)--附录1[堆和栈的区别]
堆和栈的区别 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数 ...
- 用VC写Assembly代码(2)
虽然没人看,但我决定还是写多篇啦. 至于Assembly指令的功能,我会在适当的位置说名,如果不懂汇编的朋友,我们也可以通过没个例子和说名,慢慢也了解汇编. 来看看这个: #include <s ...
- 用VC写Assembly代码(7)--在Visual C++中使用内联汇编
在Visual C++中使用内联汇编 一. 优点 使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤.在 Visual C++ 中,内联汇编是内置的编译器,因此不需 ...
- 用VC写Assembly代码(5) --一些宏的使用(二)
目前我知道vc++ inline assembler 有这几个宏 LENGTH.SIZE.TYPE,他们使用简单,下面个个例子: void main() { int k[10]; int a,b, ...
- 用VC写Assembly代码(5) --函数调用(一)
用C写一个加载msvcrt.dll的方法如下: #include <windows.h> #include <stdio.h> void main() { char *ms ...
- 用VC写Assembly代码(5) --字符串
是有几个朋友也喜欢这种编城方法的,前几天听我一个朋友说:"真正的高手是懂C,而不是C++",想想也是. 几乎所有代码最后还是有汇编代码组成的,只是效率的问题,汇编和机器语言11对应 ...
最新文章
- ubuntu安装环境软件全文档
- 追MM与设计模式的有趣见解
- AWS 推出长期支持的 OpenJDK 免费分发版本 —— Amazon Corretto
- Unity子线程编程无法报错
- 触发器和存储过程的使用
- 创建 VSTO 工作簿的windows安装包
- 天然气流量计选型指南
- 《生死疲劳》读书有感
- “带花树开花”算法来解非二分图的最大匹配
- 同一网段分化vlan问题
- python键盘键值表_Python怎么记录键盘鼠标敲击次数|Python统计鼠标点击次数 - PS下...
- 每日算法-数字转换为十六进制
- 【蓝桥杯单片机进阶强化-06】超声波测距的基本原理与实现
- Magic Mouse鼠标滚动速度调整
- 关于duilib CComboUI控件下拉框 字体显示 与xml 设置不相符的问题
- 【智能制造】工业中的知识和智慧
- U盘文件夹全变为.exe格式或U盘文件全部消失(U盘AutoRun病毒解决方法)
- 中国首个电子商务百强榜名单-2010-09
- IDEA写API文档的两种方法
- LaTeX使用入门_Win10_TeXstudio
热门文章
- Elasticsearch索引的数据存储路径是如何确定的
- 2021中国实体零售数字化专题报告——便利店篇
- 2020年中国职业教育行业白皮书
- 工业互联网解决方案创新应用报告(2020)
- 2020年中国在线少儿英语培训市场研究报告
- python链接mysql系统结构设计_第11章:使用Python打造MySQL专家系统
- 朱兴杰(1986-),男,泰康保险集团股份有限公司数据信息中心应用创新高级工程师...
- 作者:张金芳(1970-),男,中国科学院软件研究所副研究员
- 使用 Warshall(沃舍尔)算法求解关系的传递闭包
- win10系统同时安装python2和python3