第3章指令系统3.9 设段寄存器DS=1000H,SS=2000H,ES=3000H,通用寄存器BX=4000H,BP=5000H,SI=6000H,DI=7000H。
在下列各指令中指出存储器操作数的寻址方式,求出有效地址EA、物理地址PA,并分别用物理地址和逻辑地址说明指令执行结果。
(1)MOV CX, [2300H]直接寻址EA=2300HPA=DS*16+EA=1000H*16+2300H=12300H 执行结果:(12300H)→CL,(12301H)→CH (2)MOV BYTE PTR [BX], 8FH寄存器间接寻址EA=BX=4000HPA=DS*16+EA=1000H*16+4000H=14000H 执行结果:8FH→(14000H)(3)MOV DH, [BP+3000H]基址寻址EA=BP+3000H=8000HPA=SS*16+EA=2000H*16+8000H=28000H 执行结果:(28000H)→DH(4)MOV ES: [SI+1210H], AX变址寻址EA=SI+1210H=7210HPA=ES*16+EA=3000H*16+7210H=37210H 执行结果:AL→(37210H),AH→(37211H) (5)MOV [BX+DI+50H], AL基址变址位移寻址EA=BX+DI+50H=0B050HPA=DS*16+EA=1000H*16+0B050H=1B050 H执行结果:AL→(1B050H)(6)INC WORD PTR [BX+SI]基址变址寻址EA=BX+SI=0A000HPA=DS*16+EA=1000H*16+0A000H=1A000 H执行结果:(1A000H)中存放的字的值加13.11 指出下列指令中源操作数的寻址方式。
(1)MOV BL, 0F9H 立即寻址(2)ADD [BX], SI 寄存器寻址(3)SUB CL, [4000H] 直接寻址(4)CMP DX, [SI] 寄存器间接寻址(5)AND SL, [BX+1] 基址寻址(6)OR BP, [DI+2100H] 变址寻址(7)XOR AX, [BP+SI] 基址变址寻址(8)MOV CX, 300 立即寻址3.12 下列指令都是非法的,指出各指令错在哪里?(1)MOV SI, AH两个操作数字长不一致(2)MOV 70H, BL立即数不能做目的操作数(3)MOV CX, F123H十六进制的数以字母打头必须在前面补0 (4)MOV [BX], 6AH两个操作数的字长不确定(5)MOV ES, 5000H立即数不能直接送段寄存器(6)MOV [DI], [3000H]两个操作数不能同为内存操作数(7)MOV DS, SS两个操作数不能同为段寄存器(8)MOV CS, AX不能对CS赋值(9)MOV AL, [CX]寄存器间接寻址中不能使用CX(10)MOV [BX+BP], DX存储器寻址方式中表示有效地址不能同为两个基址寄存器(11)MOV BH, [SI+DI+2]存储器寻址方式中表示有效地址不能同为两个变址寄存器(12)PUSH AL入栈出栈操作必须以字为单位(13)LEA AX, BXLEA指令中源操作数必须为存储器寻址方式(14)LDS BL, [5100H]LDS指令中目的操作数必须为16位的通用寄存器(15)IN AH, DXIN指令中目的操作数必须为AL或AX (16)OUT 288H, AL输入输出指令中端口地址为16位,必须先送给DX(17)ADD [2400H], 1234H两个操作数的字长不确定(18)XOR [2500H], [BX+10H]两个操作数不能同为内存操作数(19)INC [SI]操作数的字长不确定(20)MUL 10MUL指令的操作数不能为立即数(21)IDIV [BP+DI+1300H]操作数的字长不确定(22)SAL AL, 2移位次数大于1必须先送给CL3.14 设SP=2000H,AX=3000H,BX=5000H,执行以下3条指令后,问SP=?AX=?BX=? PUSH AX ;SP减2,栈顶元素为3000HPUSH BX ;SP减2,栈顶元素为5000HPOP AX ;SP加2,将栈顶元素5000H弹出至AX结果:SP=1FFEH,AX=5000H,BX=5000H3.16 下列程序执行完后,AX=?BX=?CX=? MOV AX, 1122HMOV BX, 3344HPUSH AX ;栈顶元素为1122H POP CX ;将栈顶元素1122H 弹出至CXXCHG BX, CX ;BX=1122H,CX=3344HLEA CX, [BX] ;CX=BX=1122H结果:AX=1122H,BX=1122H,CX=1122H3.17 CPU分别执行下列各程序段后,写出各个执行结果的状态标志位OF、SF、ZF、AF、PF、CF的值。
(1)MOV AL, 7AHADD AL, 53H7AH+53H=CDH=1100 1101B 结果:OF=1,SF=1,ZF=0,AF=0,PF=0,CF=0(2)MOV BL, 0AFHADD BL, 0EAHAFH+EAH=(1)99H=1001 1001B结果:OF=0,SF=1,ZF=0,AF=1,PF=1,CF=1(3)MOV CL, 0FFHADD CL, 01HFFH+01H=(1)00H=0000 0000B结果:OF=0,SF=0,ZF=1,AF=1,PF=1,CF=1(4)MOV DL, 49HSUB DL, 0CAH49H-CAH=(1)7FH=0111 1111B结果:OF=0,SF=0,ZF=0,AF=1,PF=0,CF=13.24 分别写出CPU执行下面两段程序后,寄存器DX=?AX=?(1)MOV AL, 7FHCBWCWDAL=7FH=0111 1111B结果:AX=007FH,DX=0000H(2)MOV AL, 80HCBWCWDAL=80H=1000 0000B结果:AX=0FF80H,DX=0FFFFH3.25 分别写出CPU执行下面两段程序后,寄存器AL=?标志CF=?(1)MOV AL, 36HADD AL, 58HDAA36H+58H=8EH,低4位大于9,故修正:AL=8EH+6H=94H,CF=0(2)MOV AL, 49HADD AL, 87HDAA49H+87H=D0H,AF=1,高4位大于9,故修正:AL=D0H+66H=(1)36H,CF=13.27 分别写出CPU执行下面两段程序后,寄存器AX=?标志CF=?(1)MOV AX, 0138HADD AL, 35HAAA38H+35H=6DH,低4位大于9,故修正:AH=AH+1=01H+1=02HAL=(AL+6H) AND 0FH=73H AND 0FH=03HAX=0203H,CF=1(2)MOV AX, 0533HADD AL, 34HAAA33H+34H=67H,低4位小于9且AF=0,故修正:AL=AL AND 0FH=67H AND 0FH=07HAX=0507H,CF=03.28 下列程序执行完后,AX=?CF=?MOV AX, 3649HADD AL, AH ;AL=36H+49H=7FH DAA ;AL=AL+6H=85H,CF=0CBW ;AH=0FFH,AL=85H,CF=0INC AH ;AH=00H,CF=0 ADC AL, 17H ;AL=AL+17H+CF=9CH,CF=0AAA ;AL=(AL+6H) AND 0FH=02H,AH=AH+1=01H,CF=1结果:AX=0102H,CF=13.29 有如下程序段MOV AL, 45HADD AL, 71H ;AL=45H+71H=0B6H,CF=0DAA ;AL=AL+60H=16H,CF=1MOV BL, AL ;BL=16HADC AL, 19H ;AL=16H+19H+1=30H,AF=1DAA ;AL=AL+6H=36H=00110110,CF=0,PF=1MOV BH, AL ;BH=36H问,执行完此程序段后,BX=?,标志位PF=?,CF=?结果:BX=3616H,PF=1,CF=03.30 分别只使用一条指令实现下述功能。
(1)使AL的低4位清0,高4位不变;AND AL, 0F0H(2)使DI的高10位清0,低6位不变;AND DI, 3FH(3)使BL的低4位置1,高4位不变;OR BL, 0FH(4)使SI的高2位置1,低14位不变;OR SI, 0C000H(5)使CL的D2、D3、D4、D5、D6位取反,D0、D1、D7位不变;XOR CL, 7CH(6)使BP的高4位取反,低12位不变;XOR BP, 0F000H3.32 写出用一条指令使AX清0的一些指令。
MOV AX, 0SUB AX, AXAND AX, 0XOR AX, AX3.34 用最少的指令实现下述功能。
(1)使AL的低4位移到高4位,低4位清0;MOV CL, 4SHL AL, CL(或SAL AL, CL)(2)使AH的高4位移到低4位,高4位清0。
MOV CL, 4SHR AH, CL3.37 编程实现如下功能。
(1)将AL的低6位移到高6位,高2位移到低2位;MOV CL, 2ROL AL, CL(2)将BL的高6位移到低6位,低2位移到高2位;MOV CL, 2ROR BL, CL(3)将BH的高4位与低4位交换;MOV CL, 4ROL BH, CL(或ROR BH, CL)(4)将BP的高8位与低8位交换。
MOV CL, 8ROL BP, CL(或ROR BP, CL)3.39 设AX=1234H,CX=9602H,下列程序执行完后,AL=?AND AL, AH ;AL=12H AND 34H=10H=0001 0000BSHL AL, CL ;AL=0100 0000B=40HOR AL, CH ;AL=40H OR 96H=0D6H=1101 0110BSAR AL, CL ;AL=1111 0101B=0F5HXOR AL, CL ;AL=0F5H XOR 02H=0F7H=1111 0111B,CF=0RCL AL, 1 ;AL=1110 1110B=0EEH结果:AL=0EEH3.52 比较AX和BX中两个无符号数的大小,若AX>BX,则将SI中的高8位和低8位交换;若AX=BX,则将SI中的高7位置1;若AX<BX,则将SI中的带符号数除以2。
试编写程序。
CODE SEGMENTASSUME CS:CODE START: CMP AX,BXJZ A1 ;若AX=BX,转移到A1JB A2 ;若AX<BX,转移到A2MOV CL,8;交换SI中高8位和低8位ROL SI,CLJMP NEXT A1:OR SI,0FE00H;将SI中的高7位置1JMP NEXTA2:MOV CX,2;将SI中的带符号数除以2MOV AX,SI;将被除数送给DX:AXCWDIDIV CXMOV SI,AX;将所求结果送回SINEXT: MOV AH,4CHINT 21HCODE ENDSEND START3.53 在以DS:3301H为首地址的存储单元中,连续存放了50个无符号的字节数据,要求在其中找出最小值,并将它放在地址为DS:3300H的字节单元中。