序言
接着上一个继续学习,本次学习的是《C语言实例解析精粹》实例2运行多个源文件,也就是把打印hello world分成多个源文件进行编译,主程序不用那么多行的代码。
环境是VS2017,内存地址和虚拟机中的内存地址不太一样,不过不影响理解汇编代码的学习。
C代码
程序分成三个源代码文件,分别是helloworld.c, print.h和No.2.c(文件名称自定义)。
print.h文件中引入了标准输入输出函数库stdio.h,声明了打印hello world的函数:
#include <stdio.h>
void printfHello(void);
helloworld.c文件中写了一个打印hello world的函数:
#include "print.h"
void printHello()
{
printf("hello world!\n");
}
No.2.c文件就是我的主函数所在的文件,就引入了自定义的头文件,并调用打印函数:
#include "print.h"
int main(void)
{
printHello();
return 0;
}
C代码很简单,下面看DEBUG的汇编代码
汇编代码
我是在printHello()处下的断点
--- e:\projects\c\project1\project1\no.2.c -------------------------------------
#include "print.h"
int main(void)
{
012E1910 push ebp
012E1911 mov ebp,esp
012E1913 sub esp,0C0h
012E1919 push ebx
012E191A push esi
012E191B push edi
012E191C lea edi,[ebp-0C0h]
012E1922 mov ecx,30h
012E1927 mov eax,0CCCCCCCCh
012E192C rep stos dword ptr es:[edi]
012E192E mov ecx,offset _0126C36E_no@2@c (012EC007h)
012E1933 call @__CheckForDebuggerJustMyCode@4 (012E1217h)
printHello();
012E1938 call _printHello (012E11EAh)
return 0;
012E193D xor eax,eax
}
012E193F pop edi
012E1940 pop esi
012E1941 pop ebx
012E1942 add esp,0C0h
012E1948 cmp ebp,esp
012E194A call __RTC_CheckEsp (012E1221h) # 检查堆栈是否平衡
012E194F mov esp,ebp
012E1951 pop ebp
012E1952 ret
使用F11快捷键,可以看一下012E1938 call _printHello (012E11EAh)
是怎么执行的
012E11EA E9 21 06 00 00 jmp printHello (012E1810h)
可以看到函数地址为 printHello (012E1810h)
,再次跟进去
--- e:\projects\c\project1\project1\helloworld.c -------------------------------
1: #include "print.h"
2:
3: void printHello()
4: {
012E1810 55 push ebp
012E1811 8B EC mov ebp,esp
012E1813 81 EC C0 00 00 00 sub esp,0C0h
012E1819 53 push ebx
012E181A 56 push esi
012E181B 57 push edi
012E181C 8D BD 40 FF FF FF lea edi,[ebp-0C0h]
012E1822 B9 30 00 00 00 mov ecx,30h
012E1827 B8 CC CC CC CC mov eax,0CCCCCCCCh
012E182C F3 AB rep stos dword ptr es:[edi]
012E182E B9 03 C0 2E 01 mov ecx,offset _D819B0EE_helloworld@c (012EC003h)
012E1833 E8 DF F9 FF FF call @__CheckForDebuggerJustMyCode@4 (012E1217h)
5: printf("hello world!\n");
012E1838 68 30 7B 2E 01 push offset string "hello world!\n" (012E7B30h)
012E183D E8 09 F8 FF FF call _printf (012E104Bh)
012E1842 83 C4 04 add esp,4 # 平衡堆栈
6: }
012E1845 5F pop edi
012E1846 5E pop esi
012E1847 5B pop ebx
012E1848 81 C4 C0 00 00 00 add esp,0C0h
012E184E 3B EC cmp ebp,esp
012E1850 E8 CC F9 FF FF call __RTC_CheckEsp (012E1221h)
012E1855 8B E5 mov esp,ebp
012E1857 5D pop ebp
012E1858 C3 ret
查看一下这个地方offset string "hello world!\n" (012E7B30h)
的内存,是否存着“hello world”
这些简单的汇编指令,我就不详细写出来了。
结语
每天进步一点点,总比没有进步好,加油!
如有错误,敬请指出,感谢指正! —2019-05-14 22:59:36
最新评论
这个软件有bug的,客户端windows有些键不能用如逗号、句号
没有收到邮件通知
我的评论通知貌似坏掉了,定位一下问题
测试一下重新部署后的邮件功能
居然看到自己公司的MIB库,诚惶诚恐
那可能是RobotFramework-ride的版本问题。我装的1.7.4.2,有这个限制。我有空再尝试下旧版本吧,感谢回复。
你好!我在python2.7中安装RobotFramework-ride的时候提示wxPython的版本最高是2.18.12,用pip下载的wxPython版本是4.10,而且我在那个路径下没有找到2
真的太好了,太感谢了,在bilibili和CSDN上都找遍了,终于在你这里找到了