要想深入理解C/C++,必须得了解汇编语言,由于现代编译器的强大,帮我们自动完成汇编编译过程,如果各位同学要做逆向工程,汇编是必不可少的.
各位同学如是技术大牛请绕过,只是最近学汇编,发现的一些觉得有意思的事情.
下面从DOS汇编的角色来研究下面问题,因为win32汇编基本上能操作的底层太少了,得归于强大的编译器,包括栈区空间分配一些过程在编译时就已经固化了(vc栈空间大小默认为1M).我个人认为win32汇编开发基本上还是以调系统API为主
一. 程序为什么要以main函数为入口
汇编直接从第一行代码开始执行,cs:0,如何有数据段,start标志起始位置,不存在main函数
VC下,真正的入口在mainCRTStartup或WinMainCRTStartup,在mainCRTStartup会调用main函数,如果没有main函数,则会提示编译错误. 也就说main函数入口是由编译器指定的
二. 字符串为什么要以'\0'结尾
// 字符串拷贝: void strcpy(char *dest,char *source) { while((*dest++=*source++)!='\0'); }
上面是字符串拷贝函数的实现,字符串以'\0'作为结束判断标志,那么汇编呢
data segment db 'unix',0 db 0,0,0,0,0,0 data ends ; 将源字符串拷贝到下一行内存空间中 strcpy: mov cl,[si] mov ch,0 jcxz ok ;判断字符是否为0,为0则退出 mov byte ptr [si+5],cl ; 拷贝数据 inc si inc di jmp short strcpy ok: ret
三. 传值传参
void swap(int a,int b) { int temp = a; a = b; b = temp; } int main() { int a = 3; int b = 4; swap(a,b); printf("%d %d\n",a,b); return 0; }
大家一眼就能看出打印3 4,a和b的值都没有改变,都知道解释只是传值传参,所以不改变. 深入的同学会说,传值传参是复制a,b的实参值到形参,操作形参结果不影响实参. 再深入的同学说因为形参跟实参是两块不同的内存地址,必然不影响裸骑结果.大家都说的有道理,那我们来看看相应的汇编:
cdecl调用方式,由调用者管理堆栈平衡
push b ;此时a,b数据被复制到栈区内,操作的是栈地址(dword ptr [ebp-4]),与原实参没任何关系 push a call swap add esp,4 ; 调整栈平衡
stdcall调用方式,用于win32 API
push b push a call swap ; 由函数自动维护栈平衡
看上面汇编代码发现,全是在操作stack地址块,与a,b没关系.Java不支持指针操作,那如何交换a,b的值呢?java参数传递支持传值传递,引用传递两种方式.基本类型传值传递,对象通过引用传递. Java中对于这个问题没有好的解决方式,有一种通过数组(int[])取巧的方式
相关推荐
初学者必看的几个汇编程序,简单易懂,很有帮助。
几个非常有趣的汇编写的程序,都过千行,很棒的,充分体会汇编的强大
我觉得很酷有趣有趣的智能合约汇编。___下载.zip
汇编语言设计masm
1. 本人用了五年时间,开发了一个叫做ZASM的汇编语言开发工具,其目的就是要使汇编语言的学习变得轻松、有趣、深入。它包含一个汇编语言I/O功能库,功能完善,用法简单,学生很快就能用它写出真正的程序。另外ZASM还...
有趣的墙面处理[汇编].pdf
有趣的动物作文(汇编15篇).docx
没有C代码,只能看到令人眼花缭乱的汇编指令和机器码。我曾对它们望而生畏,敬而远之。尤其在这个黑客、破解、病毒、木马横行的时代,如果作为安全软件的开发者,同样不能期盼病毒的作者提供可以阅读的高级语言代码...
一个用汇编编写的贪吃蛇小游戏,操作简单,打开就能玩。
《x86汇编语言:从实模式到保护模式》是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、读取...
有趣的活动五年级作文汇编六篇.docx
, 《x86汇编语言:从实模式到保护模式》是一本有趣的书,它没有把篇幅花在计算一些枯燥的数学题上。相反,它教你如何直接控制硬件,在不借助于BIOS、DOS、Windows、Linux或者任何其他软件支持的情况下来显示字符、...