第二章计算机的语言_第1页
第二章计算机的语言_第2页
第二章计算机的语言_第3页
第二章计算机的语言_第4页
第二章计算机的语言_第5页
已阅读5页,还剩108页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chapter2指令:计算机的语言Chapter2—Instructions:LanguageoftheComputer—2指令集一台计算机的全部指令不同计算机有不同的指令集但有许多共同的方面早期计算机有很简单的指令集实现简单许多现代计算机也有简单指令集例如:ARM系列计算机(RSIC)§2.1IntroductionChapter2—Instructions:LanguageoftheComputer—3MIPS指令集用于编写书中的例子使用的是MIPS语言斯坦福大学的MIPS来自MIPS公司()在嵌入式处理机市场中占有很大的份额广泛地应用在家用电器、网络/存储设备,照相机,打印机…许多现代指令集的代表参见MIPS参考数据卡和附录B和E。Chapter2—Instructions:LanguageoftheComputer—4算术运算操作加法和减法,都是三操作数两个源操作数,一个目的操作数 adda,b,c#a=b+c注释用#开头所有的算术运算都是这样的形式设计原则一:简单源于规整规整使实现简单简单能获得低成本高性能§2.2OperationsoftheComputerHardwareChapter2—Instructions:LanguageoftheComputer—5算术操作例子C语言的语句: f=(g+h)-(i+j);编译成MIPS代码: addt0,g,h#临时变量t0=g+h

addt1,i,j#临时变量t1=i+j

subf,t0,t1#f=t0-t1Chapter2—Instructions:LanguageoftheComputer—6寄存器操作数算术运算指令使用寄存器操作MIPS有32个32位寄存器用于存储频繁使用的数据编号0到3132位数码称为一个字编译时名称的约定$t0,$t1,…,$t9表示临时寄存器$s0,$s1,…,$s7用于存储变量设计原则二:越少越快对照主存:数以百万计的存储位置§2.3OperandsoftheComputerHardwareChapter2—Instructions:LanguageoftheComputer—7寄存器操作数举例C语言编写的代码: f=(g+h)-(i+j);f,…,jin$s0,…,$s4编译成MIPS代码: add$t0,$s1,$s2

add$t1,$s3,$s4

sub$s0,$t0,$t1Chapter2—Instructions:LanguageoftheComputer—8存储器操作数主存可以存储复杂数据数组,结构,动态数据使用算术运算操作数从主存把数读入到寄存器把结果从寄存器存储到主存存储器按字节编址每个地址表示一个8位字节按字存放在内存每个地址必须是4个字节MIPS按大端编址高位存放在低地址对照小端模式:低位放到低地址地址偏移大端模式小端模式0x0012(OP0)34(OP1)0x0134(OP1)12(OP0)如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。Chapter2—Instructions:LanguageoftheComputer—9存储器操作数举例1Ccode: g=h+A[8];g在$s1,h在$s2,A的基址在$s3编译成MIPS代码:小标8(数组第8个分量)需要32的偏移每个字对应4个字节

lw$t0,32($s3)#loadword

add$s1,$s2,$t0偏移量offset基址寄存器BaseregisterChapter2—Instructions:LanguageoftheComputer—10存储器操作数举例2Ccode: A[12]=h+A[8];hin$s2,baseaddressofAin$s3CompiledMIPScode:Index8requiresoffsetof32

lw$t0,32($s3)#loadword

add$t0,$s2,$t0

sw$t0,48($s3)#storewordChapter2—Instructions:LanguageoftheComputer—11寄存器和主存储器寄存器的访问速度比主存快得多对主存储器数据的操作要用取数指令lw(loadword)存数指令sw(storeword)。需要执行更多的指令编译器必须尽量使用寄存器访问变量仅当寄存器不够用时才把不经常使用的变量放到内存;寄存器的高效利用对系统优化非常重要。Chapter2—Instructions:LanguageoftheComputer—12常数或立即数操作数指令中使用常数

addi$s3,$s3,4(immediate)没有减去立即数的减法指令可以使用负常数,即“加负数”实现减法

addi$s2,$s1,-1设计规则三:加速执行常用操作小常数操作出现的频率高立即数操作不用到内存取数Chapter2—Instructions:LanguageoftheComputer—13常数零MIPS寄存器0($zero)表示常数0不能被改写在常用的操作中,很有用例如,可在寄存器之间传送数据

add$t2,$s1,$zero常用的寻址方式寄存器型:直接、间接;存储器型:直接、间接;计算型:相对、基址、变址;立即数型;Chapter2—Instructions:LanguageoftheComputer—15二进制无符号整数给定一个n位数范围:0to+2n–1举例00000000

0000

0000

0000

0000

000010112

=0+…+1×23+0×22+1×21+1×20

=0+…+8+0+2+1=111032位数0to+4,294,967,295§2.4SignedandUnsignedNumbersChapter2—Instructions:LanguageoftheComputer—16二进制补码表示有符号整数x是一个n位数范围:–2n–1to+2n–1–1举例11111111

1111

1111

1111

1111

111111002

=–1×231+1×230+…+1×22+0×21+0×20

=–2,147,483,648+2,147,483,644=–41032位数–2,147,483,648to+2,147,483,647Chapter2—Instructions:LanguageoftheComputer—17二进制补码表示有符号整数31位是符号位1表示负数0表示非负–(–2n–1)不能表示非负数的无符号数和二进制补码是相同的一些特殊的数0: 00000000…0000–1: 11111111…1111绝对值最大负数: 10000000…0000最大正数: 01111111…1111Chapter2—Instructions:LanguageoftheComputer—18有符号数(二进制补码)的取反取反加1取反的含义1→0,0→1举例:对+2的求反+2=00000000…00102–2=11111111…11012+1

=11111111…11102Chapter2—Instructions:LanguageoftheComputer—19符号扩展使用更多的位表示一个数数值保持不变在MIPS指令集中addi:extendimmediatevalue扩展到立即数lb,lh:extendloadedbyte/halfword

扩展到取字节/半字beq,bne:扩展到跳转后的位置extendthedisplacement相等/不相等跳转复制符号位到左侧对照无符号数:用0扩充举例:8-bitto16-bit+2:00000010=>00000000

00000010–2:11111110=>11111111

11111110Chapter2—Instructions:LanguageoftheComputer—20指令表示指令用二进制编码称为机器代码MIPS指令32位指令字编码指令格式中若干字段分别用于表示操作码,寄存器编号,…非常规整寄存器编号【参考教材71页图2-14】$t0–$t7arereg’s8–15$t8–$t9arereg’s24–25$s0–$s7arereg’s16–23§2.5RepresentingInstructionsintheComputer指令格式的演变肆地址指令;三地址指令;二地址指令;一地址指令;零地址指令。地址的显式和隐含式Chapter2—Instructions:LanguageoftheComputer—22MIPS中寄存器指令指令字段op:操作码(opcode)rs:第一个源寄存器编号rt:第二个源寄存器编号rd:目的寄存器编号shamt:移位位数(00000表示不移位)funct:功能码(扩展操作码)(extendsopcode)oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—23R-型(寄存器)操作举例 add$t0,$s1,$s2special$s1$s2$t00add01718803200000010001100100100000000100000000000100011001001000000001000002=0232402016oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—24十六进制基底是16二进制串的压缩表示(使用16进制的原因)四位二进制组成一个十六进制数000004010081000c1100100015010191001d11012001060110a1010e11103001170111b1011f1111Example:eca8642011101100101010000110010000100000Chapter2—Instructions:LanguageoftheComputer—25MIPSI型(立即数指令)立即数的算术和读数/存数指令rt:目的或源寄存器编号常数的取值范围:–215to+215

–1地址:偏移加上rs中的基址设计原则4:优秀的设计需要适宜的折中方案不同类型指令采用不同的解码方式,但都是32位相同的指令长度尽可能保持相似的指令格式oprsrtconstantoraddress6bits5bits5bits16bits指令格式举例1如果数组A的基址放在$t1中,h存放在$s2中,这C语言写的语句:A[300]=h+A[300]编译成汇编语言,则为:lw$t0,1200($t1)#$t0=A[300]Add$t0,$s2,$t0#$t0=h+A[300]Sw$t0,1200($t1)#把h+A[300]存到原来A[300]所在的单元。指令格式举例1-2oprsrtrdAddress/shamdfunct359812000188803243981200汇编语言编写的程序:lw$t0,1200($t1)

Add$t0,$s2,$t0Sw$t0,1200($t1)变成机器语言,如下:寄存器编号$t0–$t7arereg’s8–15$t8–$t9arereg’s24–25$s0–$s7arereg’s16–23指令格式举例1-3oprsrtrdAddress/shamdfunct359812000188803243981200存在存储器中的形式为上表的2进制:oprsrtrdAddress/shamdfunct100011010010100000000100101100000000001001001000010000000010000010101101001010000000010010110000汇编语言编写的程序:lw$t0,1200($t1)

Add$t0,$s2,$t0Sw$t0,1200($t1)Chapter2—Instructions:LanguageoftheComputer—29存储程序指令用二进制表示,像数一样指令和数据存储在存储器中程序可以被其他程序操作例如,编译,连接,…“二进制兼容”可以让编译后的程序运行在不同的计算机上标准的ISAs(软件编程的标准)TheBIGPictureChapter2—Instructions:LanguageoftheComputer—30逻辑操作对位进行处理的指令逻辑操作CJavaMIPS左移<<<<sll右移>>>>>srl按位与&&and,andi按位或||or,ori按位取反~~nor用于对字中的若干“位”打包和拆包的操作§2.6LogicalOperationsChapter2—Instructions:LanguageoftheComputer—31移位操作shamt:移多少位逻辑左移sll左移空位填0逻辑左移i位相当于乘2i逻辑右移srl逻辑右移空位填0逻辑右移i位相当于除2i(仅对无符号数)oprsrtrdshamtfunct6bits6bits5bits5bits5bits5bitsChapter2—Instructions:LanguageoftheComputer—32“与”操作可用于一个字中的掩码操作选择某些位,其他位清零 and$t0,$t1,$t200000000

0000

0000

000011011100000000000000

0000

00000011110000000000$t2$t100000000

0000

0000

0000110000000000$t0Chapter2—Instructions:LanguageoftheComputer—33“或”操作用于把包含字中的一些位置1,其他位不变

or$t0,$t1,$t200000000

0000

0000

000011011100000000000000

0000

00000011110000000000$t2$t100000000

0000

00000011110111000000$t0Chapter2—Instructions:LanguageoftheComputer—34按位“取反”操作用于改变字中的一些位0变成1,1变成0MIPS3-操作数指令NORaNORb==NOT(aORb)“或非” nor$t0,$t1,$zero00000000

0000

00000011110000000000$t111111111

1111

11111100001111111111$t0Register0:alwaysreadaszeroChapter2—Instructions:LanguageoftheComputer—35决策指令如果条件为真,跳转到被标签的指令执行否则,继续执行beq

rs,rt,L1if(rs==rt)转到标签为L1的指令执行bne

rs,rt,L1if(rs!=rt)转到标签为L1的指令执行;jL1无条件跳转到标签为L1的指令执行§2.7InstructionsforMakingDecisionsChapter2—Instructions:LanguageoftheComputer—36编译IF语句Ccode: if(i==j)f=g+h;

elsef=g-h;f,g,…in$s0,$s1,…编译成MIPS代码:

bne$s3,$s4,Else

add$s0,$s1,$s2

jExit

Else:sub$s0,$s1,$s2

Exit:…AssemblercalculatesaddressesChapter2—Instructions:LanguageoftheComputer—37编译循环语句Ccode:

while(save[i]==k)i+=1;iin$s3,kin$s5,addressofsavein$s6CompiledMIPScode:

Loop:sll$t1,$s3,2

add$t1,$t1,$s6

lw$t0,0($t1)

bne$t0,$s5,Exit

addi$s3,$s3,1

jLoop

Exit:…Chapter2—Instructions:LanguageoftheComputer—38基本块一个基本块是一个指令序列,其中内部没有跳出的指令(结束指令除外)也没有被跳转到的指令(开始指令除外)编译器标识基本快用于优化高级处理机能够加速基本块的执行Chapter2—Instructions:LanguageoftheComputer—39更多的条件操作如果条件为真置1,否则置0sltrd,rs,rt;小于则置位if(rs<rt)rd=1;elserd=0;slti

rt,rs,constantif(rs<constant)rt=1;elsert=0;beq,bne可以和其他指令结合使用

slt$t0,$s1,$s2#if($s1<$s2)$t0=1;

bne$t0,$zero,L#$t0notequaltozerobranchtoLChapter2—Instructions:LanguageoftheComputer—40分支指令设计为什么没有blt,bge等指令?硬件执行<,≥,…比=,≠慢指令中结合分支指令包含更多工作,需要更慢的时钟所有指令都受到了影响Beq和bne是较常用的这是一个很好的设计折中方案Chapter2—Instructions:LanguageoftheComputer—41有符号数和无符号数对比有符号数比较:slt,slti无符号数比较:sltu,sltui举例$s0=11111111

1111

1111

1111

1111

1111

1111$s1=00000000

0000

0000

0000

0000

00000001slt$t0,$s0,$s1#signed–1<+1$t0=1sltu$t0,$s0,$s1#unsigned+4,294,967,295>+1$t0=0Chapter2—Instructions:LanguageoftheComputer—42过程调用遵循步骤将参数放在过程可以访问的寄存器里将控制转移给过程获得过程所需要的存储资源执行过程的操作(请求的任务)将结果的值放在调用程序可以访问到的寄存器将控制返回到调用点§2.8SupportingProceduresinComputerHardwareChapter2—Instructions:LanguageoftheComputer—43寄存器的使用$a0–$a3:传递参数(reg’s4–7)$v0,$v1:返回结果值(reg’s2and3)$t0–$t9:临时寄存器可以被调用者改写$s0–$s7:保存参数必须被调用者保存和恢复$gp:静态数据的全局指针寄存器(reg28)globalpointerforstaticdata(reg28)$sp:堆栈指针寄存器stackpointer(reg29)$fp:帧指针寄存器(framepointer),保存过程帧的第一个字(reg30)$ra:返回地址寄存器returnaddress(reg31)Chapter2—Instructions:LanguageoftheComputer—44过程调用指令过程调用:跳转和链接

jal

ProcedureLabel下一条指令的地址在寄存器$ra中跳转到目标地址过程返回:寄存器跳转jumpregister

jr$ra拷贝$ra到程序计数器也被用于运算后跳转例如用于case/switcg分支语句e.gChapter2—Instructions:LanguageoftheComputer—45不调用其他过程(叶过程)例子Ccode:

int

leaf_example(intg,h,i,j)

{intf;

f=(g+h)-(i+j);

returnf;

}参数g,…,j在$a0,…,$a3中f在$s0(因此,需要存储$s0到堆栈)结果在$v0Chapter2—Instructions:LanguageoftheComputer—46不调用其他过程的例子MIPScode:

leaf_example:

addi$sp,$sp,-4

sw$s0,0($sp)

add$t0,$a0,$a1

add$t1,$a2,$a3

sub$s0,$t0,$t1

add$v0,$s0,$zero

lw$s0,0($sp)

addi$sp,$sp,4

jr$ra存储$s0到堆栈i+j---t1

过程体(g+h)-(i+j)恢复$s0结果(s0----v0)返回参数g,…,j在$a0,…,$a3中;f在$s0(因此,需要存储$s0到堆栈);结果在$v0g+h----t0Chapter2—Instructions:LanguageoftheComputer—47嵌套过程—非叶过程(Non-LeafProcedures)过程调用其他过程对于嵌套调用,调用者需要存储到堆栈的信息:它的返回地址调用后还需要用的任何参数寄存器和临时寄存器调用后返回,寄存器会从堆栈中恢复Chapter2—Instructions:LanguageoftheComputer—48嵌套过程举例Non-LeafProcedureExampleCcode:

intfact(intn)

{

if(n<1)returnf;

elsereturnn*fact(n-1);

}参数n放在

$a0结果放在$v0Chapter2—Instructions:LanguageoftheComputer—49嵌套过程举例Non-LeafProcedureExampleMIPScode: fact:

addi$sp,$sp,-8#adjuststackfor2items

sw$ra,4($sp)#savereturnaddress

sw$a0,0($sp)#saveargument(存参数)

slti$t0,$a0,1#testforn<1

beq$t0,$zero,L1

addi$v0,$zero,1#ifso,resultis1

addi$sp,$sp,8#pop2itemsfromstack

jr$ra#andreturn

L1:addi$a0,$a0,-1#elsedecrementn

jalfact#recursivecall(递归调用)

lw$a0,0($sp)#restoreoriginaln

lw$ra,4($sp)#andreturnaddress

addi$sp,$sp,8#pop2itemsfromstack

mul$v0,$a0,$v0#multiplytogetresult

jr$ra#andreturnChapter2—Instructions:LanguageoftheComputer—50堆栈中的局部数据LocalDataontheStack局部数据有调用者分配e.g.,C自动分配变量过程帧(活动记录)被一些编译器使用控制堆栈存储Chapter2—Instructions:LanguageoftheComputer—51内存布局MemoryLayout正文:程序代码静态数据:全局变量e.g.,C语言静态变量,常数数组和字符串$gp

初始化地址,允许段内的±偏移动态数据:堆堆栈:自动存储Chapter2—Instructions:LanguageoftheComputer—52字符数据(包括汉字)字节编码的字符集ASCII:128个95graphic,33controlLatin-1:256个ASCII,+96moregraphiccharactersUnicode:32位字符集UsedinJava,C++widecharacters,…宽字符世界上大多数字母表UTF-8,UTF-16:可变长度编码§2.9CommunicatingwithPeopleChapter2—Instructions:LanguageoftheComputer—53字节/半字操作Byte/HalfwordOperations使用位操作MIPS字节/半字读取/存储字符串处理是较常用的方式lbrt,offset(rs)lh

rt,offset(rs)Signextendto32bitsinrtlbu

rt,offset(rs)lhu

rt,offset(rs)Zeroextendto32bitsinrtsb

rt,offset(rs)sh

rt,offset(rs)存储恰恰是字节或半子的形式Chapter2—Instructions:LanguageoftheComputer—54字符串拷贝举例StringCopyExampleCcode(naïve):非终止字符串Null-terminatedstring

voidstrcpy(charx[],chary[])

{inti;

i=0;

while((x[i]=y[i])!=‘\0’)

i+=1;

}假定x,y基地址在$a0,$a1中;i在$s0中。Chapter2—Instructions:LanguageoftheComputer—55字符串拷贝StringCopyExampleMIPScode:

strcpy:

addi$sp,$sp,-4#为保存i调整堆栈指针,

sw$s0,0($sp)#把i送栈中【i在$s0中】add$s0,$zero,$zero#将i置“0”,【i=0+0】

L1:add$t1,$s0,$a1#addrofy[i]in$t1

lbu$t2,0($t1)#$t2=y[i]

add$t3,$s0,$a0#addrofx[i]in$t3

sb$t2,0($t3)#x[i]=y[i]

beq$t2,$zero,L2#exitloopify[i]==0

addi$s0,$s0,1#i=i+1

jL1#nextiterationofloop

L2:lw$s0,0($sp)#restoresaved$s0

addi$sp,$sp,4#pop1itemfromstack

jr$ra#andreturn假定x,y基地址在$a0,$a1中,i在$s0中Chapter2—Instructions:LanguageoftheComputer—56000000000011110100000000

0000

000032位常数32-bitConstants大部分常数都比较小,16位表示立即数足够了,偶尔使用32位常数。

lui

rt,constant取立即数并放到高16位lui$s0,

6100000000011111010000100100000000ori$s0,$s0,2304§2.10MIPSAddressingfor32-BitImmediatesandAddressesOri立即数或,$s0与常数2304“或”,结果放在$s0形成一个32位的常数Chapter2—Instructions:LanguageoftheComputer—57分支地址BranchAddressing分支指令说明操作吗,两个寄存器,两个地址大多数跳转目标离跳出的位置较近向前或向后oprsrtconstantoraddress6bits5bits5bits16bitsPC相对寻址目标地址=PC+offset×4此时PC的增加量是4的倍数Chapter2—Instructions:LanguageoftheComputer—58跳转地址JumpAddressing跳转(j和jal)的目标地址可以在代码段的任何位置指令除op外,指令其它字段都是地址opaddress6bits26bits直接跳转到地址Targetaddress=PC31…28:(address×4)28位4位Chapter2—Instructions:LanguageoftheComputer—59目标地址TargetAddressingExample早期例子的循环代码设循环的起始地址是8000Loop:

sll$t1,$s3,2800000019920add$t1,$t1,$s68000409229032

lw$t0,0($t1)8000835980

bne$t0,$s5,Exit8001258212

addi$s3,$s3,180016819191jLoop80020220000Exit:…80024Chapter2—Instructions:LanguageoftheComputer—60远程分支BranchingFarAway如果跳转对象地址太大无法用16位的偏移表示,汇编将重写代码【把短跳转(216范围)变成长跳转(226

范围)】Example

beq$s0,$s1,L1 ↓

bne$s0,$s1,L2

jL1

L2: …Chapter2—Instructions:LanguageoftheComputer—61地址模式总结AddressingModeSummaryChapter2—Instructions:LanguageoftheComputer—622.11并行与指令:同步处理器共享存储器同一区域P1写,P2读(任务1写的结果是任务2要读取得值)如果P1和P2不同步,将发生数据竞争结果由访问次序决定依赖硬件提供同步指令(例如:lock和unlock指令,控制一个“互斥区”)多核处理器的情况下:任务1Sw$t0,0($s0)任务2Lw$t1,0($s0)此时,任务2和任务1必须同步,否则,无法判断$t1中读取的是$t0,还是0($s0)单元以前的数值。§2.11ParallelismandInstructions:SynchronizationChapter2—Instructions:LanguageoftheComputer—632.11并行与指令:同步原子读/写内存操作在读和写之间,不再允许对该空间的其他操作可以是单一的指令例如寄存器和内存之间的原子交换或者指令的原子配对§2.11ParallelismandInstructions:SynchronizationChapter2—Instructions:LanguageoftheComputer—64MIPS中的同步SynchronizationinMIPS

链接取数(Loadlinked)ll

rt,offset(rs)条件存数(Storeconditional)sc

rt,offset(rs)如果ll指令没改变该地址内容则成功,rt返回1;如果被改变了,则失败,rt返回0;例如:atomicswap(检测和设置锁变量)try:add$t0,$zero,$s4;copyexchangevalue

ll$t1,0($s1);loadlinkedsc$t0,0($s1);storeconditional

beq$t0,$zero,try;branchstorefailsadd$s4,$zero,$t1;putloadvaluein$s4Chapter2—Instructions:LanguageoftheComputer—65编译并执行程序TranslationandStartup许多编译器直接产生目标模块静态链接§2.12TranslatingandStartingaProgramChapter2—Instructions:LanguageoftheComputer—66汇编伪指令AssemblerPseudoInstructions大多数汇编指令和机器指令是一对一的特殊的是伪指令伪指令:汇编指令的变种move$t0,$t1

add$t0,$zero,$t1

blt$t0,$t1,L → slt$at,$t0,$t1

bne$at,$zero,L$at(register1):

汇编程序的临时寄存器(使用汇编语言时候的硬件额外的开销)Chapter2—Instructions:LanguageoftheComputer—67生成目标模块ProducinganObjectModule汇编器(或编译器)把程序翻译成机器语言提供从部分构建完整程序的信息

目标文件头:描述目标文件其他部分的大小和位置正文段:翻译后的指令,包含机器语言代码静态数据段:包含在程序生命周期内分配的数据重定位信息,标记了一些程序加载进内存时依赖于绝对地址的指令和数据符号表,全局定义和外部引用调试信息:用于关联源文件Chapter2—Instructions:LanguageoftheComputer—68链接目标模块LinkingObjectModules产生一个可执行的映像1.

合并段(代码和数据数据库象征性放入内存)2.

决定数据和指令标签的地址3.

修补引用(内部和外部引用)可以留下依靠重定位程序修复的部分但虚拟内存,不需要做这些虚拟内存空间,程序必须以绝对地址装入Chapter2—Instructions:LanguageoftheComputer—69加载程序LoadingaProgram把待执行的程序从硬盘的镜像文件读入内存1.

读取可执行文件头来确定正文段和数据段的大小2.为正文和数据创建一个足够大的地址空间3.

把指令和初始数据拷贝到内存或者设置页表项,使它们可用4.

把主程序的参数复制到栈顶5.

初始化寄存器(包括堆栈指针$sp,帧指针$fp,全局指针$gp

)6.

跳转到启动进程复制参数到寄存器并调用主函数main主函数返回时,通过系统调用exit终止程序Chapter2—Instructions:LanguageoftheComputer—70动态链接库DynamicLinking调用时,只是连接或装入库文件过程代码重定位;避免所有程序中出现的链接库;但是这些库的信息是一次性代入内存,占用内存空间。只是在用到的时候才链接该库;自动装入最新的编译器中的版本的动态库。Chapter2—Instructions:LanguageoftheComputer—71晚过程连接LazyLinkage

(只是在用到的时候才链接该库)IndirectiontableStub:LoadsroutineID,

Jumptolinker/loaderLinker/loadercodeDynamically

mappedcodeChapter2—Instructions:LanguageoftheComputer—72启动一个Java程序StartingJavaApplicationsSimpleportableinstructionsetfortheJVMInterpretsbytecodesCompilesbytecodesof“hot”methodsintonativecodeforhostmachineChapter2—Instructions:LanguageoftheComputer—73CSortExample使用汇编指令的冒泡排序(交换内存中两个位置所存的值)Swapprocedure(leaf) voidswap(intv[],intk)

{

inttemp;

temp=v[k];

v[k]=v[k+1];

v[k+1]=temp;

}vin$a0,kin$a1,tempin$t0§2.13ACSortExampletoPutItAllTogetherChapter2—Instructions:LanguageoftheComputer—74Swap过程TheProcedureSwapswap:sll$t1,$a1,2#$t1=k*4(按照字节编址)add$t1,$a0,$t1#$t1=v+(k*4)#(addressofv[k])

lw$t0,0($t1)#$t0(temp)=v[k]

lw$t2,4($t1)#$t2=v[k+1]

sw$t2,0($t1)#v[k]=$t2(v[k+1])

sw$t0,4($t1)#v[k+1]=$t0(temp)

jr$ra#returntocallingroutineC代码(按照字编址)MIPS代码(按照字节编址)1、为程序变量分配寄存器;【vin$a0,kin$a1,tempin$t0】2、为过程体生成汇编代码;3、保存过程调用间的寄存器(本例中没有用到,因为本例是一个叶过程);Chapter2—Instructions:LanguageoftheComputer—75编译优化的影响EffectofCompilerOptimization1、编译时间2、指令数;3、时钟周期4、CPI5、算法执行时间是准确衡量程序性能的唯一标准Chapter2—Instructions:LanguageoftheComputer—76经验教训LessonsLearnt单独的指令数或CPI不能很好的描述性能编译器优化对算法敏感对比Java虚拟机解释Java/JIT编译代码已经足够快了某些情况要对编译完C进行优化没什么能修复一个垃圾算法Chapter2—Instructions:LanguageoftheComputer—77数组和指针【简单介绍】数组下标计算包括下标乘以元素长度加上数组基址指针直接对应内存能避免下标计算的麻烦§2.14ArraysversusPointersChapter2—Instructions:LanguageoftheComputer—78例子:数组和指针实现ClearingExample:ClearingandArrayclear1(intarray[],intsize)【使用下标】{

inti;for(i=0;i<size;i+=1)

array[i]=0;}clear2(int*array,intsize)【使用指针】{

int*p;for(p=&array[0];p<&array[size];p=p+1)*p=0;}move$t0,$zero#i=0loop1:sll$t1,$t0,2#$t1=i*4add$t2,$a0,$t1#$t2=#&array[i]

sw$zero,0($t2)#array[i]=0

addi$t0,$t0,1#i=i+1

slt$t3,$t0,$a1#$t3=#(i<size)

bne$t3,$zero,loop1#if(…)

#gotoloop1move$t0,$a0

#p=&array[0]

sll$t1,$a1,2#$t1=size*4add$t2,$a0,$t1#$t2=#&array[size]loop2:

sw$zero,0($t0)#Memory[p]=0

addi$t0,$t0,4#p=p+4

slt$t3,$t0,$t2#$t3=#(p<&array[size])

bne$t3,$zero,loop2#if(…)#gotoloop2Chapter2—Instructions:LanguageoftheComputer—79数组与指针的比较乘指令长度的操作变成移位操作下标计算用i的自增操作相对于而后者增加指针编译器可以获得和手动使用指针相同的效果引导变量删除可以使程序更清晰,更安全Chapter2—Instructions:LanguageoftheComputer—80ARM&MIPS相似之处ARM:最流行的嵌入式处理机基本指令集和MIPS类似§2.16RealStuff:ARMInstructionsARMMIPS发布时间19851985指令大小32bits32bits寻址空间(大小,模式)32-bitflat32-bitflat数据对齐AlignedAligned数据寻址方式93数据寄存器(个数,模式,大小)15×32-bit31×32-bitInput/outputMemorymapped【存储器映射】Memorymapped【存储器映射】ARM寄存器37寄存器31个通用32位寄存器,包括程序计数器PC未分组寄器R0-R7分组寄存器R8-R14程序计数器PC(R15)6个状态寄存器15通用寄存器

(R0toR14),以及1或者2个状态寄存器和程序计数器在任何时候都是可以访问的ARM即AdvancedRISCMachines的缩写。1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生,由美国加州SanJoseVLSI技术公司制造。20世纪80年代后期,ARM很快开发成Acorn的台式机产品,形成英国的计算机教育基础。1990年成立了AdvancedRISCMachinesLimited。20世纪90年代,ARM32位嵌人式RISC(ReducedInstructionSetComputer)处理器扩展到世界范围,占据了低功耗、低成本和高性能的嵌入式系统应用领域的领先地位。32位RISC处理器受到青睐,领先的是ARM嵌入式微处理器系列。ARM公司虽然只成立10多年,但在1999年因移动电话火爆市场,其32位RISC处理器占市场份额超过了50%,2001年初,ARM公司的32位RISC处理器市场占有率超过了75%。ARM公司是知识产权供应商,是设计公司。由合作伙伴公司来生产各具特色的芯片。

ARM的发展历程-1ARM公司商业模式的强大之处在于其价格合理,全世界范围有超过100个合作伙伴--包括半导体工业的著名公司。ARM公司专注于设计,其内核耗电少、成本低、功能强,特有16/32位双指令集。ARM已成为移动通信、手持计算、多媒体数字消费等嵌入式解决方案的RISC标准。

在所有ARM处理器系列中,ARM7处理器系列应用最广,采用ARM7处理器作为内核生产芯片的公司最多。ARM的发展历程-21991-ARM推出第一款RISC嵌入式微处理器核ARM61993-ARM推出

ARM7核1995–ARM的

Thumb扩展指令集结构为16位系统增加了32位的性能,提供业界领先的代码密度ARM处理器的3大特点如下:小体积、低功耗、成本低、高性能;16位/32位双指令集;全球众多的合作伙伴。当前ARM体系结构的扩充包括:Thumb:16位指令集,用以改善代码密度;DSP:用于DSP应用的算术运算指令集;Jazeller:允许直接执行Java代码的扩充。ARM处理器系列提供的解决方案包括:在无线、消费电子和图像应用方面的开放平台;存储、自动化、工业和网络应用的嵌入式实时系统;智能卡和SIM卡的安全应用。ARM处理器的特点ARM微处理器微处理器核:ARM6,ARM7,ARM9,ARM10,ARM11扩展:Thumb,DSP,SIMD,Jazelleetc.ARM体系结构版本

-1Version1(obsolete)基本数据处理字节,字以及多字load/store软件中断26bit地址总线Version2(obsolete)Multiply&Multiply-accumulate支持协处理器支持线程同步26bit地址总线ARM体系结构版本

-2V3版本推出32位寻址能力,结构扩展变化为T—16位压缩指令集M—增强型乘法器,产生全64位结果(32X3264or32X32+6464)V4版本增加了半字load和store指令V5版本改进了ARM和Thumb之间的交互,结构扩展变化为:E---增强型DSP指令集,包括全部算法操作和16位乘法操作J----支持新的JAVA,提供字节代码执行的硬件和优化软件加速功能体系结构变化

–1*THUMB指令集

(‘T’)THUMB指令集:32位ARM指令集的子集,按16位指令重新编码代码尺寸小

(upto40%compression)简化设计体系结构变化

-2长乘法指令

(‘M’)32x32=64bit.提供全64位结果增强DSP指令集

(‘E’)可附加在ARM中的DSP指令64bit转换在v5版本中第一次推出处理器内核的变化D:在片调试.处理器可响应调试暂停请求I:EmbeddedICE.支持片上断点调试体系结构变化

-3ARMDSP指令集对于音频DSP应用提供高达70%的处理速度Jazelle(即时加速)提供比基于软件的JAVA虚拟机(JVM)更高的性能

与非JAVA加速核相比,提供8倍JAVA加速性能和降低80%的功耗139字节码直接在硬件上执行,88个字节码在软件上执行Chapter2—Instructions:LanguageoftheComputer—92ARM中的比较和分支CompareandBranchinARM一个算术/逻辑指令,使用条件码表示结果Negative(负),zero(零),Carry(进位),overflow(溢出)比较指令,设置条件码不保留结果每条指令都有一个可选的执行条件指令字的高4位:条件值可以取代仅为了跳过一条指令的分支指令Chapter2—Instructions:LanguageoftheComputer—93指令编码InstructionEncoding2.16.1ARM和MIPS的寻址方式寻址方式ARMMIPS寄存器操作数XX立即数操作数XX寄存器+偏移(转移或基地址)XX寄存器+寄存器(下标)X-寄存器+寄存器倍乘X-寄存器+偏移和更新寄存器X-寄存器+寄存器和更新寄存器X-自增,自减X-相对PC数据X-Chapter2—Instructions:LanguageoftheComputer—95TheIntelx86指令集向前兼容的演变过程8080(1974):8-bitmicroprocessor累加器,8个寄存器组对8086(1978):16-bitextensionto8080(CISC)复杂指令系统8087(1980):浮点协同处理器添加了浮点指令寄存器堆栈80286(1982):24-bitaddresses,MMU内存管理单元(MemoryManagementUnit);基于段的内存映射和保护80386(1985):32-bitextension(nowIA-32)(IntelArchitecture)新的寻址方式和额外的操作增加了对页的支持并提供了段寻址§2.17RealStuff:x86InstructionsChapter2—Instructions:LanguageoftheComputer—96TheIntelx86ISA(Instruction

SetArchitecture)进一步发展…i486(1989):流水线,芯片缓冲和FPUpipelined,on-chipcachesandFPU(FloatPointUnit)兼容其它品牌,例如:AMD,Cyrix,…Pentium(1993):superscalar,64-bitdatapath超标量LaterversionsaddedMMX(Multi-MediaeXtension)instructionsTheinfamousFDIVbug臭名昭著的浮点除法错误。PentiumPro(1995),PentiumII(1997)Newmicroarchitecture(seeColwell,ThePentiumChronicles)PentiumIII(1999)AddedSSE(StreamingSIMDExtensions)andassociatedregisters关联寄存器,sse是对mmx的一个改进。Pentium4(2001)Newmicroarchitecture新微架构AddedSSE2instructionsChapter2—Instructions:LanguageoftheComputer—97TheIntelx86ISA(Instruction

SetArchitecture)进一步发展…PentiumPro(1995),PentiumII(1997)Newmicroarchitecture

(seeColwell,ThePentiumChronicles)PentiumII为英特尔推出的一枚X86架构的处理器,基于PentiumPro使用的P6微处理架构,但另一方面它的16位元处理能力获得优化,并加入MMX指令集:第一代PentiumII核心代号为Klamath,使用350纳米制程,以及,就当时而言,制造出一个非常高的热量。推出时,时脉只有233及266MHz,使用66MHz前端总线,后期另推出时脉300MHz的版本第二代PentiumII核心代号为Deschutes,运行时脉为333MHz,于1998年1月推出,使用250纳米制程,而且温度亦有效的减低。支援100MHz前端总线,英特尔于1998年另外推出了时脉为266、330、350、400、450的PentiumII处理器。基于PentiumII的电脑系统亦加入了新世代的内存标准——SDRAM〔替代EDORAM〕,以及AGP显卡。与Pentium及PentiumPro处理器不同,PentiumII使用一种插槽式设计。处理器芯片与其他相关芯片皆在一块类似子卡的电路板上,而电路板上有一块塑胶盖,有时亦有一风扇。PentiumII亦把L2放到这电路板上,但只运行处理器时脉一半的速度。此举增加处理器的良率,从而减低制作成本。这个方法亦可更容易改变PentiumII处理器的L2,可以使英特尔用相同的芯片,但可制作廉价低效能处理器,也可制贵价高效能处理器。PentiumII的入门级处理器,为减少了L2〔甚至取消L2〕的Celeron。由于它低效能,所以一般的专业人士都不使用Celeron处理器,但因为它的可超性〔L2比处理器芯片对时脉敏感〕,它亦有一定的市场。PentiumII的高阶处理器,为PentiumIIXeon。它针对服务器设计,而且有一个全速的L2。它分别有512KB、1MB、2MB的版本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论