版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章程序的加载和执行
可执行文件的加载
进程的上下文切换
程序的执行与CPU基本组成
程序的执行机制主要教学目标理解程序和进程概念的不同了解Linux中如何表示进程的存储器映射了解程序的加载过程了解进程的上下文信息及其上下文切换了解程序和指令的执行过程了解内部异常和外部中断的基本概念了解CPU的主要功能和基本组成程序的执行机制分以下两个部分介绍第一讲:进程和可执行文件的加载程序和进程的概念进程的存储器映射程序的加载过程进程的逻辑控制流进程的上下文切换第三讲:程序的执行与CPU基本组成程序及指令的执行过程内部异常和外部中断的基本概念CPU的基本功能和基本组成“程序”和“进程”进程是OS对CPU执行的程序的运行过程的一种抽象。进程有自己的生命周期,它由于任务的启动而创建,随着任务的完成(或终止)而消亡,它所占用的资源也随着进程的终止而释放。一个可执行目标文件(即程序)可被加载执行多次,也即,一个程序可能对应多个不同的进程。例如,用word程序编辑一个文档时,相应的用户进程就是winword.exe,如果多次启动同一个word程序,就得到多个winword.exe进程,处理不同的数据。程序(program)指按某种方式组合形成的代码和数据集合,代码即是机器指令序列,因而程序是一种静态概念。进程(process)指程序的一次运行过程。更确切说,进程是具有独立功能的一个程序关于某个数据集合的一次运行活动,因而进程具有动态含义。同一个程序处理不同的数据就是不同的进程进程的概念操作系统(管理任务)以外的都属于“用户”的任务。计算机处理的所有“用户”的任务由进程完成。为强调进程完成的是用户的任务,通常将进程称为用户进程。计算机系统中的任务通常就是指进程。例如,Linux内核中通常把进程称为任务,每个进程主要通过一个称为进程描述符(processdescriptor)的结构来描述,其结构类型定义为task_struct,包含了一个进程的所有信息。所有进程通过一个双向循环链表实现的任务列表(tasklist)来描述,任务列表中每个元素是一个进程描述符。IA-32中的任务状态段(TSS)、任务门(taskgate)等概念中所称的任务,实际上也是指进程。
引入“进程”的好处“进程”的引入为应用程序提供了以下两方面的抽象:一个独立的逻辑控制流每个进程拥有一个独立的逻辑控制流,使得程序员以为自己的程序在执行过程中独占使用处理器一个私有的虚拟地址空间每个进程拥有一个私有的虚拟地址空间,使得程序员以为自己的程序在执行过程中独占使用存储器进程”的引入简化了程序员的编程以及语言处理系统的处理,即简化了编程、编译、链接、共享和加载等整个过程。IA-32/x86-64+Linux平台下,每个进程具有独立的私有地址空间(虚拟地址空间)每个进程的虚拟地址空间划分(即存储映像)布局相同进程的地址空间用户级上下文系统级上下文TSSLinux将虚存空间组织成“区域”的集合pgd:全局页目录地址vm_prot:访问权限vm_flags:映射对象的类型vm_nextvm_nexttask_structmm_structpgdmmmmapvm_area_structvm_endvm_protvm_startvm_endvm_protvm_startvm_endvm_protvm_nextvm_startProcess
virtual
memoryTextDataShared
libraries0vm_flagsvm_flagsvm_flagstask_struct是某个进程(即任务)所有相关信息的描述结构(称进程描述符),其中mm是其虚拟空间的描述结构进程的存储器映射存储器映射(memorymapping)是指将进程虚拟地址空间中的一个区域与硬盘上的一个对象建立关联(生成页表项),并初始化一个vm_area_struct结构信息可用mmap()函数实现存储器映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);如何获得mmap函数的实参?读取可执行文件中的程序头表而获得实参!进程的存储器映射可用mmap()函数实现存储器映射void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);功能:将指定文件fd中偏移量offset开始的长度为length个字节的一块信息映射到虚拟空间中起始地址为start、长度为length个字节的一块区域,得到vm_area_struct结构的信息,并生成相应页表项,建立文件地址和区域之间的映射关系。prot指定该区域内页面的访问权限位,对应vm_area_struct结构中的vm_prot字段PROT_EXE:页面内容由指令组成PROT_READ:区域内页面可读PROT_WRITE:区域内页面可写PROT_NONE:区域内页面不能被访问flags指定所映射的对象的类型,对应vm_area_struct结构中的vm_flags字段MAP_PRIVATE:私有的写时拷贝对象,对应可执行文件中只读代码区域(.init、.text.rodata)和已初始化数据区域(.data)MAP_SHARED:共享对象,对应共享库文件中的信息MAP_ANON:请求0的页,对应内核创建的匿名文件,相应页框用0覆盖并驻留内存MAP_PRIVATE|MAP_ANON:未初始化数据(.bss)、堆和用户栈等对应区域虚页第一次被装入内存后,不管是用普通文件还是匿名文件对其进行初始化,以后都是在主存页框和硬盘中交换文件(swapfile)间进行调进调出。交换文件由内核管理和维护,称为交换分区(swaparea)或交换空间(swapspace)。Linux中虚拟地址空间中的区域MAP_PRIVATE|MAP_ANONMAP_SHAREDMAP_PRIVATEMAP_PRIVATE|MAP_ANONMAP_PRIVATE|MAP_ANON匿名文件:内核创建、无实际磁盘文件,无需从磁盘读入、对应请求0的页面普通文件:可执行文件和共享库文件共享库文件中的共享对象多个进程调用共享库文件中的代码,但共享库代码在内存和硬盘都只需要一个副本进程1运行过程中,内核为共享对象分配若干页框进程2运行过程中,内核只要将进程2对应区域内页表项中的页框号直接填上即可一个进程对共享区域进行的写操作结果,对于所有共享同一个共享对象的进程都是可见的,而且结果也会反映在硬盘上对应的共享对象中所分配的页框在主存不一定连续,为简化示意图,这里图中所示页框是连续的硬盘私有的写时拷贝对象同一个可执行文件对应不同进程时,只读代码区一样,可读可写数据区开始也一样,但属于私有对象为节省主存,多采用写时拷贝技术进程1运行过程中,内核为对象分配若干页框,并标记为只读进程2运行过程中,内核只要将进程2对应区域内页表项中的页框号直接填上,并标记为只读若两个进程都只是读或执行,则在内存只有一个副本,节省主存;若进程2进行写操作,则发生访问违例,此时,内核判断异常原因是进程试图写私有的写时拷贝页,就会分配一个新页框,把内容拷贝到新页框,并修改进程2的页表项所分配的页框在主存不一定连续,为简化示意图,这里图中所示页框是连续的硬盘程序的加载和运行UNIX/Linux系统中,可通过调用execve()函数来启动加载器。execve()函数的功能是在当前进程上下文中加载并运行一个新程序。execve()函数的用法如下:
intexecve(char*filename,char*argv[],*envp[]);
filename是加载并运行的可执行文件名(如./hello),可带参数列表argv和环境变量列表envp。若错误(如找不到指定文件filename),则返回-1,并将控制权交给调用程序;若函数执行成功,则不返回,最终将控制权传递到可执行目标中的主函数main。主函数main()的原型形式如下:
intmain(intargc,char**argv,char**envp);
或者:
intmain(intargc,char*argv[],char*envp[]);
argc指定参数个数,参数列表中第一个总是命令名(可执行文件名)
例如:命令行为“ld-otestmain.otest.o”时,argc=5回顾:程序的加载和运行Unix>ld
-otestmain.otest.o若在shell命令行提示符下输入以下命令行ld是可执行文件名(即命令名),随后是命令的若干参数,argv是一个以null结尾的指针数组,argc=5在shell命令行提示符后键入命令并按“enter”键后,便构造argv和envp,然后调用execve()函数来启动加载器,最终转main()函数执行intexecve(char*filename,char*argv[],*envp[]);intmain(intargc,char*argv[],char*envp[]);回顾:程序的加载和运行问题:hello程序的加载和运行过程是怎样的?Step1:在shell命令行提示符后输入命令:$./hello[enter]Step2:shell命令行解释器构造argv和envpargvargv[0]nullargv[]“./hello"Step3:调用fork()函数,创建一个子进程,与父进程shell完全相同(只读/共享),包括只读代码段、可读写数据段、堆以及用户栈等。Step4:调用execve()函数,在当前进程(新创建的子进程)的上下文中加载并运行hello程序。将hello中的.text节、.data节、.bss节等内容加载到当前进程的虚拟地址空间(仅修改当前进程上下文中关于存储映像的一些数据结构,不从磁盘拷贝代码和数据等内容)Step5:调用hello程序的main()函数,hello程序开始在一个进程的上下文中运行。intmain(intargc,char*argv[],char*envp[]);回顾:可执行文件的加载通过调用execve系统调用函数来调用加载器加载器(loader)根据可执行文件的程序(段)头表中的信息,将可执行文件的代码和数据从磁盘“拷贝”到存储器中(实际上不会真正拷贝,仅建立一种映像,这涉及到许多复杂的过程和一些重要概念,将在后续课上学习)加载后,将PC(EIP)设定指向Entrypoint
(即符号_start处),最终执行main函数,以启动程序执行。程序被启动如$./P调用fork()以构造的argv和envp为参数调用execve()execve()调用加载器进行可执行文件加载,并最终转去执行main__libc_init_first_initatexitmain_exit_start:ELF文件信息举例$readelf-hmain
ELFHeader:Magic:7f454c46010101000000000000000000Class:ELF32Data:2'scomplement,littleendianVersion:1(current)OS/ABI:UNIX-SystemVABIVersion:0Type:EXEC(Executablefile)Machine:Intel80386Version:0x1Entrypointaddress:x8048580Startofprogramheaders:52(bytesintofile)Startofsectionheaders:3232(bytesintofile)Flags:0x0Sizeofthisheader:52(bytes)Sizeofprogramheaders:32(bytes)Numberofprogramheaders:8Sizeofsectionheaders:40(bytes)Numberofsectionheaders:29Sectionheaderstringtableindex:26
可执行目标文件的ELF头程序的加载fork、execve等OS内核代码当IA-32/Linux系统开始执行main()函数时,在虚拟地址空间的用户栈中的结构如左图所示
intmain(intargc,char*argv[],char*envp[]);shell命令行解释器A25逻辑控制流t0t1t2t3t4t5t6WordWordIEt7t8对于确定的数据集,某进程指令执行地址序列是确定的。称为进程的逻辑控制流。
对于单处理器系统,进程会轮流使用处理器,即处理器的物理控制流由多个逻辑控制流组成。
p1的逻辑控制流为A11~A13、A11~A14、A15~A16。在A12处被打断一次!逻辑控制流不会因被其他进程打断而改变,还能回到原被打断的“断点”处继续执行。进程p2的逻辑控制流为A21~A22、A23~A25。在A24处被打断一次!P3未被打断不同进程的逻辑控制流在时间上交错或重叠的情况称为并发(concurrency)P1和P2、P2和P3是并发执行;P1和P3不是并发执行!
“进程”
与“上下文切换”$./hellohello,world$“$”是shell命令行提示符,说明正在运行shell进程。在一个进程的生命周期中,可能会有其他不同进程在处理器上交替运行!感觉到的运行时间比真实执行时间要长!OS通过处理器调度让处理器轮流执行多个进程。实现不同进程中指令交替执行的机制称为进程的上下文切换(contextswitching)处理器调度等事件会引起用户进程正常执行被打断,因而形成异常控制流。进程的上下文切换机制很好地解决了这类异常控制流,实现了从一个进程安全切换到另一个进程执行的过程。
用户态
内核态
用户态
内核态
用户态“进程”
的“上下文”进程的物理实体(代码和数据等)和支持进程运行的环境合称为进程的上下文。由进程的程序块、数据块、运行时的堆和用户栈(两者通称为用户堆栈)等组成的用户空间信息被称为用户级上下文;由进程标识信息、进程现场信息、进程控制信息和系统内核栈等组成的内核空间信息被称为系统级上下文;处理器中各寄存器的内容被称为寄存器上下文(也称硬件上下文),即进程的现场信息。在进行进程上下文切换时,操作系统把换下进程的寄存器上下文保存到系统级上下文中的现场信息位置。用户级上下文地址空间和系统级上下文地址空间一起构成了一个进程的整个存储器映像
进程的存储器映像程序的执行机制分以下三个部分介绍第一讲:进程和可执行文件的加载程序和进程的概念进程的存储器映射程序的加载过程进程的逻辑控制流进程的上下文切换第二讲:程序的执行与CPU基本组成程序及指令的执行过程内部异常和外部中断的基本概念CPU的基本功能和基本组成程序及指令的执行过程程序和指令的关系程序由一条一条指令组成,指令按顺序存放在连续存储单元程序的执行:周而复始地执行一条一条指令正常情况下,指令按其存放顺序执行遇到需改变程序执行流程时,用相应的转移指令(包括无条件转移指令、条件转移指令、调用指令和返回指令等)来改变程序执行流程程序的执行流的控制将要执行的指令所在存储单元的地址由程序计数器PC给出,通过改变PC的值来控制执行顺序指令周期:CPU取出并执行一条指令的时间程序及指令的执行过程对于6.4.2中例子#include"stdio.h"#include"string.h"
voidoutputs(char*str)
{charbuffer[16];strcpy(buffer,str);printf("%s\n",buffer);}……intmain(intargc,char*argv[]){outputs(argv[1]);return0;}Strcpy的栈帧main:
……
calloutputsmoveax,………retoutputs:
……
callstrcpy……callprintf……retstrcpy:程序执行流:……calloutputs……callstrcpy……callprintf…...retmov%eax,…
……程序及指令的执行过程反汇编得到的outputs汇编代码080483e4:push%ebp080483e5:mov%esp,%ebp080483e7:sub$0x18,%esp080483ea:mov0x8(%ebp),%eax080483ed:mov%eax,0x4(%esp)080483f1:lea0xfffffff0(%ebp),%eax080483f4:mov%eax,(%esp)080483f7:call0x8048330<__gmon_start__@plt+16>080483fc:lea0xfffffff0(%ebp),%eax080483ff:mov%eax,0x4(%esp)08048403:movl$0x8048500,(%esp)0804840a:call0x80483100804840f:leave08048410:ret将strcpy的两个实参入栈将printf的两个实参入栈程序及指令的执行过程在内存存放的指令实际上是机器代码(0/1序列)08048394<add>:8048394:55push%ebp8048395:89e5mov%esp,%ebp8048397:8b450cmov0xc(%ebp),%eax804839a:034508add0x8(%ebp),%eax804839d:5d pop%ebp804839e:c3 ret对于add函数指令按顺序存放在0x08048394开始的存储空间。各指令长度可能不同,如push、pop和ret指令各占一个字节,第2行mov指令占两个字节,第3行mov指令和第4行add指令各占3字节。各指令对应的0/1序列含义有不同的规定,如“push%ebp”指令为01010101B,其中01010为push指令操作码,101为EBP的编号,“pop%ebp”为01011101B,其中01011为pop指令的操作码。如何判定每条指令有多长?如何判定操作类型、寄存器编号、立即数等?如何区分第2行和第3行mov指令的不同?如何确定操作数是在寄存器中还是在存储器中?一条指令执行结束后如何正确读取到下一条指令?123456程序执行需要解决的问题:程序及指令的执行过程CPU运行程序的过程就是执行一条一条指令的过程CPU执行指令的过程中,包含CPU操作、访问内存或I/O端口的操作两类访存或I/O:涉及存储系统、总线和I/O接口等内容(后续课程内容)CPU内部操作:涉及CPU内部数据通路(后续课程内容)机器指令的执行过程CPU执行指令的过程取指令PC+“1”指令译码进行主存地址运算取操作数进行算术/逻辑运算存结果以上每步都需检测“异常”若有异常,则自动切换到异常处理程序检测是否有“中断”请求,有则转中断处理指令执行过程问题:“取指令”一定在最开始做吗?PC+“1”一定在译码前做吗?“译码”须在指令执行前做吗?你能说出几种“异常”事件?“异常”和“中断”的差别是什么?异常是在CPU内部发生的,中断是由外部事件引起的取指阶段执行阶段“1”:指一条指令的长度,定长指令字每次都一样;变长指令字每次可能不同定长指令字通常在译码前做,变长指令字在译码后做!机器指令的执行过程取指令:从PC所指单元取出指令送指令寄存器(IR),并增量PC。如add函数,开始PC(IA-32的EIP)中存放的是0x0848394,CPU根据PC取指令送IR,每次总是取最长指令字节数,假定最长指令是4个字节,即IR为32位,此时,也即5589E58BH被取到IR中。指令译码:不同指令其功能不同,因而需要不同的操作控制信号。CPU根据不同操作码译出不同控制信号。对于上述取到IR中的5589E58BH译码时,可根据高5位01010译码得到push指令的控制信号。源操作数地址计算并取操作数:根据寻址方式确定源操作数地址计算方式,若是存储器数据,则需一次或多次访存;若为间接寻址或两操作数都在存储器的双目运算,则需多次访存;若是寄存器数据,则直接从寄存器取数。执行数据操作:在ALU或加法器等运算部件中对取出的源操作数进行运算。目的操作数地址计算并存结果:根据寻址方式确定目的操作数地址计算方式,若是存储器数据,则需要一次或多次访存(间接寻址时);若是寄存器数据,则在进行数据操作时直接存结果到寄存器。指令地址计算并将其送PC。顺序执行时,PC加上当前指令长度;遇到转移类指令时,则需要根据条件码、操作码和寻址方式等确定下条指令地址。
机器指令的执行过程每条指令的功能总是由以下四种基本操作来实现:读取某一主存单元的内容,并将其装入某个寄存器(取指,取数)把一个数据从某个寄存器存入给定的主存单元中(存结果)把一个数据从某寄存器送到另一寄存器或者ALU(取数,存结果)进行算术或逻辑运算(PC+”1”,计算地址,运算)指令执行过程中查询各种异常情况,并在发现异常时转异常处理指令执行结束时查询中断请求,并在发现中断请求时响应中断操作功能可形式化描述描述语言称为寄存器传送语言RTL(RegisterTransferLanguage)回顾:冯.诺依曼结构模型机控制器CPUPC输入设备输出设备MARMDRALU标志寄存器
IR地址数据控制GPRs0123存储器01234567
你妈会做的菜和厨师会做的菜不一样,同一个菜谱的做法也可能不同如同不同架构支持的指令集不同,同一种指令的实现方式和功能也可能不同控制器
ALU标志寄存器
地址数据控制GPRs017ffffffff80483d680483d580483d405589e5EIPbfff0000MDRIRMARbeeefffc回顾:IA-32的体系结构是怎样的呢?8个GPR(0~7),一个EFLAGs,PC为EIP可寻址空间4GB(编号为0~0xFFFFFFFF)指令格式变长,操作码变长由若干字段(OP、Mod、SIB等)组成
程序由指令序列组成080483d4
<add>:80483d4: 55 push%ebp80483d5: 89e5 mov%esp,%ebp80483d7: 83ec10sub$0x10,%esp
80483da: 8b450cmov0xc(%ebp),%eax80483dd: 8b5508mov0x8(%ebp),%edx80483e0: 8d0402lea(%edx,%eax,1),%eax80483e3: 8945fcmov%eax,-0x4(%ebp)80483e6: 8b45fcmov-0x4(%ebp),%eax80483e9: c9leave80483ea: c3ret代码执行从80483d4开始!“objdump-dtest”显示的add函数结果起始EIP=?EIP←0x80483d4若i=2147483647,j=2,则程序执行结果是什么?每一步如何执行?想想妈妈怎么做菜的?根据EIP取指令指令译码取操作数指令执行回写结果修改EIP的值取并执行指令OP假定0x80484d4等是内存地址,实际上它们是虚存地址,需要虚-实地址转换指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff0000bfff000080483d480483d45589e583Rd5589e58355MDR5589e58380483d4S1:取指令IR5589e583RdS2:指令译码S3:指令执行MARbffefffc55功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d455MDR80483d4S1:取指令IRS2:指令译码S3:指令执行bffefffcMARbffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d455MDRS1:取指令IRS2:指令译码S3:指令执行bffefffcMARbffefffcbffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]54指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d4Wr55MDRS1:取指令IRWrS2:指令译码S3:指令执行bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff0000Wr55MDRS1:取指令IRWrS2:指令译码S3:指令执行bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc2000ffbf80483d4功能:R[esp]←R[esp]-4,M[R[esp]]←R[ebp]45指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
080483d4
<add>:80483d4:55 push%ebp80483d5:89e5 mov%esp,%ebp5589e5
EBPESPEIPbfff0020bfff000080483d555MDRS1:取指令IRS2:指令译码S3:指令执行、EIP增量bffefffcMARbffefffcbffefffcbfff0020bfff0020bffefffc2000ffbf开始执行下一条指令45WrWr
程序由指令序列组成080483d4
<add>:
80483d4: 55 push%ebp80483d5: 89e5 mov%esp,%ebp80483d7: 83ec10sub$0x10,%esp
80483da: 8b450cmov0xc(%ebp),%eax80483dd: 8b5508mov0x8(%ebp),%edx
80483e0: 8d0402lea(%edx,%eax,1),%eax80483e3: 8945fcmov%eax,-0x4(%ebp)80483e6: 8b45fcmov-0x4(%ebp),%eax80483e9: c9leave80483ea: c3retEIP←0x80483d4若i=2147483647,j=2,则程序执行结果是什么?每一步如何执行?OPEDX和EAX中各是什么?R[edx]=i=0x7fffffffR[eax]=j=0x2回顾:IA-32的寄存器组织反映了体系结构发展的轨迹,字长不断扩充,指令保持兼容ST(0)~ST(7)是80位,MM0~MM7使用其低64位指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5
EBPESPEIPbfff000080483e0MDRS1:取指令IRWrS2:指令译码S3:指令执行、EIP增量MAR7fffffffbeeefffc2000ffbf2
28d04028945功能:R[eax]←R[edx]+R[eax]*1回顾:ALU长啥样呢?试想一下ALU中有哪些部件?(想想厨房做菜用什么工具?)补码加/减器(可以干什么?)带符号加、带符号减无符号加、无符号减乘法器?(为什么可以没有?)可用加/减+移位实现,也可有独立乘法器带符号乘和无符号乘是各自独立的部件除法器?(为什么可以没有?)可用加/减+移位实现,也可有独立除法器带符号除和无符号除是各自独立的部件各种逻辑运算部件(可以干什么?)非、与、或、非、前置0个数、前置1个数…….大家能否画出ALU框图?回顾:ALU结构原理
ALU符号是怎样的?ALUABRFlagsALUctrnnn4猜猜这是什么?补码加/减器与门nnnFlagsR或门右移非门ABAA∧BA>>1A∨B4ALUctr多路选择器指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5
EBPESPEIPbfff000080483e0MDRS1:取指令IRWrS2:指令译码S3:指令执行、EIP增量MAR7fffffffbeeefffc2000ffbf28d04028945功能:R[eax]←R[edx]+R[eax]*1(执行前)
2指令执行过程控制器
ALU标志寄存器
地址数据控制GPRs017bfff002080483d680483d580483d40
80483da:8b450cmov0xc(%ebp),%eax80483dd:8b5508mov0x8(%ebp),%edx80483e0:8d0402lea(%edx,%eax,1),%eax5589e5
EBPESPEIPbfff000080483e0MDRS1:取指令IRWrS2:指令译码S3:指令执行、EIP增量MAR7fffffffbeeefffc2000ffbf2
800000018d04028945功能:R[eax]←R[edx]+R[eax]*1(执行后)lea指令执行的结果intadd(inti,intj){ returni+j;}intmain(){ int t1=2147483647;intt2=2; int sum=add(t1,t2); printf(”sum=%d”,
sum);}sum=-2147483647sum=0x80000001
sum的机器数和值分别是什么?
咦,怎么会两个正数相加结果为负数呢?为什么?回顾:程序的机器级表示与执行intsum(inta[],unsignedlen){inti,sum=0;for(i=0;i<=len–1;i++) sum+=a[i];returnsum;}sum:….L3:…movl-4(%ebp),%eaxmovl12(%ebp),%edxsubl$1,%edxcmpl%edx,%eaxjbe .L3…程序的正常执行顺序有哪两种?(1)按顺序取下一条指令执行(2)通过CALL/RET/Jcc/JMP等指令跳转到转移目标地址处执行CPU所执行的指令的地址序列称为CPU的控制流,通过上述两种方式得到的控制流为正常控制流。08048380<main>:8048380:55 push%ebp8048381:89e5mov%esp,%ebp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理课件制作工具的与评测
- 2025年家庭娱乐App用户体验设计
- 护理儿科护理课件分享
- 兽用生物制品制造工岗前评审考核试卷含答案
- 房产测量员班组协作能力考核试卷含答案
- 2026年新科教版高中高一生物上册第一单元细胞中的化合物检测卷含答案
- 道具制作工岗前环保及安全考核试卷含答案
- 白酒蒸馏串香工创新思维知识考核试卷含答案
- 胶印版材涂布液合成工班组建设水平考核试卷含答案
- 信用分析师安全宣教水平考核试卷含答案
- 企业并购的机遇与挑战分析
- 射线检测专业知识考试题库(含答案)
- 2024年全国统一高考数学试卷(理科)甲卷含答案
- 湖北省襄阳市2023-2024学年小升初语文试卷(含答案)
- 黑龙江省建筑工程施工质量验收标准(建筑地面工程)
- 第八课 良师相伴 亦师亦友
- 2023年南京市中考历史试题及答案
- 《公共政策评估》课件
- 350种中药饮片功能主治
- 蓄电池安装施工方案方案
- 健身步道建设项目可行性研究报告
评论
0/150
提交评论