摘要: 代码清单10-12中用到了三种跳转指令,分别是比较结果小时跳转的jle 、大时跳转的jge 、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的cmp指令,比较结果被保存在了标志寄存器中。虽然同C语言源代码的处理流程不完全相同,不过处理结果是相同的。此外,需要注意eax寄存器表示的是 阅读全文
posted @ 2023-02-14 22:55 叮铃铛铛 阅读(30) 评论(0) 推荐(0)
摘要: 接下来,让我们继续解析汇编语言的源代码,看一下for循环及if条件分支等C语言程序的流程控制是如何实现的。代码清单10-8是将局部变量i作为循环计数器 连续进行10次循环的C语言源代码。在for语句中,调用了不做任何处理的MySub函数。这里我们把代码清单10-8转换成汇编语言,然后仅把相当于for 阅读全文
posted @ 2023-02-14 22:51 叮铃铛铛 阅读(22) 评论(0) 推荐(0)
摘要: 在代码清单10-6中定义了10个局部变量。这是为了表示存储局部变量的不仅仅是栈,还是寄存器。为了确保c1~c10所需的领域,寄存器空闲时就使用寄存器,寄存器空间不足就使用栈。 x86 系列 CPU拥有的寄存器中,程序可以操作的有十几个。其中空闲的,最多也只有几个。因而,局部变量数目很多的时候,可分配 阅读全文
posted @ 2023-02-14 22:40 叮铃铛铛 阅读(22) 评论(0) 推荐(0)
摘要: 在C语言中,在函数外部定义的变量称为全局变量,在函数内部定义的变量称为局部变量。全局变量可以参阅源代码的任意部分,而局部变量只能在定义该变量的函数内进行参阅。 阅读全文
posted @ 2023-02-14 22:28 叮铃铛铛 阅读(24) 评论(0) 推荐(0)
摘要: 通过执行AddNum函数的源代码部分,来看一下参数的接收、返回值的返回等机制(代码清单10-5)。 ebp寄存器的值在(1)中入栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。在进入函数处理之前,无法确定ebp寄存器用到了什么地方,但由于函数内部也会用到eb 阅读全文
posted @ 2023-02-14 22:20 叮铃铛铛 阅读(26) 评论(0) 推荐(0)
摘要: 代码清单 10-1 中列出的C语言源代码中,有一个处理是在变量c中存储 AddNum 函数的返回值,不过在汇编语言的源代码中,并没有与此对应的处理。这是因为编译器有最优化功能。最优化功能是编译器在本地代码上费尽功夫实现的,其目的是让编译后的程序运行速度更快、文件更小。在代码清单 10-1 中,由于存 阅读全文
posted @ 2023-02-14 22:11 叮铃铛铛 阅读(18) 评论(0) 推荐(0)
摘要: 程序运行时,会在内存上申请分配一个称为栈的数据空间。栈有“干草堆积如山”的意思。即数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺利进行(图10-3)的。 栈是存储临时数据的区域,它的特点是通过push指令和pop指令进行数据的存储和读出。往栈中存 阅读全文
posted @ 2023-02-14 22:01 叮铃铛铛 阅读(211) 评论(0) 推荐(0)
摘要: 指令中最常使用的是对寄存器和内存进行数据存储的mov指令。 mov指令的两个操作数,分别用来指定数据的存储地和读出源。操作数中可以指定寄存器、常数、标签(附加在地址前),以及用方括号(【】)围起来的这些内容。如果指定了没有用方括号围起来的内容,就表示对该值进行处理;如果指定了用方括号围起来的内容,方 阅读全文
posted @ 2023-02-14 21:45 叮铃铛铛 阅读(262) 评论(0) 推荐(0)
摘要: 在汇编语言中,1行表示对CPU的一个指令。汇编语言指令的语法结构是操作码+操作数(或只有操作码没有操作数的指令)。 能够使用任何形式的操作码,是由CPU的种类决定的。 本地代码加载到内存才能运行。 寄存器是CPU中的存储区域,寄存器具有存储指令和数据的功能,也有运算功能。 阅读全文
posted @ 2023-02-14 21:39 叮铃铛铛 阅读(48) 评论(0) 推荐(0)
摘要: 汇编语言的源代码,是由转换成本地代码的指令(即操作码)和针对汇编器的伪指令构成的。伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)。伪指令本身是无法汇编转换成本地代码的。这里我们把代码清单10-2中用到的伪指令部分摘出,如代码清单10-3所示。 由伪指令 segment和ends围起来的部 阅读全文
posted @ 2023-02-14 15:42 叮铃铛铛 阅读(27) 评论(0) 推荐(0)
摘要: 除了将本地代码进行反汇编这一方法外,通过其他方式也可以获取汇编语言的源代码。 大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。笔者在学生时代的报告中,使用的便是该功能。Borland C++中 阅读全文
posted @ 2023-02-14 15:08 叮铃铛铛 阅读(131) 评论(0) 推荐(0)
摘要: 在加法运算的本地代码中加上add(addition的缩写)、在比较运算的本地代码中加上cmp(compare的缩写)等。这些缩写称为助记符,使用助记符的编程语言称为汇编语言。通过查看汇编语言编写的源代码和查看本地代码的源代码,是同一级别的。用汇编语言编写的源代码,最终也必须要转换成本地代码才能运行。 阅读全文
posted @ 2023-02-14 14:45 叮铃铛铛 阅读(27) 评论(0) 推荐(0)