C语言的代码

int main()
{char myString[30];for(int i = 0;i < 30;i++){myString[i] = '#';}return 0;
}

反汇编代码 (32位寄存器 VC++ 6.0反汇编代码)


0040B76E   mov         dword ptr [ebp-24h],0 //将 0 赋值给  ( ebp寄存器的内存地址-24H  ) 内存地址 所指向的 值
0040B775   jmp         main+30h (0040b780) //直接跳转到 0040b780的地址处
0040B777   mov         eax,dword ptr [ebp-24h]   //将 (ebp寄存器内存地址-24H)的内存地址  赋值给 eax的寄存器
0040B77A   add         eax,1                       // eax = eax + 1
0040B77D   mov         dword ptr [ebp-24h],eax   //将eax的内存地址 赋值给 (ebp寄存器-24H)指向的内存地址
0040B780   cmp         dword ptr [ebp-24h],1Eh     //1EH = 30(十进制)   判断 ebp寄存器-24H 所指向的内存地址的值 与 1EH(30)作比较
0040B784   jge         main+40h (0040b790)  //上面一句  如果大于等于 就跳转到 0040b790的内存地址
0040B786   mov         ecx,dword ptr [ebp-24h] // (ebp寄存器-24H)指向的内存地址 赋值给ecx寄存器
0040B789   mov         byte ptr [ebp+ecx-20h],23h // 23H 在ASCLL码表中 指 # , 含义为 将# 以单字节的形式 赋值给 ([ebp+ecx-20h)的内存地址
0040B78E   jmp         main+27h (0040b777) // 直接跳转到 0040b777 指向的内存地址

附图: (还不懂的话 我们接着来往下面)

让我们一句一句的来(代码按照执行逻辑分析)
1.mov dword ptr [ebp-24h],0
寄存器中 ESP寄存区指栈首 EBP寄存器指栈尾 将0以双字类型的形式添加到ebp-24H的内存地址

问题1:为什么是24H呢?

答:24H = 36(十进制),C代码中 char myString[30]; 数组的大小是30, 因为是32位寄存器,四字节,所以是32, 代码中有for循环需要计数, 多了一个计数器存值的内存(我也是看了汇编内存才知道的…)

2.jmp main+30h (0040b780)
直接跳转到 0040b780的内存地址,没有什么好说的. 符合for循环的执行逻辑
3. cmp dword ptr [ebp-24h],1Eh
//1EH = 30(十进制) 判断 ebp寄存器-24H 所指向的内存地址的值(19FF1C) 与 1EH(30)作比较
也就是拿 第一句 ebx的值 与 30比较 // C语言代码 i < 30
4. jge main+40h (0040b790)
参考上一句 如果ebx>=30则跳转到0040b790的内存地址 也是跳出循环
5.mov ecx,dword ptr [ebp-24h]
个人理解: ecx寄存器一般是计数寄存器,将 ebp寄存器-24H 所指向的内存地址的值(19FF1C) 0 赋值给 ecx寄存器,如图

6.mov byte ptr [ebp+ecx-20h],23h
23H 在ASCLL码表中 指 # , 含义为 将# 以单字节的形式 赋值给 ([ebp+ecx-20h)的内存地址,如图

7. jmp main+27h (0040b777)
直接跳转到 0040b777 指向的内存地址 循环判断 执行
8.mov eax,dword ptr [ebp-24h]
9.add eax,1 // eax = eax + 1

将 (ebp寄存器内存地址-24H)的内存地址 赋值给 eax的寄存器,然后值在 +1 也就是计数器在+1.默认值是0


10. mov dword ptr [ebp-24h],eax
将eax的值 赋值到了 [ebp-24h]指向的内存地址的值(19FF1C)

这时执行第三步 进行判断,然后重复执行直到退出循环

总结:
byte ptr [ebp+ecx-20h] //字节类型 00
word ptr [ebp-24h] /字类型 16位寄存器 0000
dword ptr [ebp-24h] //双字类型 32为寄存器 00000000

疑问 字节类型为什么是两个0?

答案 1byte=8bit
1 int = 4byte
字节类型 = 8byte 也就是2int 也就是 00
字类型 = 16byte 也就是4int’ 也就是 0000
双字类型 = 32byte 也就是8int 也就是 00000000
指令的参考:https://blog.csdn.net/qq_35349982/article/details/98872417

C代码+汇编 C的for汇编学习分析相关推荐

  1. C代码+汇编 C的 函数汇编学习分析 rep stos dword ptr [edi]

    如分析有误,请在评论区中,指出 谢谢合作 主要是分析C的函数调用在汇编中的执行流程 本章主要是说一下函数调用时堆栈的变化,重点理解部分 C代码 #include"stdafx.h" ...

  2. ARM_NEON_CNN编程 SIMD单指令多数据流 intrinsics指令 内联汇编 CNN卷积网络优化 深度学习优化

    ARM_NEON_CNN编程 SIMD单指令多数据流 intrinsics指令 内联汇编 CNN卷积网络优化 深度学习优化 博文末尾支持二维码赞赏哦 _ 本文github 神经网络arm neon加速 ...

  3. c语言将两个16位变为一个32位,16位汇编第六讲汇编指令详解第第三讲(示例代码)...

    16位汇编第六讲汇编指令详解第第三讲 1.十进制调整指令 1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之: 以前的时 ...

  4. ARM官方汇编与ARM GNU汇编中的伪操作

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 参考博客 (1)嵌入式Linux ARM汇编 (2)GNU ARM 汇编基础 - wanli1024 - 博客园 (3)GNU ARM 汇编简介 ...

  5. ARM汇编与ARM GNU汇编 区别

    一.想学汇编,at&t汇编与ARM汇编的区别? 问:想学汇编语言,因为现在用的是linux系统(ubuntu 11.04),so 有一本<汇编语言程序设计>马朝晖译,可惜淘宝.当当 ...

  6. 8086汇编工作环境_ARM汇编进阶

    接触嵌入式以来,汇编来来回回学了好几遍,感觉还是有几个地方不清楚,所以在这里做一下总结,基本的非常简单的指令就不多余介绍了,主要分享一些个人觉得虽然微不足道,但是对于理解ARM汇编有帮助的一些知识 在 ...

  7. wow_32_64 汇编调试器/注入器/汇编指令书写神器 V1.7

    工具为方便自己书写汇编代码而出的一款由文本汇编转换机器指令的工具 工具由x64dbg开源引擎解析,由易语言编译,工具无联网和恶意行为,不能理解的务下 如果你喜欢书写汇编却还在为动态调试器上面改写汇编而 ...

  8. gnu嵌入汇编,内嵌汇编详细的介绍

    GCC 提供了内嵌汇编的功能,可以在 C 代码中直接内嵌汇编语言语句,大大方便了程序设计.简单的内嵌汇编很容易理解,例: __asm__ __volatile__("hlt"); ...

  9. linux 编译汇编,linux下的汇编教程

    linux下的汇编教程 第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初 ...

  10. 献给汇编初学者-函数调用堆栈变化分析

    献给汇编初学者-函数调用堆栈变化分析 标 题: 献给汇编初学者-函数调用堆栈变化分析 作 者: 堕落天才 时 间: 2007-01-19,19:20 链 接: http://bbs.pediy.com ...

最新文章

  1. redis消息队列写入mysql_redis怎么实现将消息队列持久化到数据库中?
  2. Ant在MyEclipse中的配置总结
  3. Spring Boot错误处理机制以及定制自己的错误页面
  4. 神经网络如何处理测试阶段出现的新特征?面向开放环境特征外推的图学习解决方案...
  5. 深入解释yield和Generators(生成器)
  6. Linux下安装ElasticSearch-head插件
  7. 没有计算机基础可以学python-Python的学习,都需要具备哪些计算机基础知识?
  8. wps 插件_【追加功能】OFFICE插件管理工具重整后再上路,更好用易用。
  9. WF的性能特征(一)
  10. php源码 学校版 cms,S-CMS学校建站系统PHP源码(含小程序) v5.0 bulid20201126
  11. word怎么删除参考文献的横线_2016版Word 中参考文献上面的横线是怎么去掉的啊,求助求助?...
  12. [宋史学习] 取蜀将帅不利
  13. mui.ajax执行的次数,MUI 中使用 ajax下拉刷新时,数据怎么才能做到累加呢,谢谢...
  14. KBEngine warring项目源码阅读(一) 项目简介和注册
  15. 长安链ChainMaker的多链隔离设计
  16. php smart str,致命错误:ext/standard/php_smart_str.h:没有那个文件或目录
  17. css点击字变颜色_使用CSS颜色关键字
  18. 基于JAVA动漫网站和特效处理系统(Springboot框架+AI人工智能) 开题报告
  19. 华为快应用IDE:代码智能提示及自动补全
  20. Serv-U的反弹攻击及其利用时间:2006-12-20 11:09来源:中国网管联盟 作者:网管整理 点击:899次...

热门文章

  1. Java黑皮书课后题第9章:*9.5(使用GregorianCalendar类)Java API中有一个位于包java.util中的类GregorianCalendar
  2. Java黑皮书课后题第6章:*6.21(电话按键盘)国际标准的字母/数字匹配图如编程练习题4.15所示。编写一个测试程序,提示用户输入字符串形式的电话号码。程序将字母(大写或小写)翻译成数字
  3. Java黑皮书课后题第4章:*4.8(给出ASCII码对应的字符)编写程序,得到一个ASCII码的输入(0~27之间的一个整数),然后显示该字符
  4. Java黑皮书课后题第3章:*3.20(科学:风寒温度)编写一个程序,提示用户输入一个温度值和一个风速值。如果输入值合法,那么显示风寒温度,否则显示温度或风速是不合法数据
  5. php提交飞信,php发送飞信消息
  6. 第一道java编程题
  7. 三款免费实用的文件夹同步/备份软件推荐 (SyncToy/FreeFileSync/Compare Advance)
  8. 1.0Nvm环境配置
  9. android Listview scrollto 问题
  10. 十八个超经典故事 绝对不会后悔