第四章课后作业(6—27)6.试按下列要求分别编制程序段。
(1)把标志寄存器中符号位SF置“1”。
(2)寄存器AL中高、低四位互换。
(3)由寄存器AX、BX组成一个32位带符号数(AX中存放高16位),试求这个数的负数。
(4)现有三个字节存储单元A、B、C,在不使用ADD和ADC指令的情况下,实现(A)+(B) C。
(5)用一条指令把CX中的整数转变为奇数(如原来已是奇数,则CX中数据不变,如原来是偶数,则(CX)+1 形成奇数)。
答:(1) LAHFOR AH,80HSAHF(2) MOV CL,4ROL AL,CL(3) MOV CX,0NEG BXJC CHGJMP GOCHG: MOV CX,1GO: NEG AXSUB AX,CX(4) MOV CL,AMOV AL,BMOV X,ALCHECK:INC XDEC CLJNZ CHECK(5) OR CX,0001H7.试给出下列各指令的机器目标代码。
(1)MOV BL,12H [SI](2)MOV 12H [SI],BL(3)SAL DX,1(4)AND 0ABH [BP] [DI],1234H答:(1)100010 1 0 01 011 100 00010010=8A5C12H(2)100010 0 0 01 011 100 00010010=885C12H(3)110100 0 1 11 100 010=0D1E2H(4)100000 0 1 10 100 011 10101011 00000000 00110100 00010010=81A3AB003412H8.执行下列指令:STR1 DW ‘AB’STR2 DB 16DUP(?)CNT EQU $-STR1MOV CX,CNTMOV AX,STR1HLT执行完成之后,寄存器CL的值是多少?寄存器AX的值是多少?答:因为CNT=16+2=18,所以CX=18=0012H,所以CL=12H=0001,0010;AX中装入的是‘AB’的ASCII码值,其中‘A’在高位AH中,‘B’在低位AL 中,所以AX=4142H=0100,0001,0100,0010。
9.JMP FAR PTR ABCD (ABCD是符号地址)的转移方式是什么?答:段间直接转移。
10.按下列指令写出相应指令或程序段。
(1)写出两条使AX寄存器内容为0的指令。
(2)使BL寄存器中的高、低4位互换。
(3)现有两个带符号数分别在X1和X2变量中,求X1/X2,商和余数分别送入Y1和Y2中。
(4)屏蔽BX寄存器中的b4、b6、b11位。
(5)将AX寄存器的b4、b14位取反,其它位不变。
(6)测试DX寄存器的b0、b9位是否为“1”。
(7)使CX寄存器中的整数变为奇数(如原已经是奇数,则不变)。
答:(1)MOV AX,0 XOR AX,AX(2)MOV CL,4ROL BL,CL(3)MOV AX,X1CWDIDIV X2MOV Y1,AXMOV Y2,DX(4)AND BX,1111 O111 1O10 1111(5)XOR AX,0100 0000 0001 0000(6)MOV AX,DXRCR AX,1JC B0Y ;转向表示b0是1的标号为B0Y的程序段MOV AX,DXMOV CL,10ROR AX,CLJC B9Y ;转向表示b9是1的标号为B9Y的程序段(7)OR CX,0001H11.写出把首地址为BLOCK的字数组的第6个字送入AX寄存器的指令,要求使用下列寻址方式。
(1)寄存器间接寻址;(2)直接寻址;(3)基址寻址;(4)基址变址相对寻址。
答:(1)LEA DI,BLOCKADD DI,10MOV AX,[DI](2)MOV AX,[BLOCK+10](3)LEA BX,BLOCKADD BX,10MOV AX,[BX](4)LEA BX,BLOCKMOV SI,0MOV AX,[BX+SI+0AH]12. 指令“SUB AX,BX”执行后,CF=1,说明最高有效位发生了什么现象?对无符号数来说,操作结果发生了什么现象?答:CF=1说明最高有效位发生进位;对无符号数,操作结果产生溢出。
13. 在1000H单元中有一条二字节指令JMP SHORT LAB,如果其中的偏移量分别为30H、6CH、0B8H,则转向地址LAB的值分别为多少?答:1000H*10H+2H+30H=10032H1000H*10H+2H+6CH=1006EH1000H*10H+2H+0B8H=100BAH14.(AL)=9AH,(BL)=0BCH,当分别进行下列指令运算后,写出标志位ZF、PF、CF、SF的内容。
(1)ADD AL,BL(2)SUB AL,BL(3)AND AL,BL(4)OR AL,BL(5)XOR AL,BL答:(AL)=9AH=1001 1010 ;(BL)=0BCH=1011 1100(1)1001,1010+1011,1100=1,0101,0110所以ZF=0,PF=1,CF=1,SF=0(2)1001,1010-1011,1100=1101,1110所以ZF=0,PF=1,CF=1,SF=1(3)1001,1010和1011,1100按位与得1001,1000所以ZF=0,PF=0,CF=0,SF=1(4)1001,1010和1011,1100 按位或得1011,1110所以ZF=0,PF=1,CF=0,SF=1(5)1001,1010和1011,1100按位异或得0010,0110所以ZF=0,PF=0,CF=0,SF=0(1)MOV DX,2[BX] ;DX=06H BX=0004H(2)PUSH CX ;SP=1FFEH [SP]=0FFH(3)MOV CX,BX ;CX=0004H BX=0004H(4)TEST AX,01 ;AX=8094H CF=0(5)MOV AL,[SI] ;AL=87H(6)ADC AL,[DI] ;AL=0CCH CF=0DAA ;AL=0011 0010(7)INC SI ;SI=0009H(8)DEC DI ;DI=0009H(9)MOV [DI],AL ;[DI]=94H DX=17C6H(10)XCHG AX,DX ;AX=17C6H DX=8094H(11)XOR AH,BL ;AH=84H BL=04H(12)JMP DX ;IP=17C6H16.如果TABLE为数据段中0032单元的符号名,其中存放的内容为1234H。
当执行指令“MOV AX,TABLE”和“LEA AX,TABLE”后,(AX)中的内容分别为多少?答:执行“MOV AX,TABLE”后(AX)=1234H;执行“LEA AX,TABLE”后(AX)=0032H。
17.设(SP)=0FFFEH,执行CALL FAR PTR OPRD后,(SP)=?答:(SP)=SP-04H=0FFFAH18.若某数据区的开始地址为A7F0H:2B40H,则该数据区的首字单元和32个字的末字单元的物理地址分别为多少?答:首字单元物理地址为:AAA40H、AAA41H;32字的末字单元物理地址为:AAAA2H、AAAA3H。
19、若(SP)=2000H,(AX)=3355H,(BX)=4466H,下列程序段:PUSH AXPUSH BXPOP DX执行后有关寄存器内容为(AX)=?,(DX)=?,(SP)=?。
答:(AX)=3355H (DX)=4466H (SP)=1FFEH20.设(SS)=2250H,(SP)=0140H,若在堆栈中存入5个数据,则栈顶的物理地址是多少?如果再从堆栈中取出3个数据,则栈顶的物理地址是多少?答:存入五个数据后,栈顶的物理地址为:22636H;再取出三个数据后,栈顶的物理地址为:2263CH。
21.分别指出下列两个程序段的功能。
(1)MOV CX,10 (2)CLDLEA SI,FIRST LEA DI,[0404H]LEA DI,SECOND MOV CX,0080H REP MOVSB XOR AX,AXREP STOSW答:(1)将数据段中首地址为FIRST的10个字节数据传送到附加段首地址为SECOND的内存区中。
(2)将附加段从偏移地址地址为0404H开始向后的128个字存储单元清零。
22.若(SP)=2800H,使用两种方法实现(SP)=27FEH。
答:(1)MOV AX,1234HPUSH AX(2)MOV AX,1234HCALL AX23.设(IP)=3D8FH,(CS)=4050H,(SP)=0F17CH。
当执行完CALL 2000:009AH 后,IP、CS、SP、[SP]、[SP+1]、[SP+2]和[SP+3]的内容分别为什么?答:IP=009AH,CS=2000H,SP=0F178H,[SP]=8FH,[SP+1]=3DH,[SP+2]=50H,[SP+3]= 40H24.(1)试编写汇编程序段完成以下功能:将数据段中100个字符的字符串从内存的BUFFER1搬移到内存的BUFFER2中去;(2)试编写汇编程序段完成以下功能:将数据段中100个字的数据块BLOCK1搬移到同一个数据段的BLOCK2中去。
答:(1)LEA SI,BUFFER1LEA DI,BUFFER2MOV CX,100CLDREP MOVSB(2)LEA SI,BLOCK1LEA DI,BLOCK2MOV CX,100CLDREP MOVSW25. 试编写汇编程序段完成以下功能:比较DEST和SOURCE中的500个字节,找出第一个不相同的字节,如果找到,则将SOURCE中的这个数送AL中。
答: LEA SI,DESTLEA DI,SOURCEMOV CX,500CLDREPE CMPSBJCXZ NODEC DIMOV AL,BYTE PTR [DI]NO: HLT26. 试编写汇编程序段完成以下功能:求最大值,若自BLOCK开始的内存缓冲区中,有100个带符号的数,希望找到其中最大的一个值,并将它放到MAX单元中。
答: LEA DI,BLOCKMOV CX,100MOV AX,[DI]CHECK: ADD DI,2CMP AX,[DI]JGE NEXTMOV AX,[DI]NEXT: LOOP CHECKMOV MAX,AX27.指出下列32位指令源操作数的寻址方式,并指出指令执行后有关寄存器的内容。
(1)LEA ECX ,[EAX*2+14CH] ;执行前:(EAX)=0548 901AH(ECX)=xxxx xxxxH(2)LEA EAX ,TAB[EDX][4*ESI] ;执行前:(EAX)=xxxx xxxxH(ESI)=0653 3A44H(EDX)=0892 ABDFH[TAB] =0000 0120H(3)MOV EAX,mem32 ;执行前:(EAX)=xxxx xxxxH[men32]=0892 ABDFH(4)PUSH 12345678H ;执行前:(ESP)=1234 5678HSS:[FFFF F31CH]=xxxx xxxxH 答:(1)寄存器相对寻址。