PUSH BX ;(AX)=?,(BX)=?,(SP)=?,栈顶字节[SP]=?, 栈顶第二字节[SP+1]=? POP AX ;(AX)=?,(BX)=?,(SP)=?,栈顶字节[SP]=?, 栈顶第二字节[SP+1]=?
解:(AX)=1234H,(BX)=5678H,(SP)=0FFEH,栈顶字节[SP]=34H,栈顶第二字节[SP+1]=12H (AX)=1234H,(BX)=5678H,(SP)=0FFCH,栈顶字节[SP]=78H,栈顶第二字节[SP+1]=56H (AX)=5678H,(BX)=5678H,(SP)=0FFEH,栈顶字节[SP]=34H,栈顶第二字节[SP+1]=12H
6、假设A、B、C、D、X、Y为字节变量,AA、BB、YY为字变量,试利用算术运算指令编写程序段,完成以下各算术运算题。
(1)计算YY←A+B*C,其中A、B、C都是无符号数;
(2)计算(AA+BB)/(C-D),商赋给X,余数赋给Y,其中AA、BB、C、D都是带符号数; (3)计算YY←(A-B)*C,其中A、B、C都是未组合BCD码。 解:
(1)MOV AL,B MUL C ADD AL,A ADC AH,0 MOV YY,AX (2)MOV AX,AA
ADD AX,BB MOV BL,C SUB BL,D IDIV BL MOV X,AL MOV Y,AH (3)MOV AL,A
SUB AL,B
AAS
MUL C AAM
MOV YY, AX
7、利用移位指令编写程序段,实现以下运算。 (1)计算AX←AX*10,其中AX为无符号数;
(2)32位带符号数存放在寄存器DX和AX中,其中DX存放高16位,AX存放低16位计算(DX,AX)←(DX,AX)*2。
(3)32位带符号数存放在寄存器DX和AX中,其中DX存放高16位,AX存放低16位计算(DX,AX)←(DX,AX)/2。 解:
(1)SHL AX,1
MOV BX,AX SHL AX,1 SHL AX,1 ADD AX,BX (2)SAL AX,1
RCL DX,1 (3)SAR DX,1 RCR AX,1
8、指出以下指令执行后,标志寄存器OF、SF、ZF、AF、PF、CF的状态。 (1)(AL)=0FFH,(BL)=20H,执行指令:ADD AL,BL (2)(AL)=01H, (BL)=02H,执行指令:CMP AL,BL (3)(AL)=0FFH,执行指令:INC AL (4)(AL)=0,执行指令:DEC AL
(5)(AL)=0F0H,(BL)=04H,执行指令:IMUL BL (6)(AX)=1F0H,(BL)=08H,执行指令:DIV BL
(7)(AL)=12H, (BL)=34H,执行指令:TEST AL,BL (8)(AL)=98H,执行指令:SAL AL,1 解: (1) (2) (3) (4) (5) (6) (7) (8) OF 0 0 0 0 0 — 0 1 SF 0 1 0 1 — — 0 0 ZF 0 0 1 0 — — 0 0 AF 0 1 1 1 — — — — PF 0 1 1 1 — — 0 1 CF 1 1 × × 0 — 0 1 注:0表示结果为0,1表示结果为1,×表示结果不变,—表示结果不确定。
9、在8086系统下,编写实现如下功能的程序段: (1)从地址为80H的端口中读入一个字节;
(2)如果该字节最高位为“1”,则将字节0FFH送到地址为81H的端口中,并退出程序; (3)如果该字节最高位为“0”,则转向第(1)步,继续循环扫描。
解: 参考程序段:
AGAIN: IN AL, 80H TEST AL, 80H JZ AGAIN MOV AL, 0FFH OUT 81H, AL
10、我们知道,MOV指令并不能直接修改CS、IP的值,但事实上,我们还可以通过其他方法来达到修改CS、IP的目的。试编写一个程序段,使该程序段运行后,(CS)=0100H,(IP)=0000H。 解:
方法一、利用段间返回指令RETF: MOV AX,0100H
PUSH AX ;段基址入栈 MOV AX,0
PUSH AX ;偏移量入栈 RETF
方法二、利用JMP指令实现段间跳转,假设ADDR为双字变量:
MOV WORD PTR ADDR,0 ;WORD PTR ADDR←偏移量 MOV WORD PTR ADDR+2, 0100H ;WORD PTR ADDR+2←段基址 JMP DWORD PTR ADDR
11.写出能完成下述操作的指令。 (1)将立即数 1234H 送至 DS 寄存器。 (2)将存储单元 3000H 和内容送至 4000H 单元。 (3)将累加器 AX 与寄存器 CX 中的内容对调。 答案: (1)MOV AX, 1234H MOV DS, AX
(2) MOV AX, [3000H] MOV [4000H], AX (3) XCHG AX, CX
12.编程:将数据段中以 BX 为偏移地址的连续 4 单元的内容颠倒过来。 答案: MOV AL, [BX]