3.9 分别说明下列每组指令中的两条指令的区别。
①MOV AX, TABLELEA AX, TABLE②AND BL, 0FHOR BL, 0FH③JMP SHORT L1JMP NEAR PTR L1④MOV AX, [BX]MOV AX, BX⑤SUB DX, CXCMP DX, CX⑥MOV [BP][SI] , CLMOV DS: [BP][SI] , CL答:①第一条指令将变量名TABLE 确定的一个字数据传送到AX 中;第二条指令取变量名TABLE 的16 位有效地址值传送到AX 中。
②第一条指令将BL 中的内容和立即数0FH 相与,结果回送到BL 中;第二条指令将BL 中的内容和立即数0FH 相或,结果回送到BL 中。
③第一条指令为段内无条件短程转移,跳转的范围不得超过带符号的8 位二进制数表示的字节范围;第二条指令为段内无条件近程转移,跳转的范围不得超过带符号的16 位二进制数表示的字节范围。
④第一条指令源操作数为存储器,将BX 的内容确定的相邻两个存储单元中的内容传送到AX 中;第二条指令源操作数为寄存器,将BX 的内容传送到AX 中。
⑤第一条指令将DX 的内容减去CX 的内容,结果回送到DX 中;第二条指令只是将DX 的内容和CX 的内容相减作大小比较,不回送结果。
⑥第一条指令将CL 的内容传送到堆栈段中由BP+SI 确定的单元中;第二条指令将CL 的内容传送到数据段中由BP+SI 确定的单元中2.6 什么是逻辑地址?什么是物理地址?在实模式下,如何求存储器的物理地址?设一个16 字的数据存储区,它的起始地址为70A0H:DDF6H.。
写出这个数据区的首字单元和末字单元的物理地址。
答:(1)逻辑地址由段基址(存放在段寄存器中)和偏移地址(由寻址方式提供)两部分构成,它们都是无符号的16 位二进制数。
逻辑地址是用户进行程序设计时采用的地址。
(2)物理地址是1M 内存空间中每个存储单元惟一的地址,由20 位二进制数构成。
物理地址是CPU 访问内存时使用的地址。
当用户通过编制程序将16 位逻辑地址送入CPU的总线接口部件BIU 时,地址加法器通过地址运算变换为20 位的物理地址。
(3)20 位物理地址的计算公式为:物理地址=段基址×16+偏移地址首字单元的物理地址=70A0H×16+DDF6H=7E7F6H末字单元的物理地址=7E7F6H+20H-2 =7E816H-2=7E814H3.1 分别指出下列指令中源操作数和目标操作数的寻址方式。
①MOV SI, 100寄存器立即数②MOV CX, DATA[SI] 寄存器寄存器间接③ADD AX, [BX][DI] 寄存器基址加间址④SUB AH, DH寄存器寄存器⑤AND DL, [BX+SI+20H] 寄存器基址加间址⑥MOV [BP+1054H], AX基址寄存器寄存器⑦OR [DI+3000H], BX寄存器间接寄存器⑧XOR [BP+SI], AL基址加间址寄存器⑨MOV EAX, EBX寄存器寄存器⑩MOV EAX, [ECX][EBX] 寄存器基址加间址11 MOV EAX, [ESI][EDX×2] 寄存器基址加比例间址12 MOV EAX, [ESI×8] 寄存器比例间址3.2 设DS=1000H, BX=2865H, SI=0120H,偏移量D=47A8H,试计算下列各种寻址方式下的有效地址,并在右边答案中找出正确答案,将它的序号填入括号内:①使用D 的直接寻址( ) A. 2865H②使用BX 的寄存器间接寻址( ) B.700DH③使用BX 和D 的寄存器相对寻址( )C. 47A8H④使用BX、SI 和D 的相对基址变址寻址( ) D. 2985H⑤使用BX、SI 的基址变址寻址( ) E.712DH答:①(C)②(A)③(B)④(E)⑤(D)3.12 编写一程序段,实现下述要求。
①将存储器中1A00H 单元中的一个字节数据传送到1B00H 单元中;②使AX 寄存器的低四位清0,其余位不变;③使AL 寄存器的低四位保持不变,高四位取反;④使DH 寄存器的低四位为1,高四位不变。
答:①MOV AL, [1A00H]MOV [1B00H], AL②AND AX, 0FFF0H③XOR AL, 0F0H④OR DH, 0FH3.15 试编写出将内存2500H 开始的256个字节单元清0 的程序。
答:MOV CX, 256MOV AL, 0MOV BX, 2500HAA: MOV [BX], ALINC BXLOOP AAHLT4.1 将下列左边各项与右边的名词对应起来,找出正确答案的序号填入括号中。
①使计算机执行某种操作的命令()A.代码段②表示计算机执行某种操作的符号()B.源程序③使汇编程序执行某种操作的命令()C.汇编程序④用汇编语言或高级语言编写的程序()D.指令⑤以机器码指令组成的程序()E.伪指令⑥指出指令在程序中位置的符号地址()F.编译程序⑦指出数据存储单元的符号地址()G.目标程序⑧将高级语言的程序翻译成机器码程序的实用程序()H.助记符⑨存放指令机器码的存储器区段()I.标号⑩将汇编语言程序翻译成机器码程序的实用程序()J.变量答:⑨④⑩①③⑧⑤②⑥⑦4.10 已知:ORG 0200HARY DW -1,2,-3,-4CNT DW $-ARYVAR DW ARY,$+4┇MOV AX,ARYMOV BX,OFFSET VARMOV CX,CNTMOV DX,VAR+2LEA SI,ARY┇此段程序执行后,AX=(-1 ),BX=(020AH),CX=(8 ),DX=(020AH),SI=(0200H )。
4.11 给出符号定义语句如下:FIRST DB ‘ABCD’,3,?,0FHSECOND DB ?Y EQU SECOND-FIRST求Y 的值是多少?答:Y 的值是7。
4.14 对于下面的数据定义,写出各条指令执行后的结果。
AA DB ?BB DW 10 DUP(1)CC DB ‘1 2 3 4 5’①MOV AX,TYPE AA AX=()②MOV AX,TYPE BB AX=()③MOV CX,LENTH BB CX=()④MOV CX,LENGTH CC CX=()⑤MOV BX,SIZE BB BX=()答:答案如下:①MOV AX,TYPE AA AX=(0001H )②MOV AX,TYPE BB AX=(0002H )③MOV CX,LENTH BB CX=(000AH )④MOV CX,LENGTH CC CX=(0001H )⑤MOV BX,SIZE BB BX=(0014 H )4.15 分析下列程序段,指出在什么情况下该段程序的执行结果为AH=0?BEGIN:IN AL,5FHTEST AL,80HJZ EXITMOV AH,0JMP DONEEXIT:MOV AH,0FFHDONE:HLT4.16 阅读程序并回答问题:①在(a)(b)处填写与其左边指令等效的指令或指令序列;②程序的功能是(),所依据的算式是()。
③程序执行后,DEDT 单元内容为()。
DATA SEGMENTBITD DW 128H,64H,32H,16H,8H,4H,2H,1HSOCB DB 0D2HDEDT DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV BL,SOCBLEA SI,BITD (a)MOV CX,8MOV AX,0L1:SHL BL,1JNC L2ADD AL,[SI]DAAMOV DL,ALADC AH,[SI+1]MOV AL,AHDAAMOV AH,ALMOV AL,DLL2:ADD SI,2LOOP L1 (b)MOV DEDT,AXMOV AH,4CHINT 21HCODE ENDSEND START答:①(a)MOV SI, OFFSET BITD(b)LOOPNZ L1 或LOOPNE L1(执行ADD SI,2 指令,ZF 不可能为0,因而可用此指令代替。
)②程序的功能是:根据给定的逻辑尺0D2H对数据区BITD 中BCD 数进行BCD 加法;所依据的算式是(128H+64H+16H+2H)。
③程序执行后,DEDT 单元内容为(210H)4.20 逐条注释下列两个程序的每条指令,并说明它们的功能:①LEA BX,ARRAY ;取数组ARRAY 的偏移地址并存入寄存器BXLEA DI,RESULT ;取数组RESULT 的偏移地址并存入寄存器DIMOV CL,4 ;给寄存器CL 赋初值4AGAIN:MOV AL,[BX] ;将数组ARRAY的第一个数存入寄存器ALTEST AL,80H ;测试AL 的最高位JZ NEXT ;若AL 最高位为0(正数),转到NEXTNEG AL ;若AL 最高位为1(负数),对寄存器AL 中的;数求补NEXT:MOV [DI],AL ;将结果存入REAULT 数组INC BX ;BX 值加1,地址指针指向ARRAY 数组的下;一个数INC DI ;DI 值加1,地址指针指向RESULT 数组的下;一个数DEC CL ;寄存器CL 值减1JNZ AGAIN ;若CL 值不为0,转向AGAIN 继续执行程序段功能:将数组ARRAY 中的4 个字节数求补,结果存入数组RESULT 中②MOV AL,0 ;将寄存器AL 清0MOV SI,﹣1 ;给寄存器SI 赋初值﹣1MOV CX,100 ;给寄存器CX 赋初值100LOP:INC SI ;SI 加1MOV AL,A1[SI] ;将数据缓冲区A1 中的数存入寄存器ALADD AL,A2[SI] ;将数据缓冲区A2 中的相应数与AL 相加MOV SUM [SI],AL ;将结果存入数据缓冲区SUM 中LOOPNZ LOP ;若CX-1≠0 且ZF=0,转向LOP 继续执行JZ NEXT ;若ZF=1,转向NEXT 继续执行ZERO:RET ;子程序返回NEXT:INC CX ;寄存器CX 值加1 JMP ZERO ;无条件转向ZERO 继续执行程序段功能:将长度均为100 的数据缓冲区A1 和A2 中的相应数相加,结果存入数据缓冲区SUM 的相应位置,若相加结果为0 则退出循环。