华拓科技网
您的当前位置:首页以前的汇编语言期中试题及答案

以前的汇编语言期中试题及答案

来源:华拓科技网
期中试题答案

1.请写出8086CPU内部的16位寄存器的名称和各自的功能?(本题10分) 程序可见的寄存器分为通用寄存器、专用寄存器、段寄存器3类。通用寄存器包括数据寄存器(AX、BX、CX、DX)、变址寄存器(SI、DI)、指针寄存器(SP、BP),专用寄存器包括指令指针寄存器(IP)和标志寄存器(FLAGS),段寄存器包括代码段寄存器(CS)、数据段寄存器(DS)、堆栈段寄存器(SS)、附加段寄存器(ES)。

1.通用寄存器

(1)数据寄存器

AX(Accumulator)寄存器称为累加器。用途:它是算数运算的主要寄存器,在乘、除(MUL、IMUL、DIV、IDIV)指令中用来隐含地提供被乘数或被除数和存储结果;在扩展指令(CBW、CWD)中隐含地提供被扩展的操作数;在DOD和BIOS功能调用中,用AH存储指定调用功能号,AL存储指定调用子功能号;另外在所有的I/O指令(IN、OUT)中都使用这一寄存器和外部设备传送信息等。所以累加器(AX)使用频度最高,主要用于算术、逻辑运算以及与外设传送信息等。

BX(Base Register)寄存器称为基址寄存器。用途:它可以作为普通的通用寄存器来使用,除此之外它常用来存储某一内存单元的偏移地址或偏移地址的一部分,偏移地址又叫有效地址或基地址,这也正是该寄存器名字的由来。它是4个16位数据寄存器中唯一一个能够用来存储存储器偏移地址的寄存器。

CX(Count Register)寄存器称为计数器。用途:一般在循环(LOOP)或串重复操作(REP、REPE、REPNE)等指令中用它作为的隐含计数器,控制指令重复循环的次数;在位操作(SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR)中,当移多位时,要用CL寄存器来存放移位的位数。

DX(Data Register)寄存器称为数据寄存器。用途:在16位机器中进行32位的算术运算时常用把DX和AX组合在一起存放双字数据,其中AX用来存放双字数据中的低字,而DX用来存放双字数据的高字,该双字可以表示成DX:AX;在进行乘、除运算时,它可作为默认的操作数参与运算和存储运算结果,在I/O指令中当外设端口地址大于255时,必须将外设端口地址存储到DX寄存器中,然后指令采用间接的寻址方式执行指令。

(2)变址寄存器

SI寄存器和DI寄存器称为变址寄存器(Index Register),它们是16位的寄存器,不能分成8位寄存器。变址寄存器除了可以当做普通的通用寄存器外,主要用途是用于存储某个存储单元的偏移地址或偏移地址的一部分。

SI(Source Index)寄存器称为源变址寄存器,DI(Destination Index)寄存器称为目的变址寄存器。在字符串处理指令(MOVS、STOS、LODS、CMPS、SCAS)中,它们的主要用途是SI寄存器用来存储源字符串中字符所存储内存单元的偏移

试题A总9页第1页

汇编语言程序设计

地址,DI寄存器用来存储目的字符串中字符所存储内存单元的偏移地址,并且在执行过程中SI和DI都具有自动增量或减量的功能,无需人工干预。

(3)指针寄存器

BP和SP寄存器称为指针寄存器(Pointer Register),它们同样是16位的寄存器,也不能分成8位寄存器。指针寄存器除了可以当做普通的通用寄存器外,它们的主要用途:是用于存放堆栈内存储单元的偏移地址。

SP(Stack Pointer)寄存器称为堆栈指针寄存器,它的主要用途是用于存储当前堆栈中栈顶元素的偏移地址,入栈(PUSH)和出栈(POP)指令会自动修改它的值,从而实现访问堆栈中栈顶元素,用它可直接存取堆栈中的数据,该寄存器的内容机器自动修改,无需人工干预,也属于一个专用的寄存器。

BP (Base Pointer)为基址指针寄存器,它的主要用途是用于存储堆栈中某一存储单元的偏移地址,从而实现访问堆栈中非栈顶数据。

通用寄存器可用于暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些规定的特殊用途。

2.专用寄存器

指令指针寄存器(IP)和标志寄存器(FLAGS),在汇编语言程序中不能直接引用寄存器名,寄存器的内容是由机器自动修改或根据指令执行的结果进行自动设置,不允许用户对它干预。

(1)指令指针寄存器

IP(Instruction Pointer)称为指令指针寄存器。它的功能是存储下一条将要从主存中取出指令的偏移地址,也就是预取指令在内存中存储单元的偏移地址。在目标程序运行时,它始终指向下一条将要执行的指令,控制器一旦取得这条指令马上就修改IP寄存器的值,使它指向当前执行指令的下一条指令的偏移地址,IP寄存器的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令(LOOP等)、子程序调用指令(CALL)等。

(2)FLAGS寄存器

FLAGS寄存器称为标志寄存器,又称为程序状态寄存器(Program status word,PSW),用来反映程序运行时CPU的状态信息,这个寄存器有6个状态(条件)标志位和3个控制标志位,某些指令执行后会对该寄存器的标志位产生影响。图2-17给出了16位标志寄存器的内容,图中没有标明的位暂时未用。

15

14

13

12

11 OF

10 DF

IF 9

TF 8

SF 7

ZF 6

5

AF 4

3

PF 2

1

CF 0

图2-15 标志寄存器

1)状态标志位

状态标志位用来记录程序运行结果的状态信息,根据许多指令的执行结果CPU都将相应地自动设置它的值。由于这些状态信息往往作为后续条件转移指令的转移控制条件,所以又称为条件标志位。它包括CF、PF、AF、ZF、SF和OF共6位。

试题A总9页第2页

汇编语言程序设计

标志寄存器的第1位是进位标志CF(Carry Flag),主要用来反映运算结果是否向最高位产生进位(加法)或借位(减法)。如果运算结果的最高位产生了一个进位或借位时,CF位的值被置为1,否则CF位值为0。

标志寄存器的第2位是奇偶标志位PF(Parity Flag),用来为机器中传送信息时可能产生的代码出错情况提供检验条件,在数据传送过程中,如果采用奇偶校验的方法来提高数据传送的可靠性,就可使用该标志位。

当运算结果的低8位中1的个数是0个或偶数个的时候,PF位的值被置为1,否则PF位值为0。注意,奇偶标志位PF的值只与运算结果的低8位有关,无论运算结果是多少位的。

标志寄存器的第4位是辅助进位标志AF(Auxiliary Carry Flag),当进行算数运算时低4位向高4位进位(加法)或借位(减法)时,AF位的值被置为1,否则AF位的值为0。这个标志主要由处理器内部使用,用于十进制算术运算指令中,用户一般不必关心。

标志寄存器的第6位是零标志位ZF(Zero Flag),当运算结果等于0时,ZF位的值被置为1,否则ZF位值为0。在判断运算结果是否为0时,可使用此标志位。

标志寄存器的第7位是符号标志SF位(Sign Flag),用来记录运算结果的符号位,有符号数据利用最高有效位表示数据的符号,当运算结果为负数,即运算结果的最高位有效位为1时,SF位的值被置为1,否则SF位的值为0。在微机系统中,有符号数采用补码表示,SF位反映运算结果的正负号,运算结果为负数时,SF位的值被置为1,否则SF位的值为0。

标志寄存器的第11位是溢出标志位OF(Overflow Flag);用于反映有符号数加减运算所得结果是否溢出。若算术运算的结果有溢出,OF的值被置为1,否则,OF的值为0。

其中CF和OF标志位本质上都是表示溢出,CF表示无符号数溢出,即运算结果超过了无符号数的表数范围,OF表示有符号数溢出,即运算结果超过了有符号数的表数范围。

以上6个状态标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

2)控制标志位

控制标志位是用来控制处理器执行指令的方式,它包括TF、DF、IF共3个控制标志位,汇编中有专门的指令来改变他们的值。

标志寄存器的第8位是陷阱标志位TF(Trap Flag),又称跟踪标志位(Trace Flag)或称单步标志位,当TF位被置为1时,CPU进入单步执行方式,即执行完一条指令,便产生一个编号为1的内部中断,这种内部中断称为单步中断。这种方式主要用于程序的调试。CPU指令系统中没有专门的指令来改变陷阱标志位TF的值,但程序员可用其它办法来改变其值。在Debug调试程序中,可以用T命令使程序单步运行,可逐一检查各寄存器、存储器的内容,当调试成功后让TF=0,CPU正常工作不产生单步中断。利用单步中断可对程序进行逐条指令的调试。这种逐条

试题A总9页第3页

汇编语言程序设计

指令调试程序的方法就是单步调试。

标志寄存器的第9位是中断允许标志位IF(Interrupt-enable Flag),用来决定CPU是否响应CPU外部的可屏蔽中断(INTR)发出的中断请求。当IF位的值为1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求,当IF位的值为0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。注意:IF标志位决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求,而不是决定CPU响应外部的不可屏蔽中断所发出的中断请求,所以不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。CPU的指令系统中有专门的指令来改变标志位IF的值。CLI指令复位中断标志使IF=0,STI指令置位中断标志使IF=1。

标志寄存器的第10位是方向标志DF(Direction Flag),用来决定在串操作指令执行时有关指针寄存器(SI、DI)发生调整的方向。用于串操作指令中,控制地址的变化方向,设置DF=0,串操作的存储器地址自动增加;设置DF=1,串操作的存储器地址自动减少。在微机的指令系统中,也提供了专门的指令来改变标志位DF的值。CLD指令复位方向标志使DF=0,STD指令置位方向标志使DF=1。

3.段寄存器

CS寄存器(Code Segment Register),代码段寄存器,CS寄存器的用途是存放代码段的段地址。CS寄存器的内容是当前正在执行的代码段的段地址。

SS寄存器(Stack Segment Register),堆栈段寄存器,SS寄存器的用途是存放堆栈段的段地址。SS寄存器的内容是当前要访问的堆栈数据所在堆栈段的段地址。

DS寄存器(Data Segment Register),数据段寄存器,DS寄存器的用途是存放数据段的段地址。CS寄存器的内容当前要访问的数据所在数据段的段地址。

ES寄存器(Extra Segment Register),附加段寄存器,ES寄存器的用途是存放附加段的段地址。CS寄存器的内容是当前要访问的数据所在附加段的段地址。

2.请写出内存单元地址、内存单元内容、字内存单元地址、字内存单元内容、访存规则、逻辑段如何划分、逻辑地址、物理地址、逻辑地址如何转换成物理地址的概念?(本题10分)

1.内存单元地址

存储单元地址(内存单元地址)也称为物理地址是指为了CPU能够正确地存取存储单元信息,80X86计算机给每个字节存储单元规定一个唯一的编号来标识这个存储单元,存储单元的唯一的编号就是该内存单元的地址,用无符号数表示,地址从0开始,线性加1。为了书写方便通常用十六进制表示。

2.内存单元内容

存储单元内容(内存单元内容)是指该存储单元中存放的信息。存储单元用地址标识,用“(„)”表示地址“„”内存单元的内容。例如,(12000H)=45H,表示地址是12000H内存单元的内容是45H。

3.字存储单元地址、内容和访存规则

试题A总9页第4页

汇编语言程序设计

80X86计算机采用被称作“小端对齐”的方案,即(1)地址采用它们的低地址来表示该内存单元地址;(2)访存规则是:低字节在低地址单元,高字节在高地址单元,也就是“低低高高”的规则。所以,一个字存储单元是由内存中连续的两个字节组成,它的地址是两个字节内存单元的低地址,它的内容是按照“低低高高”的访存规则,访问的连续的两个字节内存单元的内容。例如,(12000H)字节=45H,(12001H)字节=23H,所以(12000H)字=2345H。

4.逻辑段划分规则

逻辑段划分规则是:逻辑段的起始地址必须是小段的首地址(16的倍数,即20位物理地址的最低4位必须全是0,用十六进制表示最低1位是0);逻辑段的大小是0B~KB范围内的任意字节。逻辑段是在编写汇编程序是划分的,段的实际大小是该段翻译成机器代码装入内存实际占用的字节数,不超过KB就行,具体占用内存的那片内存空间由操作系统决定。

5.逻辑地址和物理地址

在1MB的内存空间里,每一个字节存储单元都有一个唯一的20位地址,这个地址就是存储单元的物理地址(Physical Address,简称PA)。

逻辑段内每个内存单元地址需要用16位数据表示,这个16的地址我们把它称为逻辑地址(Logical Address)。逻辑地址应该由两部分组成一部分是段地址,令一部分是偏移地址。它的书写形式是:

段地址:偏移地址

段地址是逻辑段起始地址(小段首地址)的高16位;偏移地址是逻辑段内的某个内存单元地址可以用相对于段起始地址的偏移量(位移量)来表示,以字节为基本单位,用EA表示。

6.逻辑地址转换成物理地址 逻辑地址转换成物理地址计算公式: 物理地址=段地址×10H+偏移地址 用符号表示如下: PA=SA×10H+EA

3.请写出与数据有关的7种寻址方式的书写格式和寻找操作数的过程?(本题10分)

立即寻址方式 书写格式:n 寻找操作时的过程:指令代码的一部分。 寄存器寻址方 式书写格式:R 寻找操作时的过程:寄存器的内容 存储器寻址方式:(1)直接寻址方式 书写格式:[n]或变量名或[变量名] 寻找操作时的过程:操作数内存单元的偏移地址EA=n或变量名代表的内存单元地址,默认的段是数据段,物理地址PA=(DS)*16d+EA,操作数是该内存单元的内容

试题A总9页第5页

汇编语言程序设计

(2)寄存器间接寻址方式 书写格式:[R] 寻找操作时的过程:操作数内存单元的偏移地址EA=(R),除了使用BP寄存器默认的段是数据段,物理地址PA=(DS)*16d+EA,如果使用BP默认的段是堆栈段,物理地址PA=(SS)*16d+EA,操作数是该内存单元的内容。

(3)寄存器相对寻址方式 书写格式:X[R]或[X+R] 寻找操作时的过程:操作数内存单元的偏移地址EA=X+(R),除了使用BP寄存器默认的段是数据段,物理地址PA=(DS)*16d+EA,如果使用BP默认的段是堆栈段,物理地址PA=(SS)*16d+EA,操作数是该内存单元的内容。

(4)基址变址寻址方式 书写格式:[BR][IR]或[BR+IR] 寻找操作时的过程:操作数内存单元的偏移地址EA=(BR)+(IR),除了使用BP寄存器默认的段是数据段,物理地址PA=(DS)*16d+EA,如果使用BP默认的段是堆栈段,物理地址PA=(SS)*16d+EA,操作数是该内存单元的内容。

(5)相对基址变址寻址方式 书写格式:X[BR][IR]或X[BR+IR]或 [X+BR+IR] 寻找操作时的过程:操作数内存单元的偏移地址EA=(BR)+(IR)+X,除了使用BP寄存器默认的段是数据段,物理地址PA=(DS)*16d+EA,如果使用BP默认的段是堆栈段,物理地址PA=(SS)*16d+EA,操作数是该内存单元的内容。

4.从内存物理地址10000H处开始的4个字节单元存放的数据依次是01H、02H、03H、04H,问物理地址10000H处的字节、字和双字单元的内容分别是什么并画出内存示意图?(本题10分) 答:

10000H 01H 10001H 02H 10002H 03H 10003H 04H [10000H]字节= 01H [10000H] 字= 0201H

[10000H] 双字=0403 0201H

5.在实模式下,逻辑地址2F3E:1020H对应的物理地址是多少?同一物理地址还有其他逻辑地址吗?试举例说明。(本题10分)

答:物理地址=30400H

同一物理地址还有其他逻辑地址:

2F3E:1020H 2F3F:1010H

试题A总9页第6页

汇编语言程序设计

2F40:1000H 2F41:0FF0H „ „

6.完成下面运算,并说明运算后标志寄存器6个条件标志位的值是什么? (1)86H+7AH (2)AC34H+B0A7H (3)23H-4CH (4)862AH-5936H(本题10分)

答:

(1)86H+7AH=00H CF=1;PF=1;AF=1;ZF=1;SF=0;OF=0; (2)AC34H+B0A7H=5CDBH CF=1;PF=1;AF=0;ZF=0;SF=0;OF=1; (3)23H-4CH=D7H CF=1;PF=1;AF=1;ZF=0;SF=1;OF=0; (4)862AH-5936H=2CF4H CF=0;PF=0;AF=0;ZF=0;SF=0;OF=1;

7.说明下列指令中源操作数的寻址方式。(X1为内存变量,VALUE为常量) 答:

(1)MOV AX,100 ; 立即寻址 (2)MOV AX,[BX][SI];基址变址寻址 (3)MOV AX, BX ;寄存器寻址

(4)MOV CX,VALUE[BX] ;寄存器相对寻址 (5)MOV EBX,ES:[1000H] ;直接寻址 (6)MOV BX,[BP];寄存器间接寻址 (7)MOV AX,X1;直接寻址

(8)MOV AX,VALUE[BX][DI] ;相对基址变址寻址 (9)MOV AX, [BX];寄存器间接寻址 (10)MOV AX, [0100H] ;直接寻址 (本题10分)

8.试说明下列指令执行完后,寄存器AX的内容。已知(DS)=1000H,(BX)=2100H,(SI)=02H,(DI)=01H,(ES)=(SS)=2000H,(BP)=2000H,(12000H)=11H,(12001H)=12H,(12100H)=10H,(12101H)=30H,(12102H)=50H,(12103H)=70H,(12104H)=90H,(22000H)=20H,(22001H)=40H,(22002H)=60H,常量VALUE=01H。

试题A总9页第7页

汇编语言程序设计

答:

(1)MOV AX,2000H;(AX)=2000H (2)MOV AX,BX;(AX)=(BX)=2100H

(3)MOV AX,[2102H]; (AX)=(12102H)=7050H (4)MOV AX,[BX];(AX)=(12100H)=3010H (5)MOV AX,[BX+01H] ;(AX)=(12101H)=5030H (6)MOV AX,[BX][SI];(AX)=(12102H)=7050H (7)MOV AX,[BP][DI];(AX)=(22001H)=6040H (8)MOV AX,DS:[BP];(AX)=(12000H)=1211H (9)MOV AX,VALUE[BX][SI] ;(AX)=(12103H)=9070H (10)MOV AX,[2000H] ;(AX)=(12000H)=1211H (本题10分)

9.判断下列指令是正确还是错误,错误的请说明原因 答:

(1)MOV DS,1000H ;×立即数不能传送到段寄存器 (2)MOV 1000H,AX;×立即数不能作目的操作数 (3)MOV AH,BX;×类型不匹配

(4)ADD AX,[CX] ;×CX寄存器不能用来存放偏移地址

(5)MOV AX,[BX][BP];×基址变址寻址方式不能同时是基址寄存器 (6)MOV CS,BX;×CS不能作为目的操作数 (7)MOV CL,300 ;×类型不匹配 (8)MOV DS,CS;×不能同时为段寄存器 (9)PUSH AL;×栈操作只能以字为计本单位

(10)MOV [BX],[SI] ;×两个操作数不能同时为存储器操作数 (本题10分)

10.请用一条指令完成如下功能? 答:

(1)请将100传送到AX寄存器中。 MOV AX,100

(2)请将100H传送到地址是table的内存单元中。 MOV TABLE,100H

试题A总9页第8页

汇编语言程序设计

(3)请将地址是table的内存单元地址传送到BX寄存器中。 LEA BX,TABLE

(4)将AX寄存器内容传送的BX寄存器中。 MOV BX,AX

(5)请将字内存单元内容保存到堆栈的栈顶,字内存单元用基址变址寻址方式,基址寄存器用BX变址寄存器用SI。

PUSH [BX+SI]

(6)请将堆栈的栈顶数据取出保存到字内存单元,字内存单元用寄存器间接寻址方式,寄存器用BX。

POP [BX]

(7)请将字内存单元内容传送到CX寄存器中,字内存单元用相对基址变址寻址方式,基址寄存器用BX变址寄存器用DI,位移量用table。

MOV CX,[TABLE+BX+DI]

(8)请将DS寄存器内容传送到ES寄存器。 MOV AX,DS MOV ES,AX

(9)请将地址是2000H内存单元内容保存到al寄存器中。 MOV AL,[2000H]

(10)请将附加段内地址是2000H内存单元内容保存到DX寄存器中。 MOV DX,ES:[2000H] (本题10分)

试题A总9页第9页

因篇幅问题不能全部显示,请点此查看更多更全内容