用VC写Assembly代码(4)

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结 HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信 阅读详情

在汇编中使用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();
}

===
输出

lAPress 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更好).

有人愿意说明一下原因吗?谢谢.

【Out-of-Distribution Detection】Evidential Deep Learning in NeurIPS 2018 个人理解 核心思想是将分类器的概率输出视为一个狄利克雷分布(Dirichlet Distribution)并替换,之后引入两个损失分别负责保证预测结果准确性和提升被错误分类的样本的不确定性。 阅读详情

相关推荐

WPS用户看过来:避开格式错乱坑,用WPS Office完美制作红头文件(2024最新版)

本文详细解析了WPS Office与Word在红头文件制作中的核心差异,提供了2024年最新版的零误差实战指南。从字体处理、页面布局到红头制作关键步骤,帮助用户避开格式错乱坑,确保跨设备显示一致。特别针对WPS用户优化,解决字体丢失、版式错位等常见问题。

weixin_26800111的博客 218

函数的堆栈调用

下面通过一个例子来看看函数调用堆栈的过程 #include <stdio.h> int Sum(int lhs,int rhs) { int tmp=lhs+rhs; return tmp; } int main() { int a=10; int b=20; int rt=0; rt=Sum(a,b); return 0; } 将上面代码转到反汇编: ma...

IT_happy_的博客 453

避坑指南:Quectel EC200A-CN在OpenWrt或嵌入式Linux下的RNDIS/ECM网络配置全解析

本文详细解析了Quectel EC200A-CN模块在OpenWrt或嵌入式Linux下的RNDIS/ECM网络配置,包括模式选择、内核配置、动态切换AT指令、网络接口生成与排错、路由与防火墙设置、性能调优及特殊场景应对策略,帮助开发者避免常见配置陷阱,提升网络稳定性和效率。

weixin_42531588的博客 291

老码识途 理解指针和指针强制转换

指针存储了内存地址,同时指针是有类型的,如int* float*,但是指针变量并没有存储这2方面的信息,其大小还是4. 反汇编代码:5: int b; 6: int *a ; 7: short *c; 8: a=&b; 0040B778 lea eax,[ebp-4] 0040B77B mov dwor

fztfztfzt的专栏 857

利用featureCounts实现高效转录本定量:从比对到下游分析

本文详细介绍了利用featureCounts工具进行RNA-seq转录本定量的完整流程。从软件安装、输入文件准备,到核心命令参数解析与批量样本处理,再到将生成的计数矩阵无缝衔接至DESeq2进行差异表达分析,提供了从比对到下游分析的一站式实战指南。文章重点阐述了featureCounts在效率与易用性上的优势,并分享了常见问题排查与性能优化技巧,帮助研究者高效完成转录本定量这一关键步骤。

weixin_29069131的博客 319

OpenPCDet安装及其3D检测算法实现

OpenPCDet及pointpillar复现

weixin_58207716的博客 1万+

函数调用的汇编码分析

这几天学习汇编,分析了一下 c++ 中函数调用(cdecl 和 fastcall 方式)过程的汇编码,记录如下: 程序例子 struct tagTest { int n1; long n2; DWORD n3; }; long funtest1(tagTest p1,int p2,LPCTSTR lpszP3) { // 普通函数...

weixin_30516243的博客 241

【ROS2】机械臂MoveIt2

navigation2 专注于移动机器人的导航与定位,处理大范围空间的底盘运动;MoveIt2 专注于机械臂的操作规划,处理多关节协同的末端执行器运动。在复合机器人(如,移动机械臂)navigation2 负责移动到目标区域,MoveIt2 负责机械臂抓取。官网:https://moveit.picknik.ai/main/index.html。

郭老二 602

内核调试方法 三

目录[-] ·  大海里的鱼有很多,而我们需要的是鱼钩一只 ·  一些前言 ·  作者前言 ·  知识从哪里来 ·  为什么撰写本文档 ·  为什么需要汇编级调试 ·  ***第一部分:基础知识*** ·  总纲:内核世界的陷阱 ·  源码阅读的陷阱 ·  代码调试的陷阱 ·  原理理解的陷阱 ·  建立调试环境 · 

bugouyonggan的专栏 7万+

【YOLO系列】YOLOv8详解:模型结构、损失函数、训练方法及代码实现

YOLOv8是Ultralytics团队2023年推出的高效目标检测框架,在速度与精度平衡、多任务支持和易用性方面实现突破。模型采用改进的CSPDarknet主干网络、C2f模块和SPPF加速结构,结合PAN-FPN特征融合和解耦检测头设计,支持目标检测、实例分割和关键点检测任务。创新性地使用CIoU定位损失、Focal Loss置信度损失和动态样本分配策略,显著提升检测性能。实验表明,YOLOv8较前代模型mAP提升5-10%,在TensorRT加速下可达1000FPS,提供5种尺寸灵活选择,成为实时目标

一碗白开水一 2780

win10锁屏或登录时会自动弹出触摸按键的问题解决办法

本篇文章主要讲解win10锁屏或登录时会自动弹出触摸按键的问题解决方式。日期:2023年5月17日作者:任聪聪。

任聪聪的博客 1万+

C# Assembly

2.根据路径加载程序集 3.获得当前【应用程序域】中的所有程序集 三、Type类型对象 1. 通过类获得对应的Type 2. 通过对象获得Type 3.用assembly对象,通过类的full name类获得type对象 4.获得程序集中定义的所有的public类 5.获得程序集中定义的所有的类 6.通过Assembly创建类 6.1 RefClass 辅助类 6.2 Program......

世界既不黑也不白,而是一道精致的灰。 4509

Android So加载机制分析----基于Android14源码

本文深入分析Android 14系统中SO(共享库)的两种加载机制:System.loadLibrary()和System.load()。前者通过ClassLoader查找标准路径加载,后者直接加载指定路径的SO文件。文档详细追踪了从Java层到动态链接器的完整加载链路,包括ClassLoader路径查找、JNI桥接、ART虚拟机处理以及底层linker的符号解析和重定位过程。同时还分析了Namespace隔离、JNI_OnLoad机制等核心内容,为开发者提供全面的SO加载技术解析和问题排查指南。

保持专注,保持热爱 350

用VC写Assembly代码

各位好,最近我在研究SHELLCODE 的编写,因为需要ASM的基础,所以用VC写一些ASM代码.有兴趣的朋友可以一起讨论.我们都欢迎你. 用VC写Assembly代码(1) 用VC写Assembly代码(2) 用VC写Assembly代码(3)  用VC写Assembly代码(4) 用VC写Assembly代码(5) --字符串 用VC写Assem

小发猫 4101

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

用VC写Assembly代码(1)

VC完全可以支持所有.486指令.我们的方法是使用__asm关键字插入Assembly代码.Assembly可以完成N多C&C++不能完成的任务.这个谁动知道.所以我们到C&C++,再懂一些Assembly,会使我们更强.其实很简单,看看下面代码:#include void main(){ char szbuf[] = "Hello world./n"; __asm {  lea

小发猫 3472

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

用VC写Assembly代码(3)

不知为什么,对这种编程方法越来越大越有兴趣.先写个使用参数的例子(十分简单,适用于任何懂C的人)给各位参考一下吧:#include int asm(int s){ int t=0; __asm {  mov eax, DWORD PTR [ebp+8] ;把s的值传给eax  mov t, eax     ;把eax的值传给t } printf("- %d -", t);//把T显示出来}

小发猫 2456

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

用VC写Assembly代码(2)

虽然没人看,但我决定还是写多篇啦.至于Assembly指令的功能,我会在适当的位置说名,如果不懂汇编的朋友,我们也可以通过没个例子和说名,慢慢也了解汇编.来看看这个:#include void loop(){ char szloop[] ="looping/n"; int i=0; __asm {  start:  lea eax, szloop  cmp i, 10  jz ex

小发猫 3001

用VC写Assembly代码(7)--在Visual C++中使用内联汇编

 在Visual C++中使用内联汇编    一、 优点    使用内联汇编可以在 C/C++ 代码中嵌入汇编语言指令,而且不需要额外的汇编和连接步骤。在 Visual C++ 中,内联汇编是内置的编译器,因此不需要配置诸如 MASM 一类的独立汇编工具。这里,我们就以 Visual Studio .NET 2003 为背景,介绍在 Visual C++ 中使用内联汇的相关知识(如果是早期

小发猫 2519

用VC写Assembly代码(5) --字符串

是有几个朋友也喜欢这种编城方法的,前几天听我一个朋友说:"真正的高手是懂C,而不是C++",想想也是.几乎所有代码最后还是有汇编代码组成的,只是效率的问题,汇编和机器语言11对应,这使汇编可以叫机器做机器能做的所有事.所以学好汇编对任何高级语言的理解很有好处.希望编程爱好者也能学习.没事做, 写了短字符串处理的代码:#include #include int main(int ar

小发猫 2961

vc调用c#写的dll

转自:http://www.codeproject.com/csharp/ManagedCOM.asp   Download source - 5.21 Kb Preface COM Interoperability is the

wangsheng8888的专栏 2035

用VC写Assembly代码(5) --函数调用(三)

没什么好说的啦,看代码就是啦#include void main(){ char *a = (char*)MessageBox; __asm {  push 0  push 0  push 0  push 0  mov ebx, 77d5050bh  call ebx } printf("%0x/n", a);} 顺便转一篇有关SHELLCODE的文章,看起来很简单,但是测试就是不成功

小发猫 1979

用VC写Assembly代码(6)--附录2[windows进程中的内存结构]

在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识。 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据。那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变量的呢?下面就会对此进行深入的讨论。下文中的C语言代码如没有特别声明,默认都使用VC编译的release版。 首先,来了解一下 C 语言的变量是如何在内存分部的。C 语言有全局变量(Global)、本

小发猫 2484

用VC写Assembly代码(5) --函数调用(一)

用C写一个加载msvcrt.dll的方法如下:#include #include void main(){  char *msvcrt = "msvcrt.dll";  HINSTANCE h = LoadLibrary(msvcrt);}反汇编得到的代码是:5:    #include 6:    #include 7:8:    void main()9:    {0040B4B0 55   

小发猫 2680

用VC写Assembly代码(5) --一些宏的使用(二)

目前我知道vc++ inline assembler 有这几个宏 LENGTH、SIZE、TYPE,他们使用简单,下面个个例子:void main(){ int k[10]; int a,b,c; __asm {  mov eax, LENGTH k  mov ebx, SIZE k  mov ecx, TYPE k  mov a, eax  mov b, ebx  mov c, ecx } 

小发猫 2328

An error occurred during the installation of assembly 'Microsoft.VC90.ATL or 'Microsoft.VC80.ATL'

An error occurred during the installation of assembly 'Microsoft.VC90.ATL or 'Microsoft.VC80.ATL' 下载安装即可修复 https://support.microsoft.com/default.aspx?scid=kb;en-us;946414 转载于:https://www.cnblo...

weixin_30820151的博客 1449

An error occurred during the installation of assembly 'Microsoft.VC90.CRT,version = "9.0.21022.8"

问题描述windows安装python2.7的时候出现An error occurred during the installation of assembly ‘Microsoft.VC90.CRT,version = “9.0.30279.1”…………报错信息如图 问题原因vc没有安装问题解决vc可通过去微软光网直接下载安装,也可以用其他工具下载安装例如: 下载完安装完,重新通过pyth

Moolight_shadow的专栏 1万+
上一篇: 用VC写Assembly代码(3)
下一篇: 10 Ways to Make Your Code More Testable
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值