`
tcspecial
  • 浏览: 911359 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

有趣的汇编

阅读更多

要想深入理解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[])取巧的方式

 

分享到:
评论

相关推荐

    汇编几个小程序 很有趣

    "汇编几个小程序 很有趣"这个主题表明我们将探讨一些简单的汇编语言程序,这些程序对初学者来说既易于理解,又具有趣味性。 文件"wordtest.ASM"是一个汇编源代码文件,其中包含了用汇编语言编写的指令。汇编语言的...

    汇编音乐演奏程序

    总的来说,“汇编音乐演奏程序”结合了计算机科学的底层原理和艺术创作,为学习汇编语言的初学者提供了一个既实用又有趣的实践平台。通过这样的项目,开发者不仅可以提升编程技能,还能享受创作音乐的乐趣。

    汇编语言编写的贪吃蛇

    总结来说,"汇编语言编写的贪吃蛇"不仅是一款有趣的游戏,也是一个学习汇编语言的实践案例。它涉及到内存管理、输入输出、图形绘制、中断处理等多个方面的汇编知识,对于想要深入了解计算机底层运作原理的程序员来说...

    王爽汇编教材讲义(最好的汇编教材)

    作者王爽以其深入浅出的讲解方式,将汇编语言这一看似复杂的主题变得易懂且有趣。本书旨在帮助读者理解和掌握汇编语言的基本概念、语法以及实际应用,为后续的系统编程、逆向工程等领域打下坚实的基础。 汇编语言是...

    汇编语言 推箱子 游戏 附汇编源码

    本文将通过一个有趣的实例——推箱子游戏,来探讨汇编语言的应用,并附带游戏的源代码供学习参考。 推箱子游戏是一款策略型益智游戏,玩家需要控制角色推动箱子到指定位置,通常在有限的空间内完成任务。这个游戏的...

    汇编语言设计masm

    《汇编语言设计MASM》是一门深入探讨计算机底层编程技术的学科,主要围绕着Microsoft Macro Assembler(MASM)这一流行的汇编语言编译器展开。MASM是微软公司开发的一款高级汇编器,广泛应用于Windows平台上的系统级...

    很强的汇编源程序 初学者使用

    在IT领域,汇编语言是一种低级编程语言,它与机器指令一一对应,直接控制计算机硬件。对于初学者来说,了解并掌握汇编语言能够帮助理解计算机底层运作机制,提升编程技能。以下将针对提供的文件名,分别介绍相关汇编...

    汇编贪吃蛇masm版本

    《汇编语言实现的贪吃蛇游戏——深入解析MASM版本》 在计算机科学的世界里,汇编语言作为底层编程语言,尽管复杂却拥有极...通过这个项目,我们可以看到即使是简单的游戏,也可以通过精心设计的汇编代码变得生动有趣。

    汇编写的超级玛丽(附带源码)

    本篇将深入探讨一个使用汇编语言编写的超级玛丽游戏,让我们一同揭秘这款简陋但有趣的经典游戏在底层代码中的实现细节。 首先,我们看到的文件名"**Mario.Asm**"是汇编源代码文件,它是整个游戏的核心部分。汇编...

    汇编语言与机器码转换实例

    ### 汇编语言与机器码转换实例解析 #### 一、引言 在计算机科学领域,理解机器码与汇编语言之间的关系至关重要。...此外,结合批处理脚本的应用也为我们提供了一个实用且有趣的视角来探索底层编程的世界。

    王爽《汇编语言-清华出版社》& 动画演示

    《汇编语言》是王爽教授的经典著作,它深入浅出地介绍了...对于想要深入计算机科学领域的学习者来说,汇编语言是必修的一门基础课程,而王爽教授的书籍和配套动画演示无疑为学习者提供了一条高效且有趣的学习路径。

    Windows环境下32位汇编语言程序设计电子版

    总之,Windows环境下32位汇编语言程序设计是一门深奥且有趣的学问,它涵盖了计算机体系结构、操作系统原理、编程技巧等多个领域。通过深入学习和实践,不仅可以提升对计算机系统的理解,也能为优化性能和解决复杂...

    汇编语言程序设计音乐演奏

    在这个“汇编语言程序设计音乐演奏”的项目中,我们看到一个有趣的示例,它将编程与音乐相结合,创建了一个简单的音乐播放器。这个程序通过响应用户的键盘输入来播放不同的乐曲,提供了互动式的音乐体验。 首先,...

    汇编代码俄罗斯方块 &n多汇编课程设计源码

    总的来说,"汇编代码俄罗斯方块"是一个极好的实践项目,它不仅提供了有趣的编程挑战,还让学习者能够深入理解计算机硬件和操作系统的基本工作原理。这个项目适合作为汇编课程设计的参考,对于提高学生的编程能力和...

    超全汇编语言试卷及课件

    【汇编语言试卷及课件】是一份包含丰富学习资源的资料包,旨在帮助学习者深入理解和掌握汇编语言这一编程基础。...无论是自学还是教学,这些材料都能提供全方位的支持,让学习汇编语言的过程更加高效和有趣。

    汇编小创意源码

    【汇编小创意源码】是一个集合,展示了在汇编语言中实现各种有趣的小程序或算法的源代码。汇编语言是一种低级编程语言,它直接对应于机器指令,每一条汇编指令通常对应一个特定的CPU操作。通过学习和理解这些小创意...

    汇编实现吃豆子小程序.zip

    本项目名为“汇编实现吃豆子小程序”,它巧妙地将经典游戏“吃豆子”的逻辑与汇编语言结合,为学习者提供了一个生动有趣的实践平台。 首先,我们要明确汇编语言的核心概念。汇编语言是一种低级编程语言,每一个语句...

    我觉得很酷有趣有趣的智能合约汇编。___下载.zip

    我觉得很酷有趣有趣的智能合约汇编。___下载.zip

    汇编语言电子琴

    《汇编语言电子琴》项目是一个独特而有趣的实践案例,它展示了如何利用底层编程语言——汇编语言,来实现音乐创作的功能。在这个项目中,汇编语言被用来控制硬件,模拟21键的电子琴,这包括哆啦咪发索拉西等基本音符...

    王爽汇编语言程序设计

    王爽教授以其独特的教学风格,将复杂的汇编知识讲解得生动有趣,使读者在轻松的环境中掌握汇编编程。 在《汇编语言》课件2.0中,包含了丰富的教学资源,如章节讲解、例题解析、实践项目等,旨在帮助读者巩固理论...

Global site tag (gtag.js) - Google Analytics