文档库 最新最全的文档下载
当前位置:文档库 › answer2

answer2

answer2
answer2

1E H

30H

41H

42H

43H

0F F H

00H

0C A H

0F F H

00H

0F E H

0F F H

44H

43H 0020H

002E H X Y

习题二

2.1 某数据段内有如下数据定义:

X db 30, 30H, …ABC?, 2-3, ?, 11001010B

dw 0FFH,-2, “CD”

Y dd 20 dup(15, 3 dup(?), 0)

Z db 3 dup(?)

W dw Z-X

假设变量X的偏移地址为20H。

(1)按照图2-1的格式写出变量X各数据在内存中的具体位置和相关内存单元的值。

(2)写出变量Y,Z的偏移地址。

(3)写出变量W的值

答:(1)变量X各数据在内存中的具体位置和相关内存单元的值

如右图。

(2)变量Y的偏移地址为002EH;

变量Z的偏移地址为002EH+4×5×20=01BEH

(3)变量W的值等于变量Z和X偏移地址之差

01BEH-0020H=019EH

它等于变量X、Y所占用内存单元的字节数。

2.2 80x86指令系统有哪几种类型的指令操作数?比较使用不同

类型操作数后的指令长度和指令执行时间。

答:80X86指令系统按照长度划分,有以下四种指令操作数:

(1)寄存器操作数,指令短,执行速度快;

(2)立即操作数,指令较长,执行速度快;

(3)寄存器间接寻址和基址变址寻址表示的内存储器操作数,这类指令长度较短,执行速度较慢(需要访问存储器);

(4)直接地址,寄存器相对寻址,相对的基址变址寻址表示的内存储器操作数,这类指令长度较长,执行速度较慢(需要计算物理地址,访问存储器)。

2.3 下列指令的源操作数段基址在哪个段寄存器中?

(1)MOV AX, [BP][SI] (2)MOV AX, CS:8[DI]

(3)MOV AX, 2[EBP*1] (4)MOV AX, FS:4[ESP]

(5)MOV AX, 2[EBP][EAX] (6)MOV AX, [ECX][EBP*4]

(7)MOC AX, [EDX][EBP] (8)MOV AX, ES:10[EBP][EAX*2]

答:各指令源操作数段基址使用的段寄存器如下:

(1)SS(2)CS(3)SS(4)FS

(5)SS(6)DS(7)DS(8)ES

2.4 判断下列指令是否正确。若不正确,指出错误原因

(1)MOV AX, [EBX] (2)MOV SI, DL

(3)MOV EBP, [ESP][EAX*3](4)LEA AX, 3006H

(5)MOV [BP][DI], 0 (6)MOV [SI], [DI]

(7)MOV ES, 1000H (8)MOV AX, X+2

(9)MOV AX, CX+2 (10)MOV [EAX][EAX*2], AL

答:(1)指令MOV AX, [EBX] 是正确的。

(2)指令MOV SI, DL是错误的,两个操作数类型不匹配。

(3)指令MOV EBP, [ESP][EAX*3] 是错误的,比例因子不能为3。

(4)指令LEA AX, 3006H是错误的,LEA指令的源操作数必须为内存操作数。

(5)指令MOV [BP][DI], 0是错误的,操作数类型无法确定。

(6)指令MOV [SI], [DI] 是错误的,不能同时出现两个内存操作数。

(7)指令MOV ES, 1000H是错误的,装载段寄存器时,源操作数不能为立即数。

(8)如果“X”是用常数表达式定义的符号(例如:X EQU 5+6),或者是用“DW”定义的内存变量,指令MOV AX, X+2是正确的。否则这条指令是错误的。

(9)指令MOV AX, CX+2是错误的,源操作数表达式CX+2不是一个可以直接计算的“常数表达式”。

(10)指令MOV [EAX][EAX*2], AL是正确的。

2.5 现有(DS)=2000H ,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=0B7H,(21203H)=65H,说明下列指令执行后AX寄存器的内容。

(1)MOV AX, 1200H

(2)MOV AX, BX

(3)MOV AX, [1200H]

(4)MOV AX, [BX]

(5)MOV AX, 1100H[BX]

(6)MOV AX, [BX][SI]

(7)MOV AX, 1100H[BX][SI]

答:(1)指令MOV AX, 1200H执行后,(AX)=1200H (立即数操作数)。

(2)指令MOV AX, BX执行后,(AX)=0100H (寄存器操作数)。

(3)指令MOV AX, [1200H] 执行后,(AX)=4C2AH(直接地址,EA=1200H)

(4)指令MOV AX, [BX] 执行后,(AX)=3412H(寄存器间接寻址,EA=0100H)(5)指令MOV AX, 1100H[BX] 执行后,(AX)= 4C2A H(相对地址,EA=1200H)(6)指令MOV AX, [BX][SI] 执行后,(AX)=7856H(基址变址寻址,EA=0102H)(7)指令MOV AX, 1100H[BX][SI] 执行后,(AX)=65B7H

(相对基址变址寻址,EA=1202H)

2.6 已经定义字符串MYSTRING如下:

MYSTRING DB …A Sample for addressing.?

用适当的指令把这个字符串的第5,12个字符(注:第0个字符是?A?)送入BX寄存器。

答:可以用如下两条指令完成:

MOV BL, MYSTRING[5]

MOV BH, MYSTRING[12]

2.7 下面两条指令的功能有什么区别?

MOV AX, BX

MOV AX, [BX]

答:指令“MOV AX, BX”把BX寄存器的内容装入到AX中。

指令“MOV AX, [BX]”把内存储器一个字的内容装入AX寄存器。该字的段基址在DS中,偏移地址在BX中。

2.8 已经定义数据段如下:

DA TA SEGMENT

NUM=56

X DB NUM

Y DB 27

Z DW 148

DA TA ENDS

指出下列指令中的错误:

(1)MOV Y, X (2)MOV BL, 04B8H

(3)MOV AL, Z (4)MOV [BX], 3

(5)MOV [BX], [DI] (6)MOV DS, DA TA

(7)MOV NUM, AX (8)MOV ES, DS

(9)MOV AX, FLAGS (10)MOV CS, AX

答:(1)指令MOV Y, X 同时出现了两个存储器操作数。

(2)指令MOV BL, 04B8H 操作数类型不匹配(04B8H是16位立即数,BL是8位寄存器)。

(3)指令MOV AL, Z 操作数类型不匹配(Z是16位操作数,BL是8位寄存器)。

(4)指令MOV [BX], 3 操作数类型不能确定。

(5)指令MOV [BX], [DI] 出现了两个存储器操作数。

(6)指令MOV DS, DA TA不能把立即数装入段寄存器。

(7)指令MOV NUM, AX 立即数不能用作目的操作数。

(8)指令MOV ES, DS 不能在段寄存器之间直接传输。

(9)指令MOV AX, FLAGS中,FLAGS寄存器只能隐含在少量指令中使用。

(10)指令MOV CS, AX 中,CS寄存器不能用作目的操作数。

2.9 用适当的指令,把下面字符串STRING中的“&”字符用空格代替。

STRING DB “The Date is FEB&03”

答:可以使用如下指令:

MOV STRING[15], 20H ; 20H是空格的ASCII代码

相关文档