版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十一章汇编语言汇编语言目的使程序设计的用户友
比机器语言更强同样能使程序员详细的控制计算机能够执行的指令在汇编语言程序执行之前,必须被翻译成适合于期望执行的那台特定计算机的ISA的程序翻译程序被称为汇编器翻译过程被称为汇编DLX汇编语言注释以分号开头汇编语言指令被翻译成DLX的机器语言指令伪操作程序员为翻译程序给出的有助于翻译过程的消息对10个整数求和的程序x0000600A2#10,
#3,
#4,
#6,
#8,
#-2,
#45,
#5,
#8,#94main:.text.globaladdiaddiaddix40000000mainr1,
r0,
numbersr3,
r0,
#0r2,
r0,#10;R3清零,它将包含和;R2包含整数个数01
;;对10个整数求和的程序。;;10个整数及累加和.data.alignnumbers:
.wordsum:
.space09
;0A ;初始化0B0C0D0E0F10
;11;循环计算12again:beqzr2,exit13lwr4,0(r1)14addr3,r3,
r415addir1,r1,
#4;R1下一个整数地址16subir2,r2,
#117jagain18exit:swsum(r0),
r3191ª;程序结束trap#0汇编语言指令四个部分标记
操作码
操作数
;注释标记和注释是可选的指令不区分大小写
格式,即单词之间和行之间的空格数量不会改变程序的意义操作码和操作数操作码:对应于DLX指令的操作码的符号名操作数寄存器0到31使用R0,R1,…,R31来表示立即数必须包含一个表明该数的基的符号使用“#”表示十进制,用“x”表示十六进制,用“b”表示二进制如果不使用表示基的符号,代表该立即数是一个十进制数立即数也可以使用标记来指示,标记代表了一个数据的地址算术/逻辑运算指令除LHI指令外,操作数的数目均为3个I-类型汇编指令格式OPCODE
DR,
SR1,
ImmR-类型汇编指令格式OPCODE
DR,
SR1,
SR2LHI指令格式LHI DR,Imm示例ADDIR3,R0,#0;R3=0ADDIR1,R0,numbersnumbers,标记,代表了07行的10个整数的起始地址将此地址的值赋给R1(因为R0总是0)注意:DLX的立即数是16位补码整数,其范围是-
215~215-1示例ADDLHIR3,
R3,
R4R1,
A是将地址A的高16位值赋给R1如,A代表地址的是x300001A0,那么,R1的值就是x30000000数据传送指令-load加载指令汇编格式LW/LB
DR,Imm(SR1)立即数也可以使用标记来指示LW R4,
0(R1)基址寄存器为R1,偏移量是0读出的数值被加载到寄存器R4中数据传送指令-store指令汇编格式SW/SB Imm(SR1)
,
DR立即数也可以使用标记来指示SW sum(R0),
R3sum,标记,代表了08行的32位整数的地址将R3的值
到sum所标识的地址中(此处基址寄存器使用R0,为0)边界对齐字的边界必须对齐LW和SW指令“基址寄存器+偏移量”得到的地址必须是4的倍数这个地址是要
(LW)或存放(SW)的数据的起始地址控制指令-1条件分支指令格式OPCODE SR1,
LABEL标记,标识条件分支指令的目标BEQZ R2,
exit如果R2中的值为0,则下一条要执行的指令为被exit标识的指令控制指令-2J指令格式OPCODE
LABELJ
again下一条被执行的指令就是被again标识的指令JR指令格式OPCODE
SR1控制指令-3TRAP指令格式TRAPTRAPImm#0立即数为十进制数0,表示中断程序的执行标记用来明确的标识
单元的符号名标记命名由字母(即字母表中的大、小写字母)、数字及下划线组成以字母表中的字母、下划线或$开头以冒号结尾指令操作码属于保留字,不能用做标记例如,NOW:,_21:,R2D:和$3PO:标记使用标记表示
单元的原因该单元为某个分支指令或J指令的目标again:
BEQZ
R2,exit当执行17行的指令“Jagain”后,将执行被again标识的指令exit:
SW sum(R0),
R3该单元包含的是某个被加载或
的值例如07行中的number:和08行中的sum:,分别被0D和18行使用如果某个单元在程序中未被
,不需要为它设一个标记边界对齐DLX要求字的边界必须对齐如果被加载或
的是一个32位的字,该标记所代表的地址必须是4的倍数注释分号表示该行的分号后面的部分是注释如果分号是某行的第一个非空字符,那么整行都被忽略如果分号位于一条指令的操作数之后,那么,只有注释被汇编器忽略目的:提高可读性用来解释一条或一组指令的非直观上的表象在代码行中恰当的使用空格,使程序更具可读性,更易于被理解格式空格:将程序对齐,从而更易读例如,所有操作码都开始于页面中的相同的列伪操作DLX汇编器输入:使用DLX汇编语言写的计算机程序处理:翻译输出:DLX的ISA程序伪操作有助于汇编器实现该任务“伪”不是在程序执行过程中被执行的操作,只是在汇编过程中,为了帮助汇编器工作而发给汇编器的信息以“点”作为第一个字符数据区/代码区一个DLX汇编语言程序包括指令和数据两个部分器中的不同区域数据和指令被加载到数据区代码区位于DLX
器的不同空间数据区器的数据区的某个.data
address告诉汇编器将DLX数据放在地方“.data
x0000600A”表示数据起始于单元x0000
600A边界对齐x0000600A不是4的倍数,所以不能以该地址作为字的起始地址为了确保这一点,可以在标记出现之前,使用伪操作.align.align
n将下面的数据或代码加载到以n个0结尾的地址中“.align
2”表示被加载的地址的末尾有2个0被加载的数据将从地址x0000
600C开始在数据区数据数据可以是32位的字、8位的字节或字符串使用.word、.space、.ascii、.asciiz和.byte等伪操作表示如何在数据区
这些数据.word
word1,
word2,...将字1、字2、……
在连续的
单元中.byte
byte1,
byte2,...在连续的单元之中将字节1、字节2、…….ascii
"string1","..."将字符串1、字符串2、……
于
器中.asciiz
"string1",
"..."与.ascii类似,只是在每一个字符串末尾,一个字节0示例例如,代码片段.data.asciizx30000000“
o,World!”汇编器把x3000
0000到x3000
000D初始化为以下值:x3000
0000:
x48x3000
0001:
x65x3000
0002:
x6Cx3000
0003:
x6Cx3000
0004:
x6Fx3000
0005:
x2Cx3000
0006:
x20x3000
0007:
x57x3000
0008:
x6Fx3000
0009:
x72x3000
000A:
x6Cx3000
000B:
x64x3000
000C:
x21x3000
000D:
x00预留空间.space
size告诉汇编器在数据区中留出一定数目的连续的存储单元。实际的数目就是size个字节在操作数的实际值未知时特别有用例如,08行的“.space
4”就表示将留出x00006034~x00006037这4个单元,以保存计算出来的累加和代码区器的代码区的某个.text
address告诉汇编器将DLX指令放在地方.text
x40000000表示程序起始于单元x40000000.global多个文件组成的汇编语言程序.global
label该标记是全局的使得以后加载的其他文件也可以使用此标记先执行哪一个文件?执行从标记为main:的指令开始,而main应该是全局的标记只有一个文件的程序从标记main:处开始执行.align数据区的字的边界必须对齐代码区的每条指令的起始地址也必须是4的倍数为了确保这一点,有时需要使用.align操作示例:文档加密01
;;用于对文档进行加密的程序。注:数据区在另一个汇编语言程序文件中;判断是否需要加密的字符由键盘输入。;是否加密的结果显示在显示器上。;06.textx0400000007.globalmain08main:trapx06;R4获取输入的字符090A;初始化subir4,
r4,
x30;R4为数值n0Blhir3,
x1000;R3是字符的指针0Clbr1,
0(r3);R1取得下一个字符0D;0E;检验字符,否到达文件的末尾0F;10TEST:
seqi r2,
r1,
#4;检验EOT11bnez r2,
OUTPUT;如果完成,准备输出12;13;根据字符值进行加密14;15addi r5,
r0,
#12716sub r5,
r5,
r417slt r2,
r1,
r5;检验是否小于127-n18bnez r2,
ADDN;如果小于127-n,执行加n19subi r5,
r5,
#331A1Bsub r1,
r1,
r5j
GETCHAR;如果不小于127-n,减94-n1CADDN:
add r1,
r1,
r41D;1E20;从文档中取得下一个字符;21GETCHAR:
sb0(r3),
r1
;
R122addir3,
r3,
#1;指针加123lbr1,
0(r3);R1取得下一个检验的字符24jTEST25;26;输出结果27;28OUTPUT:addir4,
r0,
x59292Atraptrapx07x00;显示R4中的“Y”;停止机器汇编过程在一个DLX汇编语言程序被执行前,它首先必须被翻译成机器语言程序DLX汇编器的工作将一个汇编语言程序文件翻译成一个由DLXISA中的0和1组成的文件扫描过程在汇编语言程序的指令和机器语言程序的指令之间:“一一对应”以对10个整数求和为例从顶部开始,抛弃掉01到04行——注释到05行,伪操作.data,告诉汇编器,该程序的数据起始于地址x0000
600A到06行,伪操作.align,告诉汇编器,下面的数据或指令起始于地址x0000
600C到07行,伪操作.word,将十个十进制整数依次翻译为二进制补码整数08行,伪操作.space,告诉汇编器,在10个整数之后,保留4个单元抛弃掉09和0A行0B行,伪操作.text,告诉汇编器,该程序的指令起始于地址x4000
00000C行,伪操作,表明main是一个全局标记0D行,是一条指令不幸的是,因为不知道符号地址numbers的意思,所以无法翻译。汇编过程失败。“两趟”扫描汇编过程需要对整个汇编语言程序进行“两趟”完整的扫描“第一趟”扫描:标识出符号地址(或标记)对应的实际的二进制地址建立符号表“第二趟”扫描:把各条汇编语言指令翻译成相应的机器语言指令第一趟扫描抛弃掉01到04行的注释在05行,数据将被分配到以地址x0000600A开头的空间,用地址计数器LC(LocationCounter)记录地址,地址计数器被初始化为
x0000
600A06行,LC改变为x0000
600C07行,遇到标记numbers:,在符号表中增加一条且LC的值增加40,即改变为x0000
6034符号地址numbersx0000
600C08行,遇到标记sum:,产生符号表的一条
如下:LC的值改变为x0000
6038抛弃掉09和0A行在0B行,代码将被分配到以地址x40000000开头的空间中,LC的值将改变为x4000
00000C行,标明main是全局标记,LC不改变0D行,遇到main:,产生一条记录如下:LC加4,改变为x4000
0004……sumx0000
6034……mainx4000
0000……每遇到一条指令,LC就增加4在12行遇到again:,在18行遇到exit:,依次产生的符号表记录为:……againx4000
000Cexitx4000
0024第二趟扫描在符号表的帮助下,再次遍历汇编语言程序。汇编语言指令被翻译成DLX机器语言指令。从顶部开始,抛弃掉01到04行05行,.data伪操作,初始化LC为x0000
600A06行,将LC改变为x0000
600C07行,将10个整数依次翻译为二进制补码整数,
LC改变为x0000
603408行,留下4个单元,LC增加4,为x0000
6038抛弃掉09和0A行0B行,.text伪操作将LC改变为x4000
00000C行,伪操作,LC不变0D行,翻译指令是ADDI,操作码是000001目标寄存器(DR)是R1,即00001源寄存器(SR1)是R0,即00000立即数是标记numbers,即x0000
600C(符号表)x4000
0000~x4000
0003就被设置成0000010000000001
0110
0000
0000
1100LC被增加为x4000
00040E和0F行,可直接翻译,分别位于x4000
0004和x4000
0008开头的单元中。在每一步,LC加4。0F行结束后,LC被增加为x4000
000C12行,翻译BEQZ操作码是101000,SR1是R2,即00010已知exit是地址x40000024的标记,该指令的偏移量的计算:增加了4的PC是LC+4,x4000
000C+4,即x4000
0010所以偏移量是x0014(即x4000
0024-x4000
0010)x4000
000C~
x4000
000F就被设置成10100000010
00000
0000
0000
0001
0100LC被递加为x4000
0010……立即数是标记如果05行(
订正)改为“.data
x3000000A”,那么标记numbers就和x3000000C存在对应关系而x3000000C无法用16位的立即数来表示的。如何解决这个问题?addi“addi
r1,r0,numbers”根据符号表中numbers和x3000
000C的对应关系(问题即,如何将R1的值设为x3000000C?),翻译为如下两条指令:LHIADDIR1,x3000R1,
R1,
x000C;
R1=x3000
0000;
R1=x3000
000Csw“sw
sum(r0),r3”(问题即,如何将Rx+Offset的值设为x30000034?)可以翻译为如下2条指令:LHI
R5,
x3000SW x0034
(R5),
R3;sum和x3000
0034存在对应关系可执行映像当计算机开始一个程序的执行时,被执行的实体叫做可执行映像可执行映像可以由不同的程序员创造出来的模块形成每一个模块都分别被翻译成一个目标文件有些模块可能是用C语言写的,通过C语言的编译器翻译为目标文件有些模块是用户写的有些模块是由操作系统提供的库程序每一个目标文件都是由使用的计算机的ISA中的指令和相关的数据组成最后把所有目标文件
在一起成为一个可执行映像汇编语言程序模块1汇编器目标文件编译器目标文件链接器可执行映像C语言程序模块1汇编语言程序模块2汇编器目标文件编译器目标文件C语言程序模块2库程序问题1“文档加密”程序是一个模块,该模块只进行计算,不包括文档数据并且,文档起始地址也不是x10000000数据是由一个“数据输入”模块得到的,在数据输入模块中使用标记docs:标明一个
单元将输入的数据
于以该单元开头的一段空间之中.extern加密模块,使用来自外部文件的标记docs,必须使用伪操作.extern…….externaddidocsr3,r0,docs……在汇编“加密模块”时,汇编器无法实现完全汇编因为不知道docs代表的地址但是不报错,因为.extern表明该标记是合法的.global数据输入模块,必须使用“.global”,将docs注明为全局标记…….global.spacedocs#100docs:……在汇编“数据输入模块”时,汇编器生成包含
docs标记的符号表,且此标记可以被其他模块所使用器在器,管理“结合”过程的程序时,结合所有的模块使用数据输入模块的符号表中的docs项,完成“加密模块”的翻译问题2如果数据输入模块也使用“.textx04000000”将程序指令放到以x0400
0000开头的
单元之中,而加密模块也占用了这段空间,如何处理?器由器来完成为每个模块重新分配所占用的空间“.textaddress”中的“地址”实际上是无意义的,因为器将重新分配重新分配内存后,各模块符号表中的地址项也会相应发生变化,器还要根据新的符号表,最终完成翻译工作,即得到一个可执行映像实践DLX汇编语言规定,伪操作.text和.data中的地址是可选的对于伪操作“.text”和“.data”来说,通常不必给出具体地址DLX模拟器附IVDLX套件.ppt测试和调试可以计算所有整数乘法的程序?使用-6和3,4和-12,-5和-7做初始值使用这些测试集存在一个问题:忽略了最重要的初始值——0要点:对于一个可以运行的程序,它必须能对所有的值运行好的测试:用那些不寻常的值进行初始化,那是程序员可能没有考虑的值。这些值通常被称为“
状况”单元内是否例1:判断一段连续的包含一个5检查从地址x3000
0000
开始
的10个整数中是否包含5,只要有1个5,就把R1设置为1,如果一个5都没有则使R1为0。地址3126252120x4000
000000000100000000010000
0000
0000
0001R11x4000
000400000100000000100000
0000
0000
1010R310x4000
000800110000000001000011
0000
0000
0000R4首地址x4000
000C01110000100000100000
0000
0000
0000R2M[R4]x4000
001001010000010001010000
0000
0000
0101R2?=5x4000
001410100100101000000000
0000
0001
0100BNEZx4000
001800000100100001000000
0000
0000
0100R4
R4+4x4000
001C00001100011000110000
0000
0000
0001R3
R3-1x4000
002001110000100000100000
0000
0000
0000R2M[R4]x4000
002410100100010000001111
1111
1110
1000BNEZx4000
002800000100000000010000
0000
0000
0000R10x4000
002C110000000000
00000000
0000
0000
0000HALT使用如下样本数据:1,2,3,0,5,6,7,8,9,10,运行这个程序,程序结束时R1等于0如何调试?例2:找到一个字中的第一个“1”检查一个
于x30000000~x30000003中的整数,找出被设为1的第一位(从左到右),而且把那一位的位置
到R1中,如果没有任何一位被设为1,这段程序就把-1
到R
中。地址x4000
0000x4000
0004x4000
0008x4000
000Cx4000
0010x4000
0014x4000
0018x4000
001Cx4000
0020x4000
0024x4000
002800000100000000010000
0000
0001
111100110000000001000011
0000
0000
000001110000100000100000
0000
0000
000001000000010000110000
0000
0000
000010100100011000000000
0000
0001
010000001100001000010000
0000
0000
000100110100010000100000
0000
0000
000101000000010000110000
0000
0000
000010100100011000000000
0000
0000
0100101100111111
1111
1111
1111
1110
1100110000000000
0000
0000
0000
0000
0000R131R4首地址R2M[R4]R2<0?BNEZR1
R1-1R2左移1位R2<0?BNEZJ
x4000
0014HALT使用数据x00000000来运行这段程序时,无法停止如何调试?调试与C语言程序类似模块化程序设计,从大任务到小任务不同:
的是指令序列的执行,以及每条指令执行后得到的结果调试操作与C语言的源水平调试器不同从机器指令集结构水平上,完成一些基本的交互式调试与C语言的源水平调试器类似模拟器也提供了断点、观察点、单步和显示值等功能,包括:在
器和寄存器中设置值顺序地执行一个程序中的指令能够按照期望停止执行在程序中的任何地方,检查器和寄存器中的内容调试程序片段:使用加法指令实现乘法运算将分别来自于R4和R5的两个正数做乘法运算地址3126252120x4000
000000000100000000100000
0000
0000
0000R20x4000
000400000000010001000001000000000001R2R2+R4x4000
000800001100101001010000
0000
0000
0001R5
R5-1x4000
000C01000000101000110000
0000
0000
0000R5<0?x4000
001010100000011000001111
1111
1111
0000BEQZR3x4000
0014110000000000
0000
0000
0000
0000
0000HALT1、使用“设置值”命令,在R4中设置10,R5中为3;运行程序,结果R2=40?2、通过单步调试,
程序;3、使用断点
程序。结果PCR2R3R4R5x4000
00000103x4000
000410103x4000
000810102x4000000C100102x4000
0010100102x4000
0004200102x4000
0008200101x4000000C200101x4000
0010200101x4000
0004300101x4000
0008300100x4000000C300100x4000
0010300100x4000
0004400100x4000
000840010-1x4000000C40110-1x4000
001040110-1PCR2R3R4R5x4000
0010100102x4000
0010200101x4000
0010300100x4000
001040110-1更正把x4000
000C~x4000
000F31
26
25
21
20的指令替换为或删除x4000
0010
~x4000
0013行的指令,将
x4000
000C
~x4000
000F行的指令改为:01001000101000110000
0000
0000
0000地址X4000
000CR5<=0?10100100101000001111
1111
1111
0100地址x4000000C31
26
25
21
20BNEZ
R5例1调试PCR1R2R3R4x4000
0024129x3000
0004x4000
0024138x3000
0008x4000
0024107x3000
000C例1:使用断点
程序在x4000
0024处设断点,检查每次循环的结果的指令中的R2更正:把x4000
0024
~x4000
0027替换为R310100100011000001111
1111
1110
1000地址X4000
002431
26
25
21
20BNEZ例1分析按照结构化程序设计(do-while循环)循环体遇到R2==5时,可跳出循环break;BNEZ条件分支指令开始初始化:R1<-1R3<-10R4<-x30000000R2<-M[R4]R2?=5取下一个字符:R4<-R4+4R2<-M[R4]R3<-R3-1否R3?=0是结束否R1<-0是例2调试例2:使用断点
程序在x40000024处设断点,检查每次循环的结果31,30,……,0,-1,-2,…PCR1x4000
002431x4000
002430x4000
002429…
……
…x4000
00243x4000
00242x4000
00241x4000
00240x4000
0024-1x4000
0024-2x4000
0024-3x4000
0024-4…
……
…例2分析按照结构化程序设计(while循环)测试条件:R2<=0开始初始化:R1<-31R4<-x30000000R2<-M[R4]R2<=0否R1<-R1-1R2<-R2<<1结束是C语言程序到DLX汇编语言编译器接受C程序代码,并将它们转化成能被底层硬件执行的机器代码C-DLX编译器必须把程序可能包含的任何运算翻译成DLX指令集中的指令——假如DLX只有很少的运算指令,这显然不是一件容易的工作z
=
x
*y;x、y和z是局部变量,且均为无符号整数假设寄存器R16包含的是变量
x的值,R17为变量y,R18为变量z在本章的示例中,将变量分配给寄存器R16~R23,将寄存器R8~R15和R24、R25用于
临时产生的值注:R16最后值为0,这是有问题的addir18,
r0,
#0;z
=
0sltr8,
r16,
r17;x<y?,R8为临时变量bnezr8,
loopxorr16,
r16,
r17;交换x和y的值xorr17,
r16,
r17xorr16,
r16,
r17loop:addr18,r18,r17;z=z
+
ysubir16,r16,#1;x=x
-
1bnezr16,loop;x>0if语句if(x
==
1)y
=
5;假设x和y被
为局部整数变量假设R16包含x的值,R17包含y的值seqir8,
r16,
#1;x==1?,R8为临时变量beqzr8,not_true;如果条件不为真,;那么跳过赋值addir17,
r0,
#5;y=
5not_true:......;程序的其余部分......if-else语句假设x、y和z被
为局部整数变量假设R16包含x的值,R17包含y的值,R18包含z的值if
(x){y++;z--;}else
{y--;z++;}beqz r16,
else;如果x等于0;执行else部分;
y++;;z--;else:r17,r17,#1r18,
r18,#1doner17,
r17,#1r18,r18,#1done:addisubijsubiaddi...
...;
y--;;
z++;;程序;其余部分...
...while语句假设R16包含i的值int
i
=
0;while
(i
<
10)
{printf
("%d",
i);i
=
i
+
1;}addir16,
r0,#0;i
=
0;;
while
(i
<
10)loop:
sltibeqzr8,
r16,r8,
done#10;;进
试,R8临时变量i不小于10;循环体...
...;调用函数printf的代码...
...addir16,
r16,#1;i
=
i
+
1jloop;再重复一次done
: ...
...;程序的其余部分for语句假设R16包含x的值,R17包含sum的值int
x;int
sum
=
0;for
(x
=
0;
x
<
10;
x++)sum
=
sum
+
x;addir17,
r0,#0;sum
=
0;;初始化addir16,
r0,#0;初始化(x=0);测试loop:sltibeqzr8,
r16,r8,
done#10;;进
试,R8为临时变量x不小于10;循环体addr17,
r17,r16;sum
=
sum
+
x;重新初始化addir16,
r16,#1;x++jloopdone
:...
...;程序的其余部分总结高级语言支持选择结构和循环结构,但是实现这些结构的计算机底层指令都是条件分支指令寄存器的比器快得多,而且DLX算术/逻辑运算指令也是对寄存器进行运算在计算机中执行时,应尽量多的使用寄存器总结变量个数多于寄存器数目时,需要使用器编译器应尽量将最常用的变量保存在寄存器中,而将不常用的变量放到
器中为了实现寄存器和
器之间的变量交换,需要使用一种被称为“栈”的
结构,将变量的值于
器之中栈——一种抽象数据类型栈是一种
结构,可以通过许多不同的方式来实现栈的概念与其实现无关栈的概念是说明它如何被存入栈的东西首先被取出后进先出(Last
In,规则和特点,其定义是最后Out),LIFO,栈的存取在计算机程序设计语言中,栈是抽象数据类型的一个例子抽象数据类型是一类
机制,这种机制是由对它执行的操作所定义的,而不是实现它的方式PUSH/POP当把一个元素
栈的时候,称之为压栈(push)当移出一个元素时,称之为出栈(pop)例子洗盘子,后进先出每洗净一个盘子,就放到另一个已经洗好的盘子上面,放成一摞取盘子时,则是从这摞盘子中一个接一个的向下拿最后摆放上去的盘子是最先要拿走的硬件栈由一定数量的寄存器组成,每个寄存器可以存储一个元素当每个元素被存入或取出时,已经在栈里的元素会移动空:是
空:否
空:否栈顶10栈顶1026-3栈顶1026空:否栈顶(a)
初始状态(b)
1次压栈后(c)
3次压栈后(d)
1次出栈后在器中实现栈由一组
单元和被称为“栈指针”的机制组成栈指针指示了这个栈的栈顶,包含最后压入的元单元地素的址已经在栈中的数据不会进行物理移动栈顶x4000
0000R29x3FFFFFECx3FFFFFF0x3FFFFFF4x3FFFFFF8x3FFFFFFC10栈顶x3FFFFFFCR29(a)
初始状态(b)
1次压栈后栈顶-32610x3FFFFFF4R29-32610栈顶x3FFFFFF8R29(c)
3次压栈后(d)
1次出栈后x3FFFFFECx3FFFFFF0x3FFFFFF4x3FFFFFF8x3FFFFFFCx3FFFFFF0x3FFFFFF4x3FFFFFF8x3FFFFFFCx3FFFFFECx3FFFFFECx3FFFFFF0x3FFFFFF4x3FFFFFF8x3FFFFFFC控制器的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 未来五年新形势下妇女卫生用品超市行业顺势崛起战略制定与实施分析研究报告
- 未来五年灯盏花制剂行业市场营销创新战略制定与实施分析研究报告
- 未来五年出租车市场需求变化趋势与商业创新机遇分析研究报告
- 2026广西柳州市残疾人劳动就业服务中心招聘2人建设考试参考试题及答案解析
- 2026河南南阳油田总医院招聘建设考试参考题库及答案解析
- 2026上海市普陀区卫生健康系统事业单位招聘卫生专业技术人员(社会人员)167人建设笔试备考题库及答案解析
- 2026贵州毕节黔西市钟山镇卫生院招聘陶家坝卫生室村医1人建设考试备考题库及答案解析
- 2026中智广西人力资源服务有限公司招聘4人建设笔试模拟试题及答案解析
- 2026宁夏吴忠市人民医院自主招聘事业单位人员49人建设考试备考题库及答案解析
- 2026湖南娄底市教育局直属事业单位高层次和急需紧缺人才招聘66人建设笔试参考题库及答案解析
- 【《发动机气缸体的加工工艺分析及专用夹具设计》14000字(论文)】
- 书香教师读书分享
- 五年(2021-2025)高考地理真题分类汇编:专题15 中国地理和世界地理(全国)(原卷版)
- 行车工考试题库及答案
- 2025年数字媒体编辑创作师技能测评试卷及答案解析
- 2025年凉山州中考语文试题答案解析卷
- 夜间生产管理办法
- 《智慧物流概论》试卷及答案 共2套
- 肿瘤患者的心理护理和人文关怀
- 《高效流程审核技巧》课件
- 骨灰堂管理制度
评论
0/150
提交评论