王爽《汇编语言》期末考试题库(附答案)

单选题

第一章

  1. PC机的最小信息单位是( )。

A. bit     B. 字节    C. 字长       D. 字

A PC机的最小信息单位是比特(bit),常用来表示一位二进制数字(0或1)。字节(byte)是计算机中常用的数据单位,一个字节由8个比特组成。字长(word)是指一个CPU可以一次处理的二进制数的位数。字是在汇编、编程等场合中用来表示数据长度的单位。

  1. 一个CPU的寻址能力是8KB,那么它的地址总线的宽度为( )位。

A. 8      B. 3     C. 12     D. 13

一个CPU的寻址能力是8KB,即CPU可以寻址的内存空间大小为8KB。一个字节是8位,因此8KB等于8 x 1024字节,即8192字节。CPU的地址总线宽度决定了CPU可以寻址的内存空间大小,因此,地址总线宽度为log2(8192) = 13位。因此,答案为D。

  1. 1个CPU的寻址能力为16KB,那么它的地址总线的宽度为 (   )位。

A. 11                   B. 12                   C. 13                   D. 14

一个CPU的寻址能力为16KB,即CPU可以寻址的内存空间大小为16KB。因为CPU使用地址总线来寻址内存,所以地址总线的宽度就是CPU可以寻址的最大内存空间大小的二进制位数。16KB的二进制表示为2^14,所以地址总线的宽度为14位,答案为D。

  1. 1MB的存储器的地址编号从(   )到(   )

A.0~3ff H           B. 1~400 H           C.  0~fffff H    D.  1~100000H


1MB的存储器地址编号从0到0xFFFFF H,因为1MB等于1024KB,而1KB等于1024字节,所以1MB等于1024 x 1024字节,即1,048,576字节。每个字节需要一个地址编号,因此1MB的存储器地址编号从0到1,048,575,用16进制表示即为0x00000到0xFFFFF H。选项A、B、D的地址范围都小于1MB,不符合实际情况。

  1. 1TB是 (  ) 个Byte。

A. 2^40     B. 2^30      C. 2^20               D. 2^10

1TB是1万亿字节(10^12 bytes),而1个字节是8位(即1 byte = 8 bits),因此1TB等于8 x 10^12 bits。在计算机中,2的幂次方是常用的计量单位,因此将8 x 10^12 bits转换为2的幂次方,可以得到1TB等于2^40 bytes。因此,答案是A. 2^40。

  1. 1MB是(   ) 个Byte。

A. 2^40      B. 2^30      C. 2^20     D. 2^10

1MB是指1兆字节,其中1兆等于2的20次方,即2^20,因此1MB等于2^20个Byte,答案为C。

  1. 1KB的存储器的地址编号从(   )到(   )

A. 0~3ff H                   B. 1~400 H          C.  0~fffff H           D.  1~100000H

1KB的存储器共有1024个存储单元,每个存储单元占用1个字节,因此总共有1024个地址编号。由于地址编号是从0开始的,因此该存储器的地址编号从0到1023,用十六进制表示为0x000到0x3FF。因此,选项A是正确的答案。选项B、C、D的地址编号范围都超出了1KB存储器的地址编号范围。

  1. 1KB的存储器的可以存储(    )个bit

A. 1024                B. 8×1024                  C. 1000               D. 8000 

1KB的存储器可以存储1024个字节,1个字节等于8个bit,因此1KB的存储器可以存储1024×8=8192个bit。因此,答案为B 。

  1. 1GB是 (  B ) 个Byte。

A. 2^40     B. 2^30      C. 2^20               D. 2^10

1GB是2的30次方Byte,即2^30 Byte。因为1GB等于1024MB,1MB等于1024KB,1KB等于1024Byte,所以1GB等于1024*1024*1024 Byte,即2^30 Byte。

  1. 8086的数据总线宽度为16根,从内存中读取20字节的数据,8086至少要读 (   )次。

A. 16                   B. 20           C. 10                   D. 5

8086的数据总线宽度为16根,每次可以传输16位数据,即2个字节。要读取20字节的数据,需要进行10次读取,每次读取2个字节。因此,答案为C. 10。

  1. 8386的数据总线宽度为32根。从内存中读取20字节的数据,8386至少要读 (   )次。

A. 32                   B. 20           C. 10                   D. 5

8386的数据总线宽度为32根,每次可以传输32位(4字节)的数据。要读取20字节的数据,需要进行5次传输,即 20字节 ÷ 4字节/次 = 5次。因此,答案为D。

  1. 在存储器中,数据和程序以_______形式存放。

A. 二进制          B. 八进制          C. 十进制          D. 十六进制

A 在存储器中,数据和程序通常以二进制形式存放。这是因为计算机中的所有数据和指令都是以二进制形式表示的,即由0和1组成的二进制数。计算机的存储器只能存储二进制数,因此数据和程序都需要以二进制形式存储在存储器中。虽然在编程中也可以使用其他进制表示数据和指令,但最终都需要转换为二进制形式才能在计算机中执行。因此,二进制是计算机中最基本的数制。

  1. 8086CPU的地址总线的宽度是20位,数据总线的宽度是16位,则8086CPU的寻址能力为(   )。

A.64KB     B.1MB     C.1GB      D.不确定

B 8086CPU的地址总线宽度为20位,可以寻址的地址数量为2的20次方,即1MB。

  1. 80386CPU的地址总线宽度为32根,80386CPU的寻址能力是(   )。

A.64KB    B.1024KB   C.16MB      D.4096MB

 80386CPU的地址总线宽度为32根,可以寻址的物理地址空间大小为2的32次方,即4GB。因此,80386CPU的寻址能力为D. 4096MB。

  1. 从内存中读取1024个字节的数据,80386CPU至少需要读256次,则80386的数据总线宽度为(   )位。

A.4       B.8     C.16      D.32

 80386 CPU 的数据总线宽度为 32 位。 

从内存中读取 1024 个字节的数据,每次读取的数据宽度为 1 字节,因此需要读取 1024 次。 

80386 CPU 的数据总线宽度为 32 位,每次可以传输 4 个字节,因此每次可以读取 4 个字节的数据。所以,需要读取 1024 次,即需要传输 1024 * 1 字节的数据,共计 1024 * 1 / 4 = 256 次。

  1. 8086中,一个字单元可以存储(   )个bit。

A.1    B.8    C.16     D.32

 8086是16位处理器,一个字单元可以存储16个bit,因此答案是C.16。

  1. 一个1KB的存储器包含多少个存储单元?可以存储多少个二进制位?(   )

A. 1024,1024    B. 8192,1024     C. 8192,8192     D. 1024,8192

一个1KB的存储器包含1024个存储单元,因为1KB等于1024字节。每个字节由8个二进制位组成,因此一个1KB的存储器可以存储8 x 1024 = 8192个二进制位。因此,答案是选项D,即一个1KB的存储器包含1024个存储单元,可以存储8192个二进制位。

2~3

  1. 在Debug中,用“d 075A:110  11F”查看内存,结果如下:

075A:0110  B8  00  00  FF  07  00  B8  4C — CD  21  F3  69  20  8A  03  A1 

那么,字型数据 00B8H对应的地址为( )。

A. 076A:11    B. 076A:16       C. 076B:0        D. 无法确定

C cs+ip 075a+0110=076b,第0个

  1. 给定段地址为1234H,仅通过变化偏移地址寻址,8086CPU的寻址范围为_________(物理地址)。

A、 12340H~1234FH                    B、 01234H~F1234H          C、 12340H~2233FH            D、 12340H~FFFFFH

8086CPU中的偏移地址是一个16位的值,需要与段地址相加才能得到物理地址。因此只有通过变化偏移地址进行寻址时,物理地址的范围取决于段寄存器的值。

在这个问题中,给定的地址是1234H,仅通过变化偏移地址寻址,这意味着使用的是DS寄存器(或ES、SS、CS)作为段寄存器。因为在实模式下,段寄存器的值左移4位作为段地址,再加上偏移地址,就可得到物理。

偏移地址变化的范围为0~FFFFH,因此:

物理地址的限为12340H (段地址为1234H,加上偏移地址0H);

物理地址上限为2233FH (地址为1234H,加上偏移地址FFFFH)。

因此,选项C:12340H~2233FH是正确的。

  1. 给定段地址101H,仅通过变化偏移地址寻址,8086CPU可以寻址到地址为(  )的内存单元。 

         A. 0     B. 12000H      C. 10000H      D. 1FFFFH

C 1010+0~FFFF=1010~1100F

  1. 下列寄存器中,(   )是8位寄存器。

A、 AX               B、 BL              C、 CS             D、 DI

下列寄存器中,B. BL 是8位寄存器。

  1. 下列寄存器中,(  )是16位寄存器

A、 AX              B、 BL               C、 CH              D、 DL

下列寄存器中,A. AX 是16位寄存器。

  1. 下列说法正确的是(  )

A、 AX寄存器不能分为两个8位的寄存器

B、 BP寄存器不能分为两个8位的寄存器

C、 CS可以分为两个8位的寄存器

D、 PSW是一个通用寄存器,可以存放一般性的数据

下列说法正确的是:B

B、 BP寄存器不能分为两个8位的寄存器

BP寄存器(Base Pointer)是一个16位寄存器,不能分为两个8位的寄存器。它通常用于存储堆栈帧的基址。

A、 AX寄存器可以分为两个8位的寄存器。AX寄存器是一个16位寄存器,但可以分为AH(高位)和AL(低位)两个8位寄存器。

C、 CS寄存器不能分为两个8位的寄存器。CS寄存器(Code Segment)是一个16位寄存器,用于存储当前执行指令的代码段的起始地址。

D、 PSW(Program Status Word)并非通用寄存器,它是一种特殊的寄存器,用于存储程序的状态信息,如标志位等。它不能用于存放一般性的数据。

  1. 下面指令中,错误的指令是(    )。

A、 MOV  AX,1000                      B、 MOV  AL,BL

C、 MOV  AL,1000                     D、 MOV   DS,AX

错误的指令是:

C、 MOV AL,1000

这指令试图将立即数1000移动到AL寄存器中,但是AL是一个8位寄存器,无法容纳1000这个16位的立即数。正确的写法应该是使用合适的寄存器大小或者有效的立即数。

八位寄存器AL的取值范围是0到255(FFFF H)

  1. 下面指令中,错误的指令是(    )。

A、 MOV  AX,100               B、 MOV  BX,AL

C、 MOV  AL,100              D、 ADD  AL,BL

B MOV BX,AL 是错误的指令。由于BX是一个16位寄存器,而AL是一个8位寄存器,无法直接将AL的值移动到BX中。正确的方式应该是使用AX寄存器作为中介,将AL的值先移动到AX,再将AX的值移动到BX。

正确的指令应该是 MOV AX,AL,然后 MOV BX,AX。首先将AL的值移动到AX,然后将AX的值移动到BX

  1. 下面指令中,正确的指令是(    )。

A、 MOV  AX,100               B、 MOV  BX,AL

C、 MOV  100,AL            D、 ADD  AL,1234H

A、 MOV AX,100

这条指令将立即数100移动到AX寄存器中,这是有效的。

  1. 下面的5条指令执行后,cpu几次修改IP?( )

mov ax,2000H

mov bx,3000h

add ax,bx

sub bx,bx

jmp bx

A、 5                 B、 6                 C、 7                 D、 不确定

指令执行的过程中,CPU会不断地修改IP的值以指向下一条要执行的指令。

执行第 1 条 mov ax, 2000H 指令时,会将下一条要执行的指令地址存储在IP寄存器中,此时IP指向的地址为第2条指令的地址,即 mov bx, 3000h。

执行第 2 条 mov bx, 3000h 指令时,会将下一条要执行的指令地址存储在IP寄存器中,此时IP指向的地址为第3条指令的地址,即 add ax, bx。

执行第 3 条 add ax, bx 指令时,会将下一条要执行的指令地址存储在IP寄存器中,此时IP指向的地址为第4条指令的地址,即 sub bx, bx。

执行第 4 条 sub bx, bx 指令时,会将下一条要执行的指令地址存储在IP寄存器中,此时IP指向的地址为第5条指令的地址,即 jmp bx。

执行第 5 条 jmp bx 指令时,会将下一条要执行的指令地址存储在IP寄存器中,此时IP指向的地址为 bx 中存储的地址,即第2条指令的地址,即 mov bx, 3000h。然而此时bx的值已经为0,因此程序将会无限循环,不再修改IP的值了。

因此,执行这5条指令后,CPU会修改IP 6 次。

  1. 代码段寄存器是()

A、 CS               B、 DS               C、 SS               D、 ES

代码段寄存器是 CS(Code Segment Register),CS寄存器中存储着当前程序代码所在的段地址,用于指向CPU需要执行的程序代码段。程序从CS寄存器指向的第一条指令开始,然后按顺序执行指令直到程序结束。

  1. 指令指针寄存器是()

A、 AX              B、 BP               C、 IP                D、 DS

指令指针寄存器是 IP (Instruction Pointer)。IP寄存器中存储着下一条要执行的指令的地址。CPU执行完一条指令后,会自动去IP寄存器中读取下一条指令的地址,然后继续执行。

  1. 在debug中,查看、修改CPU的寄存器内容是(  )命令。

A、 T                 B、 A                 C、 E                 D、 R

用R命令查看、改变CPU寄存器的内容
用D命令查看内存中的内容
用E命令改写内存中的内容
用U命令将内存中的机器指令翻译成为汇编指令
用T命令执行一条机器指令
用A命令以汇编指令的格式在内存中写入一条机器指令

  1. 在debug中,查看内存中的内容是(  )命令。

A、 T                 B、 A                 C、 D                D、 R

D

  1. 在debug中,修改内存中的内容是(  )命令。

A、 T                 B、 E                 C、 D                D、 R

B

  1. 在debug中,执行CS、IP指向的内存单元处的指令是(  )命令。

A、 T                 B、 E                 C、 D                D、 R

在debug中,执行CS、IP指向的内存单元处的指令是 T 命令。T命令可以单步执行一条指令,执行完后CPU暂停,等待用户的下一个命令。当执行完当前指令后,可以用R命令查看寄存器的值,L命令查看当前指令执行后的内存状态。

  1. 存储单元45A0:7CB9H的物理地址为 (   )

A、 45AB9H               B、 4D6B9H                C、 C259H                  D、 47CB9H

假设存储单元的地址线有16根,那么物理地址应该是 `45A0H` 左移4位得到的,即 `45A00H`。加上偏移量 `7CB9H` 得到真实的物理地址为 `45A0H + 7CB9H = 4D69H`。因此,选项B `4D6B9H` 是正确的。

  1. 8086CPU中,任意时刻,CPU将( )指向的内容当作指令来执行。

A. DS、SI     B. CS、IP     C. SS、SP      D. ES、DI

B 8086CPU中,任意时刻,CPU将 CS、IP 指向的内容当作指令来执行,即指令指针寄存器 (IP) 存储下一条指令在代码段内的偏移地址,代码段寄存器 (CS) 存储代码段的基地址。CPU 从代码段基地址加上偏移地址,得到指令的物理地址,然后从内存中读取指令并执行。

  1. 下列关于Debug的说法,错误的是( )。

A. R命令可以修改寄存器的内容。     B. E命令可以修改内存单元的内容。

C. T命令每次只执行一条指令。       D. D命令可以查看内存单元的内容。

  1. 对于8086CPU,错误的指令是(   )。

A. mov ax,bx     B. mov ax,[bx]     C. mov ds,0      D. mov ax,0

对于8086CPU,错误的指令是 C. mov ds,0。在8086CPU中,DS作为一个寄存器用来存储数据段的地址,通常情况下应该将其设置为一个非零的值,而不是直接将其清零。其他三个指令都是合法的:A. mov ax,bx 表示将BX寄存器中的值拷贝到AX寄存器中;B. mov ax,[bx] 表示将BX所指定的内存单元中的值读入AX寄存器中;D. mov ax,0 表示将AX寄存器中的值清零。

  1. 以下指令执行后,寄存器ax的值为(   )。

mov ax, 0095h
mov ah, 95h
add al, ah

A. 9680H    B. 968AH     C. 962AH      D. 952AH

指令的执行过程如下:

1、将0095h赋值给AX寄存器,此时AX的值为0095h;
2、将95h赋值给AH寄存器,此时AX的值为9595h;
3、将AL寄存器和AH寄存器的值相加(95h + 95h = 12Ah),将结果存储在AL寄存器中,此时AX的值变为952Ah。

因此,选项D是正确答案。

  1. 关于8086CPU,下列说法错误的是(   )。

A. 是16位结构的CPU,其能够一次性处理传输暂时存储的信息的最大长度是16bit

B. 采用“段地址×16 + 偏移地址 = 物理地址”的方式生成存储单元的地址

C. 执行push指令和pop指令时,8086CPU从SS:SP中得到栈顶的地址

D. 在编程时,可将长度为1KB的一组地址连续,起始地址为32的倍数的内存单元当成栈空间来使用。

选项 D 中的错误在于“起始地址为32的倍数”,而实际上应该是“起始地址为16的倍数”。

在编程时,可以将一些内存单元用作堆栈空间。可以使用任何一个 16 位寄存器(如 SS)来存储堆栈的段地址,然后使用 SP 寄存器来跟踪堆栈指针。对于 8086 CPU,堆栈指针 SP 应该总是指向一个偶数地址。因此,堆栈的大小应该是偶数,并且堆栈的起始地址应该是 16 的倍数。因此,选项 D 中的“起始地址为32的倍数”是错误的。

正确的说法是:在编程时,可将长度为 1KB 的一组地址连续,起始地址为 16 的倍数的内存单元当成栈空间来使用。

  1. 此时ax的值为00C5H,执行完“add al,85H”后,ax中的值是多少?(   )

A.0158H    B.014AH    C.0058H    D.004AH

正确答案是 D,即 004AH。因为“add al,85H”指令的含义是将 al 寄存器的值加上 85H,即 al=al+85H。计算 00C5H+85H=00CAH,而 al 只是 ax 的低 8 位,因此在 ax 中保持不变的是高 8 位 ah 的值(为 00H),而低 8 位 al 的值改变为 0CAH。因此,ax 的值为 0CA00H,即 004AH

  1. 关于汇编语言中“段”的概念,以下说法错误的是(   )。

A.用mov、add、sub等指令通过偏移地址访问data段中的数据前,应将data段的段地址放在ds中。

B.一个段,可以既是数据段,又是桟段。

C.一个段,不可以既是代码段,又是数据段。

D.一个段中的内容对CPU来说是指令还是数据,关键在于对相关寄存器的设置。

C.一个段,不可以既是代码段,又是数据段。是错误的说法。

在汇编语言中,一个段可以既是数据段,也可以是代码段。但是,同一时刻一个段只能是数据段或者代码段,不能同时是两种类型。

  1. 8086PC机一个段的最大长度为(   )。

A.64Byte    B.64Kbit   C.1MB    D.64KB

 8086PC机一个段的最大长度为64KB (D)

  1. 以下关于8086CPU的栈机制的说法,错误的是(   )。

A.任意时刻,SS:SP指向栈顶元素。

B.retf指令不会引起栈空间超界。

C.push和pop实质上是一种内存传送指令。

D.8086CPU的栈机制,没有对避免栈空间超界提供支持。                  

 B 栈空间自主管理

  1. 设置10000H~1FFFFH的内存空间为栈段,初始状态栈是空的,此时,SS、SP的值是(   )。

A.SS=1000H、SP=FFFEH               B.SS=0H、SP=FFFEH

C.SS=1000H、SP=0                       D.SS=2000H、SP=0

 而栈是空的,SP应该指向栈底的下一个位置20000,  D.SS=2000H、SP=0

  1. 完成同指令XCHG AX ,BX 相同功能的指令或指令序列是(    )

A、 MOV AX,BX 

B、 MOV BX,AX 

C、 PUSH AX

POP BX

D、 MOV CX,AX 

MOV AX,BX

    MOV BX,CX 

XCHG是x86汇编语言中的一个指令,用于交换两个寄存器或内存单元的值。其作用是将两个操作数(可以是寄存器或内存单元)的值进行交换。

例如,执行指令"XCHG AX, BX"会交换AX和BX寄存器中的值。在执行该指令后,AX中包含原来BX的值,而BX中包含原来AX的值。

可以使用 MOV AX, BX 和 XCHG AX, BX 指令组合完成和 XCHG AX, BX 相同的功能,指令序列为:

MOV CX, AX MOV AX, BX MOV BX, CX

这个指令序列将 AX 和 BX 的值互换,实现了 XCHG AX, BX 相同的功能。

  1. 堆栈段段寄存器是()

A、 CS               B、 DS               C、 SS               D、 ES

 堆栈是一种数据结构,用来存储程序中的临时数据和返回地址等信息。而堆栈段(segment)是指堆栈所在段,即存放堆栈的物理内存区域。堆栈段由堆栈段地址(Segment Address)和堆栈段偏移地址(Stack Offset)组成。堆栈的段地址由堆栈段寄存器(Stack Segment Register)来存储。

因此,答案是C、SS(Stack Segment Register)。

  1. 堆栈指针寄存器是()

A、 BP              B、 SP               C、 SS               D、 IP

 堆栈指针(Stack Pointer)寄存器是用来指示当前堆栈的栈顶地址的寄存器。它指向当前堆栈顶部的下一个空闲单元。在访堆栈时,堆栈指针先减1,然后将数据压入堆栈中;在取出数据时,先从堆栈中取出数据,然后堆栈指针再加1。

因此,堆栈指针寄存器的名称是B、SP(Stack Pointer)。

  1. 执行一次PUSH指令,SP寄存器将(  )

A、 加1            B、 减1            C、 加2            D、 减2

 执行一次PUSH指令,SP寄存器将减2(D)。因为在8086CPU中,每个栈元素占用两个字节,所以在执行PUSH指令时,先将栈顶指针SP减去2,然后将数据写入到栈顶位置。

  1. 执行一次POP指令,SP寄存器将(  )

A、 加1            B、 减1            C、 加2            D、 减2

 执行一次POP指令,SP寄存器将加2(C)。因为在8086CPU中,每个栈元素占用两个字节,所以在执行POP指令时,先将栈顶元素弹出并写入到目标操作数中,然后将栈顶指针SP加上2,指向下一个栈元素。

  1. 关于8086CPU堆栈,以下说法不正确的是(    )

A、 操作对象是字                                          B、 堆栈的长度是没有限制

C、 任何时刻,SS:SP指向栈顶元素            D、 堆栈位于内存中

B  个堆栈最大只能设置为64KB

  1. 下面指令正确的是(  )

A、 POP  AX             B、 POP  126CH                C、 PUSH  AL           D、 PUSH  AX,BX

 A  

  1. 8086系统中,一个堆栈最大可以设置为多少?()

A、 1MB           B、 1KB             C、 64KB           D、 64MB

 8086系统中,一个堆栈最大只能设置为64KB,因为8086只有16位的寻址能力,每个内存地址最大只能表示64KB的内存空间,而堆栈是存储在内存中的,所以一个堆栈的大小最大只能是64KB。所以答案是C、64KB。

  1. 如果要将20000h~21001h这段空间设置为堆栈,初始状态栈是空的,应该选择程序段()。

A、MOV  SS,20000H

MOV  SP,21001H

B、MOV  AX,2000H

MOV  SS,AX

MOV  SP,1001H

C、 MOV  AX,2000H

MOV  SS,AX

MOV  SP,1002H

D、 MOV  AX,2000H

MOV  SS,AX

MOV  SP,1000H

 C SS需要用通用寄存器中转,栈空指向栈顶下一位置

  1. 设 SP初值为2000H,执行指令"PUSH AX"后,SP的值是()

A、 1FFFH                   B、1998H           C、 2002H                   D、1FFEH

PUSH指令将寄存器或内存单元中的数据压入堆栈中,同时SP的值减2,指向下一个空闲的堆栈单元。

执行指令"PUSH AX"后,将将AX寄存器的值压入堆栈中,同时SP的值减2。因此,最终SP的值应该是2000H-2=1FFEh。所以答案是D、1FFEH。

  1. 在debug中,用“d 1000:0  0f”查看内存,结果如下。

1000:0000   89 85 4C ED 38 7B F8 10 -29 8D 44 9D 3E 75 A8 20

若DS=1000H,AX=0,那么汇编指令“MOV   AL,[0008H]”执行完后AX 的值为

A、 0H         B、 2900H               C、 0029H                  D、 0010H

 在debug中,用“d 1000:0  0f”查看内存,结果如下。 1000:0000   89 85 4C ED 38 7B F8 10 -29 8D 44 9D 3E 75 A8 20

若DS=1000H,AX=0,那么汇编指令“MOV   AL,[0008H]”执行完后AX 的值为 D、 0010H。

汇编指令“MOV AL, [0008H]”是将偏移地址为0008H的数据读入AL寄存器中。由于DS=1000H,因此要访问的内存单元地址应该为DS:0008H,也就是10008H。根据给出的内存内容,可以知道10008H处存储的数值为10H,因此执行完“MOV AL, [0008H]”指令后,AL的值为10H,而AX寄存器的高位则保持不变,即为00H。

因此,AX的值为0010H。

  1. 在debug中,用“d 1000:0  0f”查看内存,结果如下。

1000:0000   89 85 4C ED 38 7B F8 10 -29 8D 44 9D 3E 75 A8 20

DS=1000H,AX=0,那么汇编指令“MOV   AX,[0008H]”执行完后AX 的值为

A、 1029H                 B、 298DH                 C、 2910H                  D、 8D29H

 C  

  1. 在debug中,用“d 1000:0  0f”查看内存,结果如下。

1000:0000   89 85 4C ED 38 7B F8 10 -29 8D 44 9D 3E 75 A8  20

1000:0010   79 87 C4 EF 25 66 F7 40 -A9 BD C4 5D 6E 7F A1 2B

1000:0020   81 15 4D ED 83 B7 8F 1A -89 7D B6 9C 3E 73 A2 21

执行前DS=0,AX=0,BX=0,那么执行下列汇编指令,完后AX 的值为(      )

MOV  AX,1002H

MOV  DS,AX

MOV  AX,[0]

A、 8589H                 B、 8779H                  C、 1581H                  D、 8985H

C  DS:IP 1000:20 

  1. 在debug中,用“d 1000:0  0f”查看内存,结果如下。

1000:0000   89 85 4C ED 38 7B F8 10 -29 8D 44 9D 3E 75 A8  20

1000:0010   79 87 C4 EF 25 66 F7 40 -A9 BD C4 5D 6E 7F A1 2B

1000:0020   81 15 4D ED 83 B7 8F 1A -89 7D B6 9C 3E 73 A2 21

执行前DS=0,AX=0,BX=0,那么执行下列汇编指令,完后AX 的值为(      )

MOV  AX,1000H

MOV  DS,AX

MOV  AX,[0]

A、 8589H                 B、 8779H                  C、 1581H                  D、 8985H

 A

  1. 有以下几条指令(debug下的指令格式):
          mov ax,1000
             mov ss,ax
             mov sp,0100
             mov ax,5CCA
             push ax
          指令“push ax”执行后,sp的值和修改的内存单元的地址是(   )。
    A. 0100H,1000H:0100H      B. 00feH,1000H:00feH    C. 0100,1000:0100    D. 98,1000:98

B sp-2

  1. 如果将10000H~1FFFFH这段内存空间当做是栈空间,假设SS=1000H,则下列说法正确的是(   )。  

A.栈空的时候,SP的值为FFFeH         B.栈满的时候,SP的值为0

C.这段栈空间的大小为4KB              D.使用这段栈空间,有可能会出现栈越界

 D. 使用这段栈空间,有可能会出现栈越界:由于栈是向下生长的,在使用栈的过程中,如果向栈中压入的数据超出了栈的大小,就会出现栈溢出(stack overflow)的情况,从而导致程序异常终止。因此,在使用这段栈空间时,有可能会出现栈越界的问题。

  1. 给定段地址为1001h,则8086CPu可以寻址到物理地址为(   )的内存单元。

A.0      B.20000H       C.10000H         D.20010H

  1. CPU传递到地址总线上的地址是(   )。

A.逻辑地址     B.偏移地址    C.物理地址     D.段地址

CPU传递到地址总线上的地址是物理地址。

在使用分段机制的8086处理器中,CPU产生的地址有两个部分,一个是段地址,另一个是偏移地址,它们通过一定的计算得出最终的物理地址。但是,当CPU需要访问内存时,会将最终得到的物理地址直接传递到地址总线上,由内存控制器根据物理地址来确定要访问的实际内存单元。因此,CPU传递到地址总线上的地址是物理地址。

  1. 关于8086CPU的几个寄存器,正确的说法是(   )。

A.可将BX当成两个8位寄存器,在偏移地址范围为0~255时,可以用“mov ax,[bl]”来实现将内存中的数据读到ax中

B.可以用“byte ptr”实现将SI当成两个8位寄存器使用

C.可将AX、BX、CX、DX当成8个8位寄存器使用

D.AX、ah、al是不同的寄存器,指令“add al,bl”的执行不会影响AX的值

B 可以用“byte ptr”实现将SI当成两个8位寄存器使用。

在x86汇编语言中,可以使用“byte ptr”、“word ptr”、“dword ptr”等关键字作为指令操作数的前缀,以确定所需访问的数据类型。因此,可以使用“byte ptr”将SI寄存器视为单独的8位寄存器来使用。

例如,在8086处理器中,MOV AL,[SI]指令可以用来从存储在DS:SI处的内存单元中读取一个字节。如果想要让SI寄存器被当作两个8位寄存器来处理,可以这样编写指令:

MOV AL, [BYTE PTR SI]
MOV AH, [BYTE PTR SI + 1]

这样就可以通过指定“BYTE PTR”前缀,让SI寄存器被视为两个独立的8位寄存器,分别对应着存储在DS:SI和DS:SI+1处的内存单元。

  1. 下列与8086CPU寻址相关的说法,错误的是(   )。

A.8086CPU有20根地址总线,它的寻址能力为1MB

B.一个物理地址可以对应多个段地址与偏移地址

C.因为段寄存器是16位,所以一个段最大为64KB

D.CPU内部有一个能合成20位地址的地址加法器

B选项与8086CPU寻址相关的说法是错误的。一个物理地址只能对应唯一的段地址与偏移地址。

A选项是正确的,8086CPU有20根地址总线,它的寻址能力为1MB。

C选项是正确的,因为8086CPU在实模式下采用分段机制,每个段最大可以寻址64KB的空间。

D选项是正确的,CPU内部有一个能合成20位地址的地址加法器,用于将段地址和偏移地址组合成物理地址。

以下说法是错误的:

B.一个物理地址可以对应多个段地址与偏移地址。

每个物理地址都只会对应唯一的一个段地址和偏移地址。由于8086CPU使用了分段寻址机制,因此同一个物理地址可能会被不同的段地址和偏移地址组合得到。但是反过来,一个物理地址只有唯一的一个值。

A、C、D三个选项的说法均正确:

A. 8086CPU有20根地址总线,它的寻址能力为1MB。其中,20根地址总线可以寻址2^20个内存单元,即1MB的内存空间。

C. 因为段寄存器是16位,所以一个段最大为64KB。由于使用分段机制时,一个段的大小由段寄存器的值决定,因此,使用16位的段寄存器时,一个段的大小最大为64KB。

D. CPU内部有一个能合成20位地址的地址加法器。在8086CPU中,物理地址由段地址和偏移地址组成,这两个部分经过地址加法器相加后形成20位物理地址。这个地址加法器可以将分段寻址的地址转换为实际物理地址。

  1. 以下指令执行后,SP的值为(   )。

mov sp,0

push ss

A.0      B.0fffeh       C.2        D.内存ss:0处的数据的值

 B

执行 mov sp, 0 指令后,SP寄存器的值被赋为0。

接着执行 push ss 指令,将SS寄存器中的值压入栈中。由于在8086CPU中,栈是向下生长的,所以压栈会使SP的值减2。因此,此时SP的值为-2(0xFFFF FFFEH)。

选项B:0fffeh即为上述计算得到的结果,因此答案为B。

  1. 用debug的e命令向b810:0010处写入数据,接着用d命令查看,发现b810:0010处并没有刚刚写入的数据,其原因是(   )。

A.此处用于存储系统时间,一直在自动更新

B.debug存在延时,第二次查看即可看到用e命令写入的数据

C.此处处于ROM空间,不可以被改变

D.此处处于显存空间,当屏幕刷新时,此处的数据被更新了

 C

  1. 8086CPU中,如果某内存单元的物理地址为4FCE0,其段地址和偏移地址一定不会是(   )。

A.4FC0:00E0    B.4CE0:2EE0    C.40CE:0F00    D.40C0:F0E0

 B 加起来

  1. 以下指令执行后,AX寄存器的值是(   )。

mov ax,017ch

add al,0b4h

A.0130H     B.0230H     C.012FH     D.022FH

A 只看低位 7c+b4

4~6

  1. 一个汇编源程序,从写出到最后被CPU执行,依次经历了哪几步?(   )

A.编译、加载、连接、执行        B.加载、编译、连接、执行

C.连接、编译、加载、执行        D.编译、连接、加载、执行

正确的答案是 D. 编译、连接、加载、执行。

下面是每个步骤的解释:

  1. 编译:首先,源程序需要通过编译器进行编译,将高级语言的源代码翻译成机器语言的目标代码。编译过程将源代码转化为可执行的二进制文件。

  2. 连接:连接器将编译生成的目标代码与其他必要的库函数或模块进行链接,生成最终的可执行文件。连接器将各个模块之间的引用关系解析,并生成可执行文件所需的所有符号和地址信息。

  3. 加载:将可执行文件加载到内存中,操作系统负责将文件从硬盘读取到内存中的适当位置。加载过程中,操作系统为可执行文件分配内存空间,并将程序的指令和数据加载到相应的内存地址中。

  4. 执行:当程序被加载到内存后,CPU开始执行程序。CPU按照指令的顺序逐条执行程序中的指令,将数据从内存读取到寄存器中进行运算,然后将结果写回内存或寄存器中。

因此,编译、连接、加载、执行是从写出汇编源程序到最后被CPU执行的正确步骤顺序。

  1. 关于编译和连接,错误的说法是(   )。

A.编译产生的*.obj文件不能在操作系统下直接运行

B.连接产生的*.exe文件里面没有伪指令

C.编译可以检查出语法错误

D.连接可以检查出逻辑错误

错误的说法是 D. 。

解释:

A. 编译产生的*.obj文件不能在操作系统下直接运行:这是正确的说法。编译器将源代码编译成目标代码(*.obj 文件),这些目标代码包含了机器语言指令和数据,但还没有完成最终的链接过程,所以无法直接在操作系统下运行。

B. 连接产生的*.exe文件里面没有伪指令:连接器在将目标代码链接成可执行文件时,可能会将伪指令(例如,用于程序入口点和初始化的伪指令)转换成真正的机器指令。这些伪指令在最终的可执行文件中是存在的。

C. 编译可以检查出语法错误:这是正确的说法。编译器在编译源代码时,会进行词法分析和语法分析,以检查代码中的语法错误。如果发现语法错误,编译器将报告错误并停止编译过程。

D. 连接可以检查出逻辑错误:这是错误的说法。连接器的主要任务是解析模块之间的引用关系,将各个模块的目标代码组合在一起,并生成可执行文件。连接器并不涉及逻辑错误的检查,逻辑错误通常在程序执行时才能被发现。

因此,错误的说法是 B. 连接产生的*.exe文件里面没有伪指令。

  1. 源程序中有如下两个按先后顺序定义的段:
           a segment 
                       db 1,2,3,4,5,6,7,8 
             a ends 
             b segment 
                       db 1,2,3,4,5,6,7,8 
             b ends 
          如果a段中“1” 这个数据的物理地址是X,则b段中“1”这个数据的物理地址是(   )。
           A. X      B. X+1      C. X+16        D. X+64

C 段最少16B db字节 dw字 dd双字

  1. Debug加载程序后,假设PSP的段地址为SA,偏移地址为0,则程序的起始地址是(   )。

A. SA×16H    B. SA×16     C. (SA+16H)×16H      D. (SA+16)×16

在x86架构的实模式下,PSP(Program Segment Prefix)是程序段前缀,它位于内存段地址的开头,用于存储有关程序的信息。偏移地址为0的位置处于PSP的开始位置。

PSP的段地址为SA,偏移地址为0,表示PSP的物理地址为SA×16(由于段地址乘以16后才是物理地址)。由于偏移地址为0,程序的起始地址即为PSP的物理地址。

因此,答案是 B. SA×16

  1. 下列关于汇编语言源程序的说法,错误的是(  )

A. 一个汇编语言源程序从写出到执行需经过.编写.asm文件→将.asm文件编译为.obj文件→将.obj文件连接成.exe文件→.exe文件执行。

B. 在汇编语言源程序中,包含三种指令:汇编指令、伪指令、其他符号。

C. 在汇编语言源程序中,不由编译器执行的伪指令有对应的机器指令。

D. 在汇编语言源程序中,汇编指令是有对应机器码的指令,其所对应的机器指令由CPU执行。

错误的说法是 C. 在汇编语言源程序中,不由编译器执行的伪指令有对应的机器指令。

解释:

A. 一个汇编语言源程序从写出到执行的过程通常包括将汇编语言源文件(.asm)编译为目标文件(.obj)和将目标文件连接为可执行文件(.exe),最后执行可执行文件。因此,选项 A 描述了正确的过程顺序。

B. 汇编语言源程序中包含三种指令:汇编指令(对应机器指令)、伪指令(用于汇编过程控制和数据定义等,不生成机器指令)和其他符号(如标签、变量名等)。这是正确的说法。

C. 在汇编语言源程序中,伪指令通常由汇编器或编译器执行,它们不会生成对应的机器指令。伪指令用于提供汇编过程中的指令控制、宏展开和数据定义等功能。因此,错误的说法是伪指令有对应的机器指令。

D. 汇编指令是有对应的机器码的指令,其所对应的机器指令由CPU执行。这是正确的说法。

综上所述,错误的说法是 C. 在汇编语言源程序中,不由编译器执行的伪指令有对应的机器指令。

  1. 在“c.\masm”目录下存放着汇编编译器“masm.exe”。在c盘根目录下存放着一个汇编源程序“t1.asm”。进入DOS下的“c.\masm”目录后,如何以简化方式对“t1.asm”进行编译?(   )

A. masm t1   B. masm t1;   C. masm c.\t1    D. masm c.\t1;

C

  1. mov ax,4c00h

Int 21h

CPU执行完这两条指令后,(   )。

  1. 返回到DOS     B. 返回到DEBUG     C. 返回到COMMOND       D. 前三个选项都不对

执行完这两条指令后,CPU将返回到DOS。

解释:

这两条指令的作用是调用DOS的系统功能。具体来说,"mov ax, 4c00h" 将 4c00h(十进制为32768)存储在寄存器 AX 中,然后 "Int 21h" 执行中断指令,将控制权转交给DOS的中断处理程序,该程序根据 AX 中的值执行相应的操作。

在这种情况下,DOS使用功能码为4c的退出功能,AX 中的值为退出码。因为指令中给出的退出码为4c00h,所以CPU将返回到DOS,并将该退出码作为返回状态。

因此,正确答案是 A. 返回到DOS。

  1. 下列说法正确的是(   )。

A. 代码段中的信息都会被当做指令执行

B. CS:IP指向过的指令一定被CPU执行过

C. 用Debug的t命令,一次只能执行一条汇编指令

D. 通过“ASSUME”建立的段与段寄存器之间的关联是编译器要处理的

正确的说法是 D. 通过"ASSUME"建立的段与段寄存器之间的关联是编译器要处理的。

解释:

A. 代码段中的信息不都被当作指令执行。代码段包含指令和其他数据,例如常量、变量等。CPU根据CS(代码段寄存器)和IP(指令指针寄存器)的值来确定要执行的下一条指令。

B. CS:IP指向的指令不一定被CPU执行过。CS:IP指向的位置是下一条要执行的指令的地址,但不保证CPU已经执行过该指令。

C. 使用Debug的"t"命令可以单步执行汇编指令,一次只执行一条指令。

"t" 命令在 Debug 工具中用于单步执行汇编指令。每次执行 "t" 命令时,Debug 会执行当前 CS:IP 指向的指令,并将 CS:IP 更新到下一条指令的地址。这样,如果下一条指令是无条件跳转指令(如 JMP),那么一次 "t" 命令就会执行多条指令。

因此,使用 "t" 命令执行的汇编指令数量取决于程序中的控制流和跳转指令的存在。如果程序中没有跳转指令或者只有顺序执行的指令,那么每次执行 "t" 命令将只执行一条指令。但是,如果程序中有跳转指令,那么一次 "t" 命令可能会执行多条指令。

D. "ASSUME"语句用于建立段与段寄存器之间的关联。这个关联关系是由编译器处理的,在编译阶段确定。"ASSUME"语句告诉编译器如何将段与段寄存器相关联,以正确生成指令。因此,正确的说法是通过"ASSUME"建立的段与段寄存器之间的关联是编译器要处理的。

  1. 执行下面的指令后,正确的结果是(   )。

mov  al,198

and  al, 01010011B

or  al,01010101B

A. al = 57     B. al = 57H     C. al = 42       D. al = 42H

执行下面的指令后,正确的结果是 B. al = 57H。

解释:

首先,执行 "mov al, 198" 指令将十进制数 198(11000110B)移动到寄存器 AL 中。此时 AL 的值为 11000110B,即 C6H。

接下来,执行 "and al, 01010011B" 指令对 AL 中的值与 01010011B 进行按位与操作。按位与操作会将两个操作数对应位上的位进行与运算,结果为 01000010B,即 42H。

最后,执行 "or al, 01010101B" 指令对 AL 中的值与 01000010B 进行按位或操作。按位或操作会将两个操作数对应位上的位进行或运算,结果为 01010111B,即 57H。

因此,执行完这三条指令后,AL 的值为 57H。

正确的结果是 B. al = 57H。

  1. 需要使用DS的指令是(   )。

A. mov ax,[bp]    B. inc word ptr [bx]     C. add al,cl     D. and [bp],al

需要使用 DS 的指令是 A. mov ax,[bp]。

解释:

在汇编语言中,使用 DS(数据段寄存器)指定要访问的数据段。指令 A. mov ax,[bp] 中的方括号表示要访问内存地址,而不是寄存器的内容。在这种情况下,访问的内存地址是通过将 BP(基址指针寄存器)中的值与 DS 相加得到的。因此,这个指令需要使用 DS。

指令 B. inc word ptr [bx] 是对 BX 寄存器中的内存地址指向的字(16 位数据)进行递增操作,不涉及 DS。

指令 C. add al,cl 是将 AL 寄存器和 CL 寄存器中的值相加,不涉及内存访问和 DS。

指令 D. and [bp],al 是将 AL 寄存器的值与 BP 寄存器中的内存地址指向的字(8 位数据)进行按位与操作,也不涉及 DS。

所以,需要使用 DS 的指令是 A. mov ax,[bp]。

指令 mov ax, [bp] 的含义是将堆栈段(SS)中,相对于基址指针(BP)所指向的内存地址处的字(16 位数据)读取到寄存器 AX 中。

对于该指令,涉及到的段寄存器有两个:

  1. 堆栈段寄存器(SS):该寄存器存储了当前堆栈段的段地址。通过它,我们可以访问堆栈上的数据。

  2. 数据段寄存器(DS):当使用 BP 作为基址指针时,默认情况下,DS 与 SS 关联。因此,在指令 mov ax, [bp] 中,数据段寄存器 DS 的值与堆栈段寄存器 SS 的值相同。

所以,mov ax, [bp] 指令使用了数据段寄存器 DS 和堆栈段寄存器 SS。它从相对于基址指针所指向的内存地址处读取一个字(16 位数据),并将其存储到寄存器 AX 中。

  1. data segment

dd  1234h

data ends

data段中的数据1234h在内存中的存储情况为(   )。

A. 12 34 00 00    B. 34 12 00 00     C. 00 00 12 34      D. 00 00 34 12

data段中的数据1234h在内存中的存储情况为 B. 34 12 00 00。

在x86架构中,数据以字节为单位进行存储,并且采用小端字节序(Little Endian)。因此,对于一个16位的数据1234h,它在内存中的存储方式是低字节在前、高字节在后的顺序。

对应于数据1234h,其存储情况为:

低字节:34 高字节:12

由于是小端字节序,所以低字节34位于内存地址较低的位置,高字节12位于内存地址较高的位置。剩余的字节为00 00。

因此,数据1234h在内存中的存储情况是 34 12 00 00,选项 B. 34 12 00 00 正确。

  1. BIOS存储在下列哪种硬件中?(   )

A.RAM   B.ROM    C.CPU    D.CMOS

BIOS(基本输入/输出系统)存储在 B. ROM(只读存储器)中。

BIOS是计算机系统的基本固件,提供了计算机启动和硬件初始化的功能。它包含了用于操作系统和应用程序的低级别软件和驱动程序。BIOS通常被存储在计算机主板上的ROM芯片中,这种ROM芯片被称为BIOS芯片或固化BIOS(Firmware BIOS)。

选项A.RAM(随机存储器)是指计算机的主内存,用于临时存储程序和数据。BIOS不存储在RAM中。

选项C.CPU(中央处理器)是计算机的主要计算和控制单元,不用于存储BIOS。

选项D.CMOS(互补金属氧化物半导体)是一种用于存储计算机的基本设置和配置信息的特殊类型的RAM。它通常包含了BIOS设置信息,但不存储完整的BIOS程序。因此,CMOS不是BIOS存储的主要位置。

因此,正确答案是B. ROM。

  1. 用 [di]、[bp]的方式访问内存时,8086CPU默认的段寄存器依次是(   )。

A.ds、es     B.ds、ss   C.ss、ds   D.es、ss

在8086 CPU中,当使用 `[di]` 和 `[bp]` 的方式访问内存时,默认的段寄存器依次是 B. ds(数据段寄存器) 和 D. ss(堆栈段寄存器)。

- `[di]` 使用 DI(目的索引寄存器)作为基址指针,并默认使用 DS(数据段寄存器)作为段地址,用于访问数据段中以 DI 寄存器指定的偏移地址处的内存。

- `[bp]` 使用 BP(基址指针寄存器)作为基址指针,并默认使用 SS(堆栈段寄存器)作为段地址,用于访问堆栈段中以 BP 寄存器指定的偏移地址处的内存。

因此,8086 CPU 默认的段寄存器依次是 B. ds、ss。

  1. debug加载.exe文件后,在对寄存器中的值进行改变之前,cx中的值有什么含义?(   )

A.循环次数                             B.所加载的文件的字节数。

C.是系统默认的值,没有实际意义         D.程序的长度。

在 Debug 加载 .exe 文件后,在对寄存器中的值进行改变之前,CX 中的值通常表示循环次数(A. 循环次数)。

CX 寄存器在很多汇编语言中用作计数器寄存器,常用于实现循环控制结构。在某些指令中,CX 寄存器的值用于指定循环的迭代次数。在 Debug 中加载 .exe 文件后,如果在执行程序之前未修改 CX 寄存器的值,那么其初始值通常表示循环的次数。

因此,正确答案是 A. 循环次数。

  1. 在debug中查看内存,显示如下:

073F:0000    CD 20 3E A7 00 EA FD FF-AD DE 4F 03 A3 01 8A 03

073F:0010    A3 01 17 03 A3 01 92 01-01 01 01 00 02 FF FF FF

073FH:0013H处的字型数据是(   )。

A.007AH      B.03A3H    C.A303H      D.0317H

 C

  1. 对于8086CPU,正确的指令是(  )。

A.mov ax,[bp+dx]        B.mov ax,ds.[bp+bx] 

C.mov ax,ss:[si][di]    D.mov ax,cs.6[si]

 在8086 CPU中,正确的指令是 A. mov ax,[bp+dx]。这条指令使用基址指针 BP 和变址指针 DX 进行内存访问。它将从 [BP + DX] 所指向的内存位置读取一个字(16位)并将其值加载到 AX 寄存器中。

  1. 可以修改CX的指令是(   )。

A.jmp   B.div   C.shl   D.jcxz

 C

指令 div 用于执行无符号除法操作。它将一个被除数与寄存器中的除数相除,并将商存储在相应的寄存器中。语法如下:

div divisor

其中,divisor 是除数,可以是寄存器或内存操作数。

指令执行时,被除数被视为一个双字(32位)或字(16位),被除数的高位在 DX 寄存器中,低位在 AX 寄存器中。除数则与 AX 寄存器中的内容相除,商存储在 AL(或 AX)寄存器中,余数存储在 AH(或 DX)寄存器中。

shl 指令将目标操作数的二进制表示向左移动指定的位数,并在右侧填充零。移出的位会存储到进位标志 CF 中。

  1. 关于标号,错误的说法是(   )。

A.数据标号表示了内存单元的地址和长度。

B.后边加“:”的地址标号,只能在代码段中使用。

C.应用assume将指令中的数据标号所在的段,与一个段寄存器联系起来,这样,使用数据标号的指令,就可以从段寄存器中得到所用数据标号的段地址。

D.可以将一个标号集合存储在直接定址表中。

错误的说法是 D. 可以将一个标号集合存储在直接定址表中。

直接定址表(Direct Addressing Table)并不是用来存储标号集合的数据结构。直接定址表是一种寻址方式,用于根据给定的地址直接访问内存中的数据。它通常用于类似于数组或表格的数据结构的访问,其中地址被用作索引来获取特定位置上的数据。

标号(Label)是在汇编语言中用来标识代码或数据位置的符号。它们通常与指令或数据定义一起使用,用于指示程序的流程或数据的位置。

因此,选项 D 是错误的,因为直接定址表与标号的含义和用途不同。

  1. 关于PSP,错误的说法是(   )。

A.这个程序设置(CS)*16+(IP)= PSP所在内存空间的首地址。

assume cs:code

code segment

start:         mov ax,0

       mov es,ax

       mov word ptr es:[200h],0

       mov es:[202h],ds

       jmp dword ptr es:[200h]

code ends

end start

B.PSP共有256个字节。

C.DOS通过PSP来与其所加载的程序进行通信。

D.用debug加载一个其功能是设置(ds)=(cs)的程序后,即用a命令写且用T命令运行以下程序段:

mov ax,ds

sub ax,10

mov ds,ax

之后用“d ds:0 ff”,可对PSP所在的内存空间进行查看。

D.用debug加载一个其功能是设置(ds)=(cs)的程序后,即用a命令写且用T命令运行以下程序段:

mov ax,ds

sub ax,10

mov ds,ax

之后用“d ds:0 ff”,可对PSP所在的内存空间进行查看。

这个说法是错误的。在给定的代码段中,ds寄存器的值被修改为ds-10,而不是设置ds等于cs。因此,使用"d ds:0 ff"命令来查看PSP所在的内存空间将不会显示正确的结果。

  1. 以下指令执行后,ax的值是(   )。

mov ax,6776h

add al,90h

add ah,90h

A.6806H    B.F806H     C.F706H       D.6706H

C 不会进位

  1. 以下指令执行后,al的值是多少?(   )

mov al,01100011b

and al,00111011b

or al,00111011b

A.00100011B      B.00111011B     C.01111011B      D.前三个选项都不对。

 B

  1. 以下程序运行时,源程序的指令中,CPU执行的第一条指令是?(   )

assume cs:a

codesg segment

mov ax,20h

mov ax,4c00h

int 21h

codesg ends

a segment

mov bx,30h

mov ax,4c00h

int 21h

a ends

b segment

mov bx,40h

mov ax,4c00h

int 21h

b ends

end

A.mov ax,20h     B.mov bx,30h    C.mov bx,40h        D.以上选项都不对

 B

根据给定的程序,首先执行的是"a segment"部分。在该部分的第一条指令中,将bx寄存器中的值设置为30h。因此,CPU执行的第一条指令是mov bx,30h

  1. 对于8086CPU,正确的指令是(   )。

A.inc word ptr ds:[0]           B.mov es:[0],ds:[0]

C.mov ax,[bx+bp]                 D.add Cs,ax

 b

  1. 按照地址从低到高的顺序排列,双字型数据16在内存中如何存储?(   )

A.00 00 10 00        B.00 00 00 10

C.00 10 00 00        D.10 00 00 00

  1. 不可能出现在可执行文件中的是(   )。

A.机器码       B.伪指令    C.源程序中定义的数据   D.jmp指令中的地址

  1. 关于在程序中使用内存空间,不正确的说法是(   )。

A.可以通过定义段的方式给程序分配安全的内存空间

B.DOS和应用程序一般不会使用0.200~0.2ff这段空间

C.使用安全的内存空间,不会影响dos操作系统和其他合法程序的运行

D.使用mov指令时,不用担心损坏系统数据

  1. 以下指令中,可以被CPU执行的指令是(   )。

A.SEGMENT      B.ASSUME      C.sti        D.end

  1. CPU在读取指令时,实际读到的是什么?(   )

A.伪指令和汇编指令所对应的字符串

B.用汇编语言写的源程序中的信息

C.由一系列二进制位组成的信息

D.汇编指令所对应的字符串

  1. 对于8086CPU,错误的指令是(   )。

A.mov ax,ds       B.push [bx]         C.inc [bx]         D.add bp,2

  1. 对于8086CPU,下列关于段的说法,错误的是(   )。

A.一个段的起始地址必须是16的整数倍

B.在源程序中定义一个段,在运行程序时,CPU不会因此定义而知道这个段的大小。

C.一块内存空间可以既是代码段,又是数据段。

D.CPU将某个段用做栈,是因为assume指令将其与SS寄存器相关联

  1. (   )的功能与“mov al,’d’”的 功能相同。

A.mov ax,’d’      B.mov al,’a’+3      C.mov al,’A’+3     D.or al,’d’

  1. 关于汇编语言中的指令,正确的说法是(   )。

A.汇编语言中的标号属于伪指令

B.汇编指令一定有对应的机器码

C.伪指令由编译器识别,编译器将其转化为对应的机器码

D.“+”一般会被编译成add指令

  1. 以下程序运行时,“sub ax,masm”执行后,ax的值是(   )。

assume cs:code

masm segment

dw 5 dup(‘a’,’b’,’c’)

masm ends

code segment

start: mov ax,code

          sub ax,masm

          mov ax,4c00h

          int 21h

code ends

end start

A.15       B.1       C.2      D.3

  1. 关于debug的使用,错误的说法是(   )。

A.Debug将程序加载到内存后,不执行任何命令前,IP的值一定为零

B.通过debug可以查看标志寄存器某些位的值

C.Debug将程序加载到内存后,不执行任何命令前,CX的值有可能是1024

D.T命令有可能一次执行一条以上的指令

  1. 关于标号,下列说法正确的是(   )。
  1. 地址标号和数据标号都可以在jmp后使用
  2. 后面带“:”的标号,用在代码段中是地址标号,用在数据段中是数据标号
  3. 用在代码段中的数据标号只表示内存单元的地址
  4. 在and与or指令中不可用地址标号
  5. 前几个选项都不对

  1. 汇编语言中不包括哪个元素?(   )

A.汇编指令     

B.机器指令     

C.伪指令       

D.“+”、“-”、“*”、“/”等符号

  1. 对于编译、连接、运行,错误的说法是(   )。

A.伪指令在编译的过程中被编译器执行了

B.使用masm编译器进行编译,只能生成目标文件

C.可执行文件中包含程序和描述信息

D.DOS提供的command程序可以将可执行文件中的程序加载进内存

  1. 以下说法中,错误的是(   )。

    A.在用masm.exe编译的汇编语言的源程序中,end和ends都属于伪指令

    B.在debug中调试一个程序,在用p命令依次执行程序中的“mov ax,4c00h”与

“int 21h”两条指令后,屏幕上显示“Program terminated normally”,可说明此

时程序已返回到DOS

    C.用于程序返回的相关指令是CPU来执行的

    D.对于程序返回,DOS提供了相应的中断例程

  1. 用debug写几条指令:

mov ax,20

mov ds,ax

mov ax,[1]

    之后查看内存,显示如下:

0:200  80 00 70 00 60 00 ……

接着用t命令执行这几条指令,“mov ax,[1]”执行后,AX的值是多少?(   )

    A.7000H     B.0070H     C.1         D.0080H

  1. 以下指令执行后,AX的值是多少?(   )

mov ax,20

mov es,ax

mov byte ptr es:[0],80h

mov byte ptr es:[1],00h

mov byte ptr es:[2],70h

mov byte ptr es:[3],00h

    mov ax,es:[1]

    A.7000H         B.0070H         C.1         D.0080H

  1. 汇编语言源程序中的“dw”、“db”、“dd”等指令属于(   )。

    A.汇编指令      B.伪指令        C.机器指令      D.标号

  1. 对于程序的执行过程,错误的说法是(   )。

    A.通过command将程序加载进内存后,command将根据可执行文件中的描述信息,设置CS.IP指向第一条要执行的指令

    B.通过debug将程序加载进内存后,用r命令查看CX的值,可看到与程序的长度相关的信息

    C.通过debug将程序加载进内存后,DS指向程序的数据段,CS指向程序的代码段

    D.在源程序中用end指令,可以决定程序加载后IP寄存器的值

  1. 下列对于程序段前缀(PSP)的描述,错误的是(   )。

A.PSP占256个字节的地址空间

B.DOS通过PSP与被加载的程序通信

C.用debug将程序载入内存后,PSP与代码段的段地址一致,偏移地址相差100h

D.用debug将程序载入内存后,可用“d ds:0 ff”查看PSP的全部内容

  1. 下面汇编语言源程序中的指令可以通过编译的是(   )。

A. mov al,2000   B. push [0]   C. add al,100h   D. mov dx,1000h

  1. 下列说法正确的是(   )。

A. Push、pop指令通过修改ss:sp的值来操作栈中的数据

B. 栈空时,ss:sp指向栈底

C. 栈满以后,如果继续向其中压入数据,会覆盖栈顶之后的高地址内存单元

D. 栈满以后,如果继续向其中压入数据,不一定会覆盖其地址比栈顶的地址更低的内存单元

  1. 其所传送的数据在内存中的指令是(   )。

A. pop ax   B. mov ax,bx   C. mov ax,0   D. in al,20h

  1. 以下程序加载后,在执行前,(ds)=0a21h。对于此时的寄存器与程序的相关情况,错误的说法是(   )。

assume cs:code,ds:data

   data segment

    db ’1975’

   data ends

code segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah

mov ax,0

mov bx,0

mov cx,8

s: add ax,cs:[bx]

add bx,2

loop s

    mov ax,4c00h

    int 21h

code ends

end

A. 程序的起始段地址为0a31h

B. (cs)=0a31h,(ip)=0

C. ds的值不是data段的段地址

D. “mov ax,0”的机器码的内存地址是0a31H:0020H

  1. masm和debug默认的进制分别是(   )。

A.十六进制和十进制        B.十进制和二进制

C.十进制和十六进制        D.二进制和十六进制

  1. 补全这段程序,使其执行后,(bx)=3。(   )

mov bx,1

mov cx,___

loop s1

mov bx,2

s1: inc bx

A. 0     B. 1    C. 2    D. 3

第7-8章(寻址方式)

  1. 以下寻址方式中,属于相对基址变址寻址的是(   )。

A. [bx+si+idata]        B. [bx+di]        C. [bp+si]       D. [bx]

  1. 可在基址变址寻址或寄存器间接寻址中,用作偏移地址寄存器的是(   )。

A. ax,bx,cx,dx       B. ds,es,cs,ss

C. sp,bp,ip,bx       D. si,di,bp,bx

  1. 用“dd 5 dup (1,2,3,4)”说明的数据,在程序运行时,共占用(   )个字节。

A. 4    B. 20    C. 40    D. 80

  1. 对于8086CPU,错误的指令是(   )。

A. mov ax,[bp+si]   B. mov ax,[bx]   C. mov ax,2[si]   D. mov al,[dx]

  1. 下列寻址方式属于基址变址寻址的是(   )。

A. [di]   B. [bx+idata]   C. [bx+di]   D. [bp+di+idata]

  1.  “mov word ptr [bx+si],1”采用的寻址方式为(   )。

A.寄存器间接寻址    B.寄存器相对寻址    C.基址变址寻址  D.相对基址变址寻址

  1. 用div指令进行除法运算,除数为16位时,余数存放在(   )中。

A.AX     B.AH   C.AL     D.DX

  1. 关于div指令,错误的说法是(   )。

A.执行div指令可能触发中断

B.div指令的除数既可以是16位,也可以是8位

C.div指令的被除数或存放在DX和AX中,或存放在AX中

D.div指令的运算结果有商和余数两部分

  1. 若AX=1000H,CL=90H,则执行指令DIV CL之后,AX=(   )。

A.401CH       B.001CH      C.0040H      D.1C40H

  1. 以下关于8086CPU的div指令的说法,错误的是(   )。

A.被除数可以放在寄存器中,也可以放在内存单元中。

B.若结果的商大于al或ax所能存储的最大值,将引发CPU内部的除法溢出错误。

C.可以重写0号中断处理程序,使得程序可以处理除法溢出的情况。

D.可使用div指令编写一个计算32位被除数/8位除数的子程序。

  1. 执行以下指令后,AX的值是(   )。

mov al,96h                                                              

mov bl,12h

mul bl

A. 1152h        B. 0a8ch

C. 0a82h         D. 0f88ch

  1. 以下指令执行后,AX的值是多少?(   )

mov ah,1

mov al,10h

    mov bl,2

    mul bl

    A.0220H     B.2000H     C.0020H     D.0120H

  1. 下列指令中(   )可以实现,将AX寄存器中的最低3位清0

A、 OR   AX,0FFF8H

B、 AND  AX,0FFF8H

C、 AND  AX,0FFF7H

D、 AND  AX,0FFFBH

  1. 下列指令中(   )可以实现,将AX寄存器中的D3和D7位置1

A、 XOR   AX,08H

B、 OR  AX,08H

C、 OR  AX,88H

D、 XOR  AX,88H

  1. 下列指令中(   )可以实现,将AX寄存器中的最高3位取反

A、 NOT  AX

B、 AND  AX,1FFFH

C、 XOR   AX,0E000H

D、 OR    AX,0E000H

  1. 数据段中有如下定义

   X1  DB  1,2,3,4,5,6,7,8

   X2   DW  1,2,3,4,5,6,7,8

以下指令中错误的是(     )

A、 MOV     X1,100

B、 MOV    AX,X1

C、 MOV  AX,X2

D、 MOV  X2,100

  1. 数据段中有如下定义

   X1  DB  1,2,3,4,5,6,7,8

   X2   DW  1,2,3,4,5,6,7,8

以下指令中正确的是(     )

A、 MOV     X1,1000

B、 MOV    AX,X1

C、 MOV  AH,X2

D、 MOV  X2,1000

  1. 数据段中有如下定义

   X1  DB  1,2,3,4,5,6,7,8,9,10

   X2  DW  100

执行完下面的程序段之后,DX的值是(      )。

      MOV   CX,10

      MOV   DX,X2

S:   MOV   BX,CX

      MOV   AL,X1[BX]

      MOV   AH,0

      ADD   DX,AX

      DEC    CX

      LOOP   S

A、 124     B、 224     C、 155     D、 255

  1. 下列指令序列不能够实现把内存地址0:202h中的字节数据送入al功能的是______

A、 mov ax,0 

mov ds,ax 

mov bx,202h 

mov al,[bx]

B、 mov ax,0 

mov ds,ax 

mov bp,202h 

mov al,[bp]

C、 mov ax,0 

mov ds,ax 

mov bx,200h 

mov al,[bx+2]

D、 mov ax,0 

mov ds,ax 

mov bp,200h 

mov al,ds:[bp+2]

  1. 下列指令中,正确的是(  )

A、 MOV  AX,[BX+BP]        B、MOV  AX,[BX+SI]

C、 MOV   AL,[SI+DI] D、 MOV   AL,[SI+DX]

  1. 下列指令中,错误的是(  )

A、 MOV  AX,[BX+SI]        B、 MOV  AX,[BX+DI]

C、 MOV   AL,[SI+DI]      D、 MOV   AL,[SI+BP]

  1. 下列指令中,正确的是(   )

A、 MOV  DS:[BP+BX],AH         B、 ADD   [BX],100

C、 MOV   [SI],AL         D、 MOV   [SI],100

  1. 下列指令中,错误的是(   )

A、 MOV  DS:[BP+SI],AH         B、ADD   WORD PTR [BX],100

C、 MOV   [SI],AL             D、 MOV   [SI],100

  1. 下列哪个程序段可以实现将987*6  ? (   )

A、 MOV   AX,987

MOV  BX,6

MUL   AX,BX

  1. MOV   AX,987

MOV  BX,6

MUL   BX

C、 MOV   AX,987

MOV  BL,6

MUL   BL

D、 MOV   AL,6

MOV  BX,987

MUL   BX

  1. 下列哪个程序段可以实现将987/30 ? (   )

A、 MOV   AX,987

MOV  BX,30

DIV    BX

  1. MOV   DX,987

MOV  BL,30

DIV   BL

  1. MOV   AX,987

MOV  BL,30

DIV   BL

D、 以上选项都不对

  1. 执行下列程序段

MOV   AX,87

MOV  BX,6

MUL   BX

 去 (   )寄存器查看结果

A、 AX      B、BX       C、DX       D、 DX存放结果高16位,AX存放结果低16位

  1. 执行下列程序段

MOV   AX,87

MOV  BL,6

MUL   BL

 去 (   )寄存器查看结果

A、 AX

B、 BX

C、 AL

D、 DX存放结果高16位,AX存放结果低16位

  1. 数据段中有如下定义:

  DATA1  DB   1,2,3,4

               DB   5,6,7,8

               DB   9,10,11,12

               DB   1,2,3,4

执行下列程序段

      MOV   BX,0

      MOV  SI,0

      MOV  CX,4

      MOV  AL,0

S:   ADD   AL,DATA1[BX][SI]

      INC  SI

      ADD   BX,4

     LOOP   S

 AL寄存器的结果是(     )

A、 10      B、 16      C、 24      D、 22

  1. 数据段中有如下定义:

  DATA1  DB   1,2,3,4

               DB   5,6,7,8

               DB   9,10,11,12

               DB   1,2,3,4

执行下列程序段

      MOV   BX,0

      MOV  SI,0

      MOV  CX,4

      MOV  AL,0

S:   ADD   AL,DATA1[BX][SI]

      INC  SI

      INC  BX

     LOOP   S

 AL寄存器的结果是(     )

A、 10      B、 16      C、 24      D、 22

  1. 数据段中有如下定义:

  DATA1  DB   1,2,3,4

               DB   5,6,7,8

               DB   9,10,11,12

               DB   1,2,3,4

执行下列程序段

      MOV   BX,0

      MOV  SI,0

      MOV  CX,4

      MOV  AL,0

S:   ADD   AL,DATA1[BX+SI]

      ADD   AL,DATA1[BX+4+SI]

      INC  SI

       LOOP   S

 AL寄存器的结果是(     )

A、 10      B、 16      C、 52      D、 36

  1. 有如下定义,说法正确的是(    )。

  X  DW    5   DUP  (1,2,3)

A、 总共定义了15个字节     B、 总共定义了3个字节

C、 总共定义了5个字节      D、 总共定义了30个字节

  1. 有如下定义,说法正确的是(    )。

  X  DB    3   DUP  (1,2 DUP(3))

A、 相当于   X   DB   1,2,3

B、 相当于  X   DB   1,2,3,1,2,3,1,2,3

C、 相当于   X   DB   1,3,3,1,3,3,1,3,3

D、相当于   X   DB   1,2,2,1,2,2,1,2,2

  1. 有如下定义,说法正确的是(    )。

  X  DW    5   DUP  (1,3  dup(2))

A、 总共定义了10个字节     B、 总共定义了20个字节

C、 总共定义了30个字节     D、 总共定义了40个字节

第9-10章

  1. CPU在执行“call标号” 时,相当于执行(   )。

A.   push  IP ; jmp far ptr 标号

B.   push CS ; push  IP ; jmp far ptr 标号 

C.  push  IP ; jmp near ptr 标号

D.  push CS ; push  IP ; jmp near ptr 标号

  1. 使用call和ret指令,我们可以实现汇编语言编程中的模块化设计。以下描述中错误的是(   )。
        A. 可以用call和ret指令实现多个子程序。 
         B. 可以通过多个相互联系、功能独立的子程序来解决一个复杂的问题。 
         C. 对于通用的子程序,最好加上详细的注释。 
         D. 用汇编语言进行程序设计,子程序一定要用call和ret来实现。
  2. 以下程序执行后,AX的值为(   )。

mov ax,4

    call s

    nop

S:

    mov ax,offset s

    mov bp,sp

    sub ax,[bp]

A.0       B.1      C.2       D.3

  1. 对于根据位移进行跳转的jmp指令,跳转的位移是在什么时候计算的?(  )

A. 编译    B. 连接   C. 运行    D. 编译或运行

  1. 可修改cs和ip的指令是(   )。

A. jmp ax   B. jmp far ptr s   C. loop   D. ret

  1. “jmp word ptr [bx]”进行的是(   )。
  1. 段内近转移  B.段间近转移    C.段内短转移    D.段间短转移
  1. “jmp word ptr [bx]”修改寄存器是(   )。

A.IP    B. BP   C.CS    D.CS和IP

  1. 哪个指令的跳转范围可以与其它三个不同?(   )

A.jmp      B.jcxz      C.loop      D.je

  1. 下列说法正确的是(   )。
  1. iret指令可以描述为:

popf

    pop cs

    pop ip

  1. mov al,1

add al,0ffh

上面两条指令执行后,(AX)=0

  1. 用debug进行调试时,用p命令可以一次执行多条汇编指令
  2. call指令不能通过位移进行跳转
  1. 关于loop指令,错误的说法是(   )。

A.loop指令的跳转范围是-128~127

B.CX=10时,执行loop指令,IP的值一定减小

C.CX=0时,执行loop指令后,CX=0ffffh

D.CX=1时,执行loop指令,IP的值不变

  1. 假设sp=0010h,则执行哪条指令,sp的值会减小?(   )

A.iret     B.jmp 标号     C.retf     D.call 标号

  1. 在debug中,用“d 1000:0”查看内存,显示如下.

1000:0000 69 76 65 20 25 63 20 61-6E 64 20 70 72 65 73 73

1000:0010 20 3C 45 4E 54 45 52 3E-0A 00 6B 00 41 62 6F 75

1000:0020 74 20 74 6F 20 67 65 6E-65 72 61 74 65 20 2E 45

接着,即写且执行以下指令:

mov ax,1000

mov ds,ax

jmp far [2]

之后,cs:ip的值依次是(   )。

A.6325:2065    B.6520:2563    C.2065:7669       D.6520:2567

  1. 关于转移指令,错误的说法是(   )。

A.进行段内短转移时,jmp指令对应的机器码中没有转移的目的地址。

B.进行段间转移时,jmp指令对应的机器码中有转移的目的地址。

C.进行段内短转移时,IP的修改范围是0~255。

D.loop指令也是转移指令。

  1. 读取,执行哪条指令CPU会修改两次IP?(   )

A.push     B.pushf     C.ret       D.mov

  1. 在debug中用t命令执行下列指令,可观察到的现象是(   )。

内存地址    汇编指令

    076e:0     mov ax,5

    076e:3     call ax

    076e:5     inc ax

    076e:6     mov bp,sp

    076e:8     jmp word ptr [bp]

    A.循环执行mov ax,5  和call ax

B.循环执行call ax到jmp word ptr [bp]

C.循环执行inc ax到jmp word ptr [bp]

D.ss:bp指向处的数据未知,因而跳转到未知内存处,结果不可预测

  1. 用debug的d命令查看内存,结果如下,则下列指令执行后,CS和IP的值依次是( )。
        1000:0010 63 69 66 69 65 73 20 61……
        mov ax,1000H
        mov es,ax
        jmp dword ptr es:[0012H]

A.6669  6573     B.6966  6965     C.7365  6966    D.1000  0012

  1. 用一条指令补全程序,使这个程序可以返回。(   )

assume cs:code

data segment

    dd 4 dup (0)

data ends

code segment

s:

mov ax,4c00h

    int 21h

code ends

assume cs:a

a segment

start:

      _____________

a ends

end start

A.jmp s       B.loop s     C.jmp far ptr s       D.jmp near ptr s

  1. 读取执行下面的指令之后,CPU总共修改了几次IP的值?(   )

sub ax,ax

retf

A.1      B.2      C.3       D.4

  1. 8086CPU读取、执行指令的过程是(   )。

①从CS:IP指向的内存空间读取指令,将指令放入指令缓冲器

②执行指令,转到步骤①

③IP指向下一条指令

A.① ②   

B.① ③ ②

C.若指令是转移指令,过程为① ③ ②,不是则过程为① ②

D.若指令是转移指令,过程为① ②,不是则过程为① ③ ②

  1. 有以下定义

DATA SEGMENT 

  X1  DB  5 DUP (1,2,3)

  X2  DW  1

  X3  DW  1000H

DATA  ENDS

执行下面的程序段后,CX的值为(    )

   MOV   AX,DATA

   MOV   DS,AX

   MOV   CX,OFFSET  X3

A、 15

B、 16

C、 17

D、 18

用Debug查看内存,结果如下:

2000:1000 04 05 60 BE 00 06 00 00 00 ……

则此时,CPU执行指令:

mov ax,2000H

mov es,ax

jmp dword ptr es:[1002H]

后,说法正确的是(     )

A、 (CS)=2000H,(IP)=1002h

B、 (CS)=BE60H,(IP)=0600H

C、 (CS)=60BEH,(IP)=0006H

D、 (CS)=0600H,(IP)=BE60H

  1. 有以下定义

DATA SEGMENT 

  X1  DB  5 DUP (1,2,3)

  X2  DW  1

  X3  DW  1000H

DATA  ENDS

执行下面的程序段后,CX的值为(    )

   MOV   AX,DATA

   MOV   DS,AX

   MOV   BX,OFFSET  X3

   MOV   CX,[BX]

A、 18

B、 17

C、 1

D、 1000H

  1. 关于指令 JMP  SHORT  标号,说法正确的是

A、 执行该指令,修改CS和IP一次

B、 执行该指令,修改IP一次

C、 执行该指令,修改IP两次

D、 执行该指令,修改IP三次

  1. 关于指令 JMP  SHORT  标号,说法正确的是

A、 执行该指令,(IP)=(IP)+8位位移量

B、 执行该指令,(IP)=(IP)+16位位移量

C、 执行该指令,(IP)=(IP)+标号所在段中的偏移地址

D、 执行该指令,(IP)=标号所在段中的偏移地址

  1. 关于指令 JMP  NEAR  PTR  标号,说法正确的是

A、 执行该指令,(IP)=(IP)+8位位移量

B、 执行该指令,(IP)=(IP)+16位位移量

C、 执行该指令,(IP)=(IP)+标号所在段中的偏移地址

D、 执行该指令,(IP)=标号所在段中的偏移地址

  1. 关于指令 JMP  FAR PTR  标号,说法正确的是

A、 执行该指令,(IP)=(IP)+8位位移量

B、 执行该指令,(IP)=(IP)+16位位移量

C、 执行该指令,(IP)=(IP)+标号所在段中的偏移地址

D、 执行该指令,(IP)=标号所在段中的偏移地址

  1. 下列指令中,没有修改CS的是(      )

A、 JMP   AX

B、 JMP    FAR  PTR   S1

C、 JMP  DWORD  PTR   DS:[0]

D、 JMP  DWORD  PTR  [BX]

  1. 下列指令中,同时修改CS和IP的是(      )

A、 JMP   AX

B、 JMP    NEAR  PTR   S1

C、 JMP  WORD  PTR   DS:[0]

D、 JMP  DWORD  PTR  [BX]

第11章

  1. 以下指令执行后,of和cf的值是(   )

mov ax,0

         push ax

         popf

         mov ax,0ffffh

         inc ax

A. of=0,cf=0    B. of=1,cf=0      C. of=0,cf=1      D. of=1,cf=1

  1. 以下指令执行后,sf、cf、zf、of的值分别是(   )。

mov ax,0ea04h

sub ax,4ae0h

A. 0,1,0,1    B. 1,1,0,0     C. 1,0,0,0    D. 1,0,1,0

  1. 可以改变标志寄存器的值的指令是(   )。

A.PUSHF      B.MOV AX,AX         C.SHL AX,CL      D.JCXZ

  1. 可改变SF和ZF的值的指令是(   )。

A.je next     B.in al,20h     C.puah ax      D.shl ax,1

  1. 不会影响标志寄存器的值的指令是(   )。

A.adc ax,bx      B.cmp cx,ax     C.inc ax       D.jmp word ptr [bx]

  1. 可使if=1的指令是(   )。

A.sti     B.cld     C.std     D.shr

  1. mov al,62h

add al,63h

这两条指令执行后,cf\of的值是(   )。

A. cf=0,of=0  B. cf=0,of=1    C. cf=1,of=0    D. cf=1,of=1

  1. 下面对标志位的描述,正确的是(   )。
    A. 可以用栈指令改变标志位的值
  1. Cmp、pushf指令都可能会对标志位的值产生影响
        C. 可以通过判断cmp指令执行后的sf位是否为1知道两个数的大小
        D. 传送指令.移位指令对标志位的值无影响
  1. 执行JNB指令时,(   ),则进行跳转。

A.CF=1且ZF=1       B.CF=0或ZF=1   C.CF=0或ZF=0   D.CF=0

  1. 下面的程序执行后,pf、sf、cf、of的值分别为(   )。

mov ax,0ff80h

    add al,0f0h

A.pf=1 sf=1 cf=1 of=1       B.pf=0 sf=1 cf=1 of=1

C.pf=0 sf=0 cf=1 of=1       D.pf=1 sf=0 cf=0 of=0

  1. 下列与标志寄存器相关的说法,错误的是(   )。

    A.标志寄存器可以通过栈指令访问

    B.当al=0ffh,执行“inc al”,将影响cf的值

    C.算数运算指令不会影响df标志位

    D.根据无符号数的比较结果进行转移的条件转移指令,检测的是zf.cf的值

  1. 对于标志寄存器相关位的描述,错误的是(   )。
  1. mov al,1

add al,127

这两条指令执行后,OF=1,发生溢出;虽然逻辑结果为正,但SF却为1

  1. mov al,1

add al,0ffh

这两条指令执行后,OF=0,CF=1

  1.  “inc ax”不影响标志寄存器的CF位
  2. S:mov ax,8f00h

cmp ax,5

jb s

int 21h

这段程序执行过程中,SF一直为1

  1. 下列指令,一定不会使标志寄存器发生变化的是( )。

A.int 21h B.jmp ax    C.cmp ax,bx    D.sub ax,ax

  1. 如果AL=75H,则执行ADD AL,0F0H之后,OF、CF的值是(   )。

A.OF=1,CF=0      B.OF=0,CF=0    C.OF=0,CF=1       D.OF=1,CF=1

  1. 以下哪个选项中的指令执行后,zf=1,pf=1?(   )

A.mov ax,1      B.mov ax,1     C.mov ax,1       D.mov ax,1

add ax,2        and ax,0       sub ax,2          or ax,0

  1. 以下哪个选项中的指令执行后,cf=1,of=1?(   )

A.mov al,98     B.mov al,0f0H      C.mov al,0f0H       D.mov al,68H

add al,99       add al,88H         add al,78H          add al,1

  1. 关于串传送指令,错误的说法是(   )。

A.只用一条movsb指令,即可以将一个内存单元里的数据传送到另一个内存单元

B.movsb指令执行后,SI与DI的值可能会增加,也可能会减小

C.传送可以以字节为单位进行,也可以以字为单位进行

D.如果在执行“movsb”之前,CX的值是10,“movsb”将重复执行10次

  1. 对于8086CPU的标志寄存器,下列说法错误的是(   )。

A.标志寄存器是16位的

B.无法通过一条汇编指令将标志寄存器的所有位都更新

C.这个寄存器中的有些位没有任何含义

D.cmp指令能够改变标志寄存器的值

第12章及之后

  1. 中断向量表中存放的是(   )。

A. 中断类型码           B. 中断处理程序的入口地址

C. 中断处理程序         D. 断点地址

  1. 中断向量占(   )字节。

A. 1           B. 2            C. 3         D. 4

  1. 使用call和ret指令,我们可以实现汇编语言编程中的模块化设计。以下描述中错误的是(   )。
          A. 可以用call和ret指令实现多个子程序。 
             B. 可以通过多个相互联系.功能独立的子程序来解决一个复杂的问题。 
             C. 对于通用的子程序,最好加上详细的注释。 
             D. 用汇编语言进行程序设计,子程序一定要用call和ret来实现。
  2. 以下指令执行后,al和cf的值分别是(   )。

mov al,00000001B

mov cx,109h

shl al,cl

A. 29 ,1     B. 29 ,0     C. 0,1      D. 0,0

  1. 已知(AX)=2,则能实现(AX)=(AX)*8的程序段是(   )。

A.shl ax,3           B.shr ax,3

C.MOV CL,3           D.mov cl,3

SHL AX,CL             shr ax,cl

  1. 关于shl与shr,正确的说法是(   )。

A.shl用0补充最高位。   

B.shr将一个寄存器或内存单元中的数据向左移动。

C.移出的bit的值是0,shl与shr不影响CF。

D.shr用0补充最高位。

  1. 其逻辑不是实现 (ax)=(ax)*10的程序段是(   )。

A. shl ax,1

mov bx,ax

mov cl,2

shl ax,cl

add ax,bx

B. mov bx,ax

shl ax,1

shl bx,1

shl bx,1

add ax,ax

add ax,bx

C. mov bx,ax

mov cl,3

shl ax,cl

shl bx,1

add ax,bx

D. mov cl,3

shl ax,cl

mov bx,ax

mov cl,2

shr bx,cl

add ax,bx

  1. 现在想要判断AL的值是否是某个正整数的2^n(n是正整数)次方,若al=10000110b,那么至少需要移位几位,通过cf的值可判断出结果?(   )

A.1         B.2         C.3         D.4

  1. 中断向量表中存放的是(  )。

A.中断类型码    B.断点地址     C.中断处理程序    D.中断处理程序的入口地址

  1. 可以实现将ax的值增大2倍的是(   )。

A. mul 2     B. mul ax,2     C. shl ax,1    D. shr ax,1

  1. 对于8086CPU,正确的指令是(   )。

A. inc cx,1       B. shl ax,2      C. and [bp],al       D. mov [bx][bp],ax

  1. 对于在debug中使用t命令,正确的说法是(   )。

A.可触发单步中断      B.将执行完整个程序      C.只能执行一条指令

D.在依次执行完“mov ax,4c00h”、“int 21h”这两条指令后,程序返回

  1. mov ax,4c00h

int 21h

这段程序的作用是( )。

  1. 调用21h号中断例程的4c00h号功能
  2. 告诉编译器程序到此结束
  3. 返回DOS
  4. 前三个选项都不对
  1. 正确的说法是(  )。

    A.可用这段代码读取CMOS中的年份信息

mov al,9

in 70h,al

out al,71h

    B.在移位指令中,可以用bl存储大于1的移位数

    C.用shl指令对al进行移位,要注意对ah的值的影响

    D.十进制数码的ASCII码=十进制数码的BCD码+30h

E.后面有“:”的地址标号能够写在所有段内

F.数据标号只能写在数据段内

.用一条指令写出实现下列指明的功能

  1. 将AL寄存器值乘8 。
  2. 截取BL寄存器的低4位。
  3. 将CX 寄存器D14位设置为1,其余位保持不变。
  4. 用寄存器BX和SI的基址变址寻址方式,把存储器中的一个字节与AL寄存器的内容相加,并保存在AL寄存器中。
  5. 已知(AL)=03H,借助指令完成将AL中的低4位代码变反,而其高4位代码不变。
  6. 完成将AX清零,并使标志位CF清零。
  7. AX的内容加1。要求不影响CF。
  8. 传送25H到AL寄存器。
  9. 将AL内容乘以2。
  10. AL内容乘以BL内容。
  11. 测试AL最低位是否为1。
  12. 将AL内容对于变成对应的ASCII码
  13. 用BX和位移量0B2H的寄存器相对寻址方式把寄存器中的一个字和CX寄存器的内容相加,并把结果送回储存器中。
  14. AX寄存器的值入栈保存。
  15. 将AL的D6位、D2位清零;
  16. 将CX寄存器值乘2。
  17. 将BL寄存器值减1。
  18. AX的内容加1,要求不影响CF。
  19. 将BX寄存器的D4位取反。
  20. 将AX寄存器高4位清0。
  21. 把数0A0H与AL寄存器的内容相加,并把结果送回AL中。

.程序分析

  1. 以下程序计算28,选一个数据补全程序。(   )

assume cs:code

code segment    

start: mov ax,2

         mov cx,_____

s:   add ax,ax

         loop s

     mov ax,4c00h

    int 21h

code ends

end  start

  1. 8     B. 7     C. 4      D. 128
  1. 如下程序执行后,AX=(   )。

assume cs:code 

code segment

start: mov ax,2

         mov bx,2

         mov cx,0

s:   add ax,bx

         loop s        

      mov ax,4c00h

    int 21h

code ends

end start

A. 2       B. 4        C. 0FFFEH      D. 0FFFCH

  1. 以下指令执行后,10000H~10006H内存单元中的内容是(   )。

mov ax,1000H 
    mov ds,ax 
    mov bx,0000H 
    mov ax,3e88H 
    mov  [bx],ax 
    inc bx 
    inc bx 
    mov [bx],ah 
    mov ah,0 
    inc bx 
    mov [bx],ax 
    inc bx 
    mov [bx],ax
    mov ax,ds:[1] 
    inc bx 
    inc bx 
    mov [bx],ax

A.88H,3eH,3eH,88H,88H,00H,3eH

B.88H,3eH,3eH,88H,00H,88H,00H

C.88H,3eH,3eH,88H,00H,3eH,3eH

D.88H,3eH,3eH,88H,88H,3eH,3eH

  1. 补全以下程序,计算00101000h-00202000h的值,并将计算结果的高位保存在AX中,低位保存在BX中。(  )

    Mov ax,0010h

    Mov bx,1000h

    ___________

    ___________

A.Sub bx,2000h      B.Sbb bx,2000h

Sub ax,0020h         Sub ax,0020

C.Sub bx,2000h      D.Sbb bx,2000h

Sbb ax,0020h        Sbb ax,0020h

  1. 补全程序,使其可以实现.SUM=字符串STR中的所有BYTE型数据的和。(   )

ASSUME CS:CODE,ES:DATA

DATA SEGMENT

STR DB 'NULL POINTER ASSIGNMENT.'

DATA ENDS

CODE SEGMENT

      SUM DW 0 

START:MOV AX,DATA

MOV ____,AX

MOV SI,0

MOV CX,24

S:MOV AL,STR[SI]

ADD ____,AL

ADC BYTE PTR SUM[1],0

LOOP S

       

MOV AX,4C00H

INT 21H  

CODE ENDS

END START     

A.ds,SUM[2]             B.es,SUM[2]

C.es,byte ptr SUM[0]    D.ds,byte ptr SUM[0]

  1. 以下程序实现.将data段中的大写字母转换为小写,小写字母转换为大写。补全程序。(   )

ASSUME CS:CODE

DATA SEGMENT

    DB "heLLo"

DATA ENDS

CODE SEGMENT

START:MOV AX,DATA

       MOV DS,AX

       MOV BX,0

   

       MOV CX,5

S:ADD BYTE PTR [BX],00100000B

       AND BYTE PTR [BX],_________

       OR BYTE PTR [BX],01000000B

       INC BX

       LOOP S

       MOV AX,4C00H

       INT 21H

CODE ENDS

END START

A.01h      B.00h      C.80h     D.7fh       E.前几个选项都不对

  1. 下面的程序统计1000:0处的32个字节型整数中,其值在[-64,-16]中的数据的个数,结果存在DX中。补全这个程序。( )

mov ax,1000h

mov ds,ax

mov bx,0

mov dx,0

mov cx,32

s:   mov al,0

________

cmp al,16

________

cmp al,64

________

inc dx

s0: inc bx

loop s

  1. or al,[bx];jmp ax;shr al,1
  2. add al,[bx];jnb s0;jna s0
  3. and al,[bx];je s0;je s
  4. sub al,[bx];jb s0;ja s0

E.  前几个选项都不对。

  1. 补全程序,使其可以实现将“assembly”复制到0:200处的内存空间中。(   )

    assume cs:code,ds:data

data segment

        db 'assembly'

data ends

code segment

start:

    mov ax,data

    mov ds,ax

    mov si,___

    mov ax,0

    mov es,ax

    mov di,___

    mov cx,___

    std

    rep movsw

    mov ax,4c00h

    int 21h

code ends

end start

A.6,206h,4         

B.8,208h,4

C.0,200h,8

D.0,200h,4

  1. 补全程序,使其可以实现(AX)=2^10。(   )

       mov ax,2

mov cx,___

    s: add ax,ax

       loop s

    A.8         B.9         C.10              D.11 

  1. 以下程序执行后,ax的值是(   )。

mov ax,0

    push ax

    popf

    mov ax,0fff0h

    add ax,88h

    pushf

    pop ax

    and al,11000101b

    and ah,10001000b

参考.标志寄存器

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

A. 1h     B. 804h    C. 5h       D. 前三个选项都不对

assume cs:code

stack segment

 db 16 dup(0)

stack ends

code segment

start: mov ax,stack

         mov ss,ax

         mov sp,16

mov ax,sp

push cs

call s

sub ax,sp

s:pop ax

       mov ax,4c00h

         int 21h

code ends

end start

这个程序加载到内存后,其一段程序所在的内存空间的情况如下:

内存地址   机器码      所对应的源程序中的指令

1000:0008  8BC4        mov ax,sp

1000:000A  0E          push cs

1000:000B  E80200      call s

1000:000E  2BC4        sub ax,sp

1000:0010  58        s:pop ax

执行这个程序,“pop ax”执行后,ax的值为(  )。

A. 8h      B. 0bh    C. 0eh    D. 1000h   E. 2    F. 10h

  1. 以下程序计算(345-333)^2,结果存在dx.ax中。补全这个程序。(   )

assume cs:code

code segment

start: mov ax,333

push ax

mov ax,345

push ax

call calc

mov ax,4c00h

int 21h

calc:  push bp

mov bp,sp

mov ax,_____

sub ax,_____

mov bp,ax

mul bp

pop bp

ret 4

code ends

end start

A.[bp+6],[bp+8]       B.[bp+4],[bp+6]

C.[bp+2],[bp+4]       D.[bp+4],[bp+2]

  1. 以下程序统计0f123:0处的32个字节中,大小在(15,100]的数据的个数,结果存在dx中。补全这个程序。(   )

mov ax,0f123h

mov ds,ax

mov bx,0

mov dx,0

mov cx,32

s: mov al,[bx]

cmp al,15

_________

cmp al,100

_________

inc dx

s0:inc bx

loop s

A. jna s0,jnb s0        B. ja s0,jb s0

C. jnb s0,jna s0        D. jna s0,ja s0

  1. 以下程序执行到(cx)=0时,CPU几次修改IP?(  )

mov cx,2

s:       mov ax,bx

loop s

A. 3      B. 5        C. 6      D. 7     E. 8     F. 9

  1. 用debug查看内存,结果如下.

  2000:0200 00 01 02 03 04 05 06 07-08 09 0A 0B 0C 0D 0E 0F
2000:0210 10 11 12 13 14 15 16 17-18 19 1A 1B 1C 1D 1E 1F

下面的程序执行后,ax、cx、dx中的内容依次是(   )。

mov ax,1fffh

mov ds,ax

mov ss,ax

mov bx,210h

mov sp,bx

mov ax,[bx]

mov cx,[bx+12h]

pop dx
 

A.未知,未知,未知            B.0100h,1312h,未知

C.0001h,1213h,1415h         D.0100h,1312h,0100h

  1. 补全程序,使其可以实现.累加a处的8个数据,结果存在b处的双字中。(   )

assume cs:code,ds:data

data segment

a dw 1,2,3,4,5,6,7,8

b dd 0

c dw a,b

data ends

code segment

.......

mov ax,4c00h

int 21h

code ends

end start

A. start: mov ax,data

mov ds,ax

mov si,0

mov cx,8

s: mov ax,a[si]

add b[0],ax

adc b[2],ax

add si,2

loop s

B. start: mov si,0

mov cx,8

s: mov ax,a[si]

add word ptr b[0],ax

adc word ptr b[2],0

add si,1

loop s

C. start: mov ax,seg a

mov ds,ax

mov si,0

mov cx,8

s: mov ax,a[si]

mov bx,offset b

          add word ptr[bx],ax

adc word ptr 2[bx],0

add si,2

loop s

D. start: mov ax,data

mov ds,ax

mov si,0

mov cx,8

s: mov ax,a[si]

mov bx,word ptr c[0]

add word ptr [bx],ax

mov bx,word ptr c[2]

adc word ptr[bx],0

add si,2

loop s

  1. 补全程序,使其可以实现.将data段中的字符串转化为大写。(   )

assume cs:code

data segment

db 'conversation',0

data ends

code segment

start:

mov ax,data

mov ds,ax

mov si,0

mov cx,12

call capital

mov ax,4c00h

int 21h

capital:

......

code ends

end start

A.     or byte ptr [si],00100000b

inc si

loop capital

ret

B.     mov cl,[si]

mov ch,0

jcxz ok

sub word ptr [si],20h

inc si

inc si

jmp short capital

ok: ret

C.     mov cl,11011111b

s: push cx

and  byte ptr [si],cl

inc si

pop cx

loop s

ok: ret

D.     mov cl,[si]

mov ch,0

inc cx

loop ok

ret

ok: and byte ptr [si],11011111b

inc si

jmp capital

  1. 以下程序中所有的转移指令的机器码都是两个字节。用一条指令补全程序,使其可以由代码段中的程序段返回。(   )

assume cs:code

code segment

   mov ax,4c00h

   int 21h

start:

   nop

   nop

   push cs

   pop ds

   mov si,offset o

mov di,offset start

   mov ax,ds:[si]

   mov ds:[di],ax

   mov cx,-2

   s:

   _____________

   jcxz start

o: loop s

   code ends

end start

A.add cx,2(机器码:83H C1H 02H)

B.add cx,1(机器码:83H C1H 01H)

C.inc cx(机器码:41H)

D.以上都不对

  1. 用debug查看内存单元,结果如下。则执行以下程序,ax的值是多少?(   )

1100:F000  BE 00 06 00 6A 22

        MOV AX,2000H

        MOV DS,AX

        MOV BX,0000H

        MOV SI,0

        MOV AX,2[BX][SI]   

        INC SI

        ADD AX,2[BX][SI]    

        INC SI

        MOV DI,SI

        SUB AX,2[BX][DI]  

   

A.9c06h       B.479ch     C.7006h      D.8c70h

  1. 下面的程序执行后,ax中的数值为多少?

内存地址 机器码 汇编指令

1000:0 b8 00 00 mov ax,0

1000:3 e8 01 00 call s

1000:6 40 inc ax

1000:7 58 s:pop ax

  1. 下面的程序执行后,ax中的数值为多少?

内存地址 机器码 汇编指令

1000:0 b8 00 00 mov ax,0

1000:3 9a 09 00 00 10 call far ptr s

1000:8 40 inc ax

1000:9 58 s:pop ax

add ax,ax

pop bx

add ax,bx

  1. 下面的程序执行后,ax中的数值为多少?

内存地址 机器码 汇编指令

1000:0 b8 06 00 mov ax,6

1000:2 ff d0 call ax

1000:5 40 inc ax

1000:6 mov bp,sp

add ax,[bp]

  1.  程序如下。

assume cs:code

data segment

data ends

code segment

start: mov ax,data

mov ds,ax

mov bx,0

jmp word ptr [bx+1]

code ends

end start

若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据?

  1. 程序如下。

assume cs:code,ds:data

data segment

dd 12345678h

data ends

code segment

start: mov ax,data

mov ds,ax

mov bx,0

mov [bx],_______

mov [bx+2],_________

jmp dword ptr ds:[0]

code ends

end start

补全程序,使jmp指令执行后,CS:IP指向程序的第一条指令。

  1. 用Debug查看内存,结果如下:

2000:1000 BE 00 06 00 00 00 ......

则此时,CPU执行指令:

mov ax,2000H

mov es,ax

jmp dword ptr es:[1000H]

后,(CS)=? , (IP)=?

  1. 补全下面的程序,统计F000:0处32个字节中,大小在[32,128]的数据的个数。

mov ax,0f000h
mov ds,ax

mov bx,0
mov dx,0
mov cx,32
s:mov al,[bx]
cmp al,32
_________

cmp al,120
__________

inc dx
s0:inc bx
loop s

  1. 补全下面的程序,统计F000:0处32个字节中,大小在(32,128)的数据的个数。

mov ax,0f000h
mov ds,ax

mov bx,0
mov dx,0
mov cx,32
s:mov al,[bx]
cmp al,32
__________

cmp al,120
___________

inc dx
s0:inc bx
loop s

实验1~实验九

猜你喜欢

转载自blog.csdn.net/weixin_73961973/article/details/131440538