计算机系统学习今天学习了过程的控制,过程是软件中的一种抽象,可以在程序中的某个地方调用某个过程来实现某种功能。 栈帧的结构栈帧在过程中必不可少,如果我们要想搞清楚过程的实现,就必须先知道栈帧的结构是如何构成的。栈帧其实可以认为是程序栈的一段,而程序栈又是存储器的一段,因此栈帧说到底还是存储器的一段。这幅图可以表示栈帧的结构,它由一系列栈帧构成,这些栈帧每一个都对应一个过程,而且每一个帧指针+4的位置都存储着函数的返回地址,每一个帧指针指向的存储器位置当中都备份着调用者的帧指针。 过程的实现总的来说,过程实现当中,参数传递以及局部变量内存的分配和释放都是通过栈帧来实现的,大部分情况下,我们...
计算机系统学习条件码寄存器书中列出了四种常用的寄存器,它们的名字与作用分别如下所述。CF:进位标志寄存器,它记录无符号操作的溢出,当溢出时会被设为1。ZF:零标志寄存器,当计算结果为0时将会被设为1。SF:符号标志寄存器,当计算结果为负数时会被设为1。OF:溢出标志寄存器,当计算结果导致了补码溢出时,会被设为1。从上面寄存器的简单说明可以看出,ZF和SF可以判断结果的符号,而CF和OF可以判断无符号和补码的溢出。而我们平时使用的高级程序语言,就仅仅靠这四个寄存器,就可以演化出千变万化的流程控制。几乎所有的算术与逻辑指令都会改变条件码寄存器的值,不过改变的前提是触发了条件码寄存器的条件。比...
计算机系统学习开始学习第三章程序的机器级表示,我竟然惊喜地发现这一章的内容正是我想学习但一直没找到汇总很好的学习资源。这两天主要在学习关于汇编指令的基础知识。 为什么要学习汇编有的人说,汇编语言的可读性和可移植性都很差,高级语言很容易理解、兼容性很好。为什么要学汇编语言而不是高级语言?因为想要真正了解计算机系统,了解计算机是如何工作的,想要做一些漏洞分析,汇编语言都是必不可少的。 生成汇编代码一般生成汇编代码有两种途径,一种是从高级语言生成汇编代码,这时可以借助gcc编译器,比如在Linux环境下,使用命令 > gcc -Og -S xx.c 就可以看到C语言编译器产生的汇编代码了...
计算机系统学习浮点数为了让数值的表示更加精确,或者表示一些整数无法达到的数字,比如一些接近于0的数字,或者一些非常大的数值就需要用到浮点数了。浮点数对于计算机的意义,可以说是相当之大。IEEE标准采用类似于科学计数法的方式表示浮点小数,即我们将每一个浮点数表示为 V = (-1)^s*M*2^E 。这其中s为符号位,为0时为正,为1时为负。M为尾数,是一个二进制小数,它的范围是0至1-ε,或者1至2-ε(。E为阶码,是一个二进制整数,可正可负,为了给尾数加权。浮点格式分为两种,一种是单精度,一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度...
计算机系统学习整数的运算平时的编程过程中,当进行整数运算时,经常会遇到一些奇怪的结果,比如两个正数加出负数,两个负数可以加出一个正数,这些都是由于数值表示的有限性导致的。无符号的加法二进制整数的加法与我们平时的十进制算法有一个最大的区别,那就是我们在计算机当中进行计算时,结果的位数都是有限制的。因此在我们计算过后,可能需要对结果进行截断操作。如果结果用超出规定的位才能表示,就算是溢出。所以来说无符号的加法只要不溢出就可以按照正常的加法来算,但如果出现溢出就需要减2^w。补码的加法对于补码加法就是可以先按照无符号加法进行运算,然后再进行无符号和有符号的转换。与无符号加法不同的是,补码的加法...
计算机系统学习今天学习了对二进制整数的位进行拓展和截断表示。 拓展数字假如我们将一个短整型的变量转换为整型变量,由两个字节扩充为四个字节,这时就涉及到了位的扩展。在进行位的扩展时,最容易想到的就是在高位全部补0,也就是将原来的二进制序列前面加入若干个0,也称为零扩展。还有一种方式比较特别,是符号扩展,也就是针对有符号数的方式,它是直接扩展符号位,也就是将二进制序列的前面加入若干个最高位。对于零扩展来说,很明显扩展之后的值与原来的值是相等的,而对于符号扩展来说,则是一样,只不过没有零扩展来的直接。我们在计算补码时有一个比较简单的办法,就是符号位若为0,则与无符号是类似的。若符号位为1,也就...
计算机系统学习今天学习了整数的表示,一般编码整数有两种方式:一种只能表示非负数,而另一种能够表示负数、零和整数。这样就把整数分为无符号数unsigned和有符号数int(默认),通过今天的学习初步掌握了几种编码类型和它们之间的转换。 编码类型无符号编码其实无符号编码就是我们平时最直接的读法,没有符号位,直接可以转换位十进制数。对于一个w位的二进制数来说,取值范围是[0,2^w-1]。补码无符号编码读起来直接自然,但是可惜的是,它无法表示负整数。因此我们需要一种能够表示负数的整数表示方式,这样就引出了补码编码。补码表示的二进制数,最高位是符号位,0为非负数,1为负数。补码的定义如下我们观察...
虚拟机指令集架构所谓指令集,就是CPU中用来计算和控制计算机系统的一套指令的集合。因为指令集表示了一个给定的CPU能做哪些工作,所以在设计一个机器时考虑需要提供什么样的指令是非常重要的步骤。实际上总会有一些基本指令,所有的处理器、虚拟机或运行时环境都会提供,比如算术运算、逻辑运算、位操作、比较运算、跳转等。CPU的指令集从主流的体系结构上分为精简指令集RISC和复杂指令集CISC,CISC指令系统庞大,指令功能复杂,指令格式、寻址方式多;而RISC指令数量少,大部分为单周期指令,操作寄存器,只有Load/Store操作内存。在设计指令集时,除了考虑RISC和CISC之外,还需要考虑指令集...
代码分析1.在汇编代码中,发现有很多[],[]表示是间接寻址,bx和[bx]的区别是,前者操作数就是bx中存放的数,后者操作数是以bx中存放的数为地址的单元中的数。比如:mov ax,[bx]bx中存放的数是40F6H,40F6H、40F7H两个单元中存放的数是22H、23H,则mov ax,[bx];2322H传送到ax中mov ax,bx;40F6H传送到ax中 2.movzx指令一般用于将较小值拷贝到较大值中,其实就是将我们的源操作数取出来,然后置于目的操作数,目的操作数其余位用0填充。比如eax=00304000h若执行 movzx eax, ax后 eax = 00004000...
sub_E90代码分析今天分析到case 151、case 152卡了,没有做上匹配,先来说一下我的理解。1234567891011121314.text:0000000000000EF3 movzx eax, word ptr [rbx+22h].text:0000000000000EF7 add eax, 0FFFFFFFEh.text:0000000000000EFA mov [rbx+22h], ax.text:0000000000000EFE ...