|
8086的指令系统
1. 数据传送指令
1.1 通用数据传送1.2 地址传送指令1.3 标志寄存器传送1.4 累加器专用指令
2. 算术指令
2.1 加法运算指令2.2 减法运算指令2.3 乘法运算指令2.4 除法运算指令2.5 (追加)位扩展操作指令2.6 十进制调整指令
3. 逻辑指令
3.1 逻辑运算指令3.2 一般位移指令3.3 循环位移指令
4. 串操作指令5. 转移指令6. 处理机控制指令
7. 习题
1. 数据传送指令
1.1 通用数据传送
基本传送
MOV DST,SRC
(DST) ← (SRC)
不影响标志位可以用寄存器AX、BX、CX、DX、SI、DI (注意SP、BP)可以是存储器mem
~~MOV [ 1000H ],TABLE ~~ ?
(不允许双操作数均为存储器)可以是立即数data,立即数不做目的操作数可以是段寄存器CS、DS、ES、SS
MOV DS,ES?
MOV DS,2000H?
MOV CS,AX?
交换指令
XCHG OPR1,OPR2
(OPR1) ? (OPR2)(注意CISC的特点)
不影响标志位可替代指令(非必须指令)不允许使用段寄存器不允许立即寻址
XCHG [ 1000H ],BX
XCHG AH,CL
堆栈操作指令(必须16位操作)
PUSH SRC
(SP) ← (SP) -2,[(SP)+1,(SP)] 左 (SRC)
POP DST
(DST) ←[(SP)+1,(SP)]
(SP) ← (SP) +2
堆栈‘先进后出’的存储区,段基址在SS中
SP在任何时候都指向栈顶,进出栈后自动修改SP
不影响标志位
不允许立即寻址;CS不能作为DST
堆栈操作示意
1.2 地址传送指令
有效地址寄存器
LEA REG,SRC
(REG) ← SRC的地址值(默认SRC的数值)
(比较
MOV BX,TABLE
LEA BX,TABLE)
指针送寄存器和段寄存器
LDS REG,SRC
(REG) ← [SRC],(DS) ← [SRC+2]
LES REG,SRC
(REG) ← [SRC],(ES) ← [SRC+2]
LDS SI,point: (DS) =7856H,(SI) =3412H
1.3 标志寄存器传送
标志寄存器传送
LAHF(Load Flags into AH)
(AH) ← (PSWL)
SAHF(Store AH into Flags)
(PSWL) ← (AH)
PUSHF
(SP) ← (SP) -2,[(SP)+1,(SP)] ← (PSW)
POPF
(PSW) ←[(SP)+1,(SP)]
(SP) ← (SP) +2
1.4 累加器专用指令
累加器专用指令
输入
IN AL,PORT(8位数据)
(AL) ← (I/O设备)
IN AX,PORT(16位数据)
(AX) ← (I/O设备)输出
OUT PORT,AL
(I/O设备) ← (AL)
OUT PORT,AX
(I/O设备) ← (AX)
8位累加器AL, 16位累加器AXI/O操作专用指令PORT为端口地址8位端口地址直接表示,无中括号 [ ]16位端口地址必须放入DX中
IN AX,15H
MOV DX,305H;IN AL,DX
2. 算术指令
2.1 加法运算指令
ADD DST,SRC
(DST) ← (SRC)+ (DST)
ADC DST,SRC
(DST) ← (SRC)+ (DST)+CF
INC OPR
(OPR) ← (OPR)+ 1
前述的限制条件依旧有效影响所有标志位INC不影响CF标志位CF表示无符号数的溢出,OF表示有符号数的溢出
无符号数考虑字长,看CF,有符号数考虑符号关系, 看OF
无符号数结果超出字长,有CF进位 (溢出)
有符号数结果判断符号关系,正负关系错OF有效 (溢出)
运算器只是一个二进制加法器,结果是否正确看标志位
2.2 减法运算指令
SUB DST,SRC
(DST) ← (DST)-(SRC)
SBB DST,SRC
(DST) ← (DST)-(SRC)-CF
DEC OPR
(OPR) ← (OPR)-1
NEG OPR(求补:操作数各位取反,末位加1)
(OPR) ← -(OPR)
CMP OPR1,OPR2
(OPR1)-(OPR2) 置标志位
注意:减法实际计算操作,得出的进位是反相数值
OF按实际计算操作的符号关系判定
注意:两个特殊数值,NEG后数轴上没有移动
用CF和OF加以判定标识
2.3 乘法运算指令
MUL SRC 无符号数乘法指令
IMUL SRC 有符号数乘法指令
被乘数默认在累加器中
8位AL, 16位AX执行过程
(AX) ← (AL) * (SRC)
(DX,AX) ← (AX) * (SRC)
2.4 除法运算指令
DIV SRC 无符号数乘法指令
IDIV SRC 有符号数乘法指令
被除数要求双倍字长,默认在指定位置
8位AX, 16位DX和AX执行过程
(AX) /(SRC) →商(AL)、余数(AH)
(DX,AX) /(SRC) →商(AX)、余数(DX)SRC不允许立即寻址除法指令对所有标志位均无定义,溢出判定、除0由中断系统处理
2.5 (追加)位扩展操作指令
CBW(Change Byte to Word),8位扩成16位
CWD(Change Word to Dword),16位扩成32位
无操作数,对默认位置操作
(AL) → (AX)
若(AL)的最高位为0,则(AH)= 00H
若(AL)的最高位为1,则(AH)= FFH
(AX) → (DX,AX)
若(AX)的最高位为0,则(DX)= 0000H
若(AX)的最高位为1,则(DX)= FFFFH
思考:无符号数,高半部分如何处理
2.6 十进制调整指令
压缩BCD码调整指令
DAA 加法调整
DAS 减法调整
仅针对AL值进行处理
调整条件:CF=1、AF=1 或 值 > 9对OF无定义,其余均影响
例:
MOV AL,28H
MOV BL,75H
ADD AL,BL;(AL)=9DH CF=0
DAA ;(AL)=03H CF=1
3. 逻辑指令
3.1 逻辑运算指令
AND DST,SRC
(DST) ← (DST)∧(SRC)
OR DST,SRC
(DST) ← (DST)∨(SRC)
NOT OPR
(OPR) ← ┐(OPR)
XOR DST,SRC
(DST) ← (DST)?(SRC)
TEST OPR1,OPR2
(OPR1) ∧(OPR2) (置标志位)
NOT不允许立即寻址NOT不影响标志位其它指令CF=OF=0,AF无定义(按位操作,影响SF、ZF、PF)
3.2 一般位移指令
SHL OPR,CNT(Shift Logical Left)
SHR OPR,CNT(Shift Logical Right)
SAL OPR,CNT(Shift Arithmetic Left)
SAR OPR,CNT(Shift Arithmetic Right)
OPR可使用除立即寻址外的其它寻址CNT为移位计数值,数值为1时可直接书写
如:SHL AX,1;SAR [BX],1
CNT计数值>1时,放入CL寄存器中
如:MOV CL,3
SHL AX,CLCF为移入数值,SF、ZF、PF根据移位结果设置(AF无定义)当CNT=1时,OF有意义
最高位数值发生变化,则OF=1
最高位数值不变化,则OF=0
3.3 循环位移指令
ROL OPR,CNT(Rotate Left)
ROR OPR,CNT(Rotate Right)
RCL OPR,CNT(Rotate Left through Carry)
RCR OPR,CNT(Rotate Right through Carry)
注意:若不考虑高位溢出及低位舍入:
对应数值左移1位,相当于数值*2
对应数值右移1位,相当于数值/2
4. 串操作指令
参照汇编语言(三)-8086的寻址方式
[ 3.连续存储器操作(串指令) ]
5. 转移指令
参照汇编语言(三)-8086的寻址方式
[ 4.跳转指令 ]
6. 处理机控制指令
6.1 标志位处理指令
STI:IF ← 1
CLI:IF ← 0
STD:DF ← 1
CLD:DF ← 0
STC:CF ← 1
CLC:CF ← 0
CMC:CF ← 非CF
6.2 其他指令
NOP
HLT
WAIT
等待一次外中断
HLT返回后继续执行,WAIT返回后继续等待.
7. 习题
给定(BX)=637DH,(SI)=2A9BH,位移量 D=7237H,试确定在以下各种寻址方式下的有效地址是什么?
(1) 立即寻址
(2) 直接寻址
(3) 使用 BX 的寄存器寻址
(4) 使用 BX 的简接寻址
(5) 使用 BX 的寄存器相对寻址
(6) 基址变址寻址
(7) 相对基址变址寻址
答:(1) 操作数在指令中,即立即数;
(2) EA=D=7237H;
(3) 无 EA,操作数为(BX)=637DH;
(4) EA=(BX)=637DH;
(5) EA=(BX)+D=0D5B4H;
(6) EA=(BX)+(SI)=8E18H;
(7) EA=(BX)+(SI)+D=1004FH;超过了段的边界,最高进位位丢失,因此 EA=004FH。
试根据以下要求写出相应的汇编语言指令
(1) 把 BX 寄存器和 DX 寄存器的内容相加,结果存入 DX 寄存器中。
(2) 用寄存器 BX 和 SI 的基址变址寻址方式把存储器中的一个字节与 AL寄存器的内容相加,并把结果送到 AL 寄存器中。
(3) 用寄存器 BX 和位移量 0B2H 的寄存器相对寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器中。
(4) 用位移量为 0524H 的直接寻址方式把存储器中的一个字与数 2A59H 相加,并把结果送回存储单元中。
(5) 把数 0B5H 与(AL)相加,并把结果送回 AL 中。
答:(1) ADD DX, BX
(2) ADD AL, [BX][SI]
(3) ADD [BX+0B2H], CX
(4) ADD WORD PTR [0524H], 2A59H
(5) ADD AL, 0B5H
写出把首地址为 BLOCK 的字数组的第 6 个字送到 DX 寄存器的指令。要求使用以下几种寻址方式:
(1) 寄存器间接寻址
(2) 寄存器相对寻址
(3) 基址变址寻址
答:(1) MOV BX, OFFSET BLOCK
ADD BX, (6–1) * 2
MOV DX, [BX]
(2) MOV BX, OFFSET BLOCK 改为: MOV BX, (6-1)*2
MOV DX, [BX+(6–1) * 2] 也可 MOV DX, BLOCK[BX]
(3) MOV BX, OFFSET BLOCK
MOV SI, (6–1) * 2
MOV DX, [BX][SI]
现有(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100H)=12H,(20101H)=34H,(20102H)=56H,
(20103H)=78H,(21200H)=2AH,(21201H)=4CH,(21202H)=B7H,(21203H)=65H,试说明下列各条指令执行完后 AX 寄存器的内容。
(1) MOV AX, 1200H
(2) MOV AX, BX
(3) MOV AX, [1200H]
(4) MOV AX, [BX]
(5) MOV AX, 1100[BX]
(6) MOV AX, [BX][SI]
(7) MOV AX, 1100[BX][SI]
答:(1) (AX)=1200H
(2) (AX)=0100H
(3) (AX)=4C2AH
(4) (AX)=3412H
(5) (AX)=4C2AH
(6) (AX)=7856H
(7) (AX)=65B7H
给定(IP)=2BC0H,(CS)=0200H,位移量 D=5119H,(BX)=1200H,(DS)=212AH,(224A0H)=0600H,(275B9H)=098AH,试为以下的转移指令找出转移的偏移地址。
(1) 段内直接寻址
(2) 使用 BX 及寄存器间接寻址方式的段内间接寻址
(3) 使用 BX 及寄存器相对寻址方式的段内间接寻址
答:(1) JMP NEAR PTR 5119H ;(IP)=5119H+((IP)+03H)=7CDCH,物理地址 PA=09CDCH
(IP)+03H 是 JMP NEAR PTR 5119H 指令的下一条指令的首地址。
(2) JMP WORD PTR [BX] ;(IP)=((DS)*10H+(BX))=0600H,PA=02600H
(3) JMP D[BX] ;(IP)=((DS)*10H+(BX)+D)=098AH,PA=0298AH
设当前数据段寄存器的内容为 1B00H,在数据段的偏移地址 2000H 单元内,含有一个内容为0FF10H 和 8000H 的指针,它们是一个 16 位变量的偏移地址和段地址,试写出把该变量装入 AX
的指令序列,并画图表示出来。
答:MOV BX, [2000H] ;图示如上所示。
MOV AX, [2000H+2]
MOV ES, AX
MOV AX, ES:[BX]
在 0624H 单元内有一条二字节 JMP SHORT OBJ 指令,如其中位移量为(1) 27H,(2) 6BH,(3)0C6H,试问转向地址 OBJ 的值是多少?
答:(1) OBJ=0624H+02H+27H=064DH
(2) OBJ=0624H+02H+6BH=0691H
(3) OBJ=0624H+02H+0C6H=05ECH ;C6H 对应的负数为-3AH(向上转移,负位移量)
假定(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据段中变量名 VAL 的偏移地址为 0050H,试指出下列源操作数字段的寻址方式是什么?其物理地址值
是多少?
(1) MOV AX, 0ABH (2) MOV AX, BX
(3) MOV AX, [100H] (4) MOV AX, VAL
(5) MOV AX, [BX] (6) MOV AX, ES:[BX]
(7) MOV AX, [BP] (8) MOV AX, [SI]
(9) MOV AX, [BX+10] (10) MOV AX, VAL[BX]
(11) MOV AX, [BX][SI] (12) MOV AX, VAL[BX][SI]
答:(1) 立即方式; 操作数在本条指令中
(2) 寄存器寻址方式; 操作数为 (BX)=0100H
(3) 直接寻址方式; PA=20100H
(4) 直接寻址方式; PA=20050H
(5) BX 寄存器间接寻址方式; PA=20100H
(6) 附加段 BX 寄存器间接寻址方式; PA=21100H
(7) BP 寄存器间接寻址方式; PA=15010H
(8) SI 寄存器间接寻址方式; PA=200A0H
(9) BX 寄存器相对寻址方式; PA=20110H
(10) BX 寄存器相对寻址方式; PA=20150H
(11) BX 和 SI 寄存器基址变址寻址方式; PA=201A0H
(12) BX 和 SI 寄存器相对基址变址寻址方式; PA=201F0H
在 ARRAY 数组中依次存储了七个字数据,紧接着是名为 ZERO 的字单元,表示如下:
ARRAY DW 23, 36, 2, 100, 32000, 54, 0 ZERO DW ?
(1) 如果 BX 包含数组 ARRAY 的初始地址,请编写指令将数据 0 传送给 ZERO 单元。
(2) 如果 BX 包含数据 0 在数组中的位移量,请编写指令将数据 0 传送给 ZERO 单元。
答:(1) MOV AX, [BX+(7-1)*2]
MOV [BX+(7)*2], AX
(2) MOV AX, ARRAY [BX]
MOV ARRAY [BX+2], AX
如 TABLE 为数据段中 0032 单元的符号名,其中存放的内容为 1234H,试问以下两条指令有什么区别?指令执行完后 AX 寄存器的内容是什么?
MOV AX, TABLE
LEA AX, TABLE
答:MOV AX, TABLE 是将 TABLE 单元的内容送到 AX,(AX)=1234H
LEA AX,TABLE 是将 TABLE 单元的有效地址送到 AX,(AX)=0032H
执行下列指令后 AX 寄存器中的内容是什么?
TABLE DW 10, 20, 30, 40, 50 ;000AH, 0014H, 001EH, 0028H, 0032H
ENTRY DW 3
┇
MOV BX, OFFSET TABLE
ADD BX, ENTRY
MOV AX, [BX]
答:(AX)=1E00H (TABLE 的存储方式如下图所示)
下列 ASCII 码串(包括空格符)依次存储在起始地址为 CSTRING 的字节单元中:
CSTRING DB ‘BASED ADDRESSING’
请编写指令将字符串中的第 1 个和第 7 个字符传送给 DX 寄存器。
答:MOV DH, CSTRING
MOV DL, CSTRING+7-1
已知堆栈段寄存器SS的内容是0FFA0H,堆栈指针寄存器SP的内容是00B0H,先执行两条把8057H和 0F79H 分别进栈的 PUSH 指令,再执行一条 POP 指令。试画出堆栈区和 SP 的内容变化过程示意图(标出存储单元的物理地址)。
答:堆栈区和 SP 的内容变化过程示意图如下图所示。
设(DS)=1B00H,(ES)=2B00H,有关存储单元的内容如下图所示。请写出两条指令把字变量 X装入 AX 寄存器。
答:MOV BX, [2000H];MOV AX, ES:[BX]
求出以下各十六进制数与十六进制数 62A0H 之和,并根据结果设置标志位 SF、ZF、CF 和 OF 的值。
(1) 1234H (2) 4321H (3) CFA0H (4) 9D60H
答:(1) 和为 74D4H;SF=0,ZF=0,CF=0,OF=0
(2) 和为 A5C1H;SF=1,ZF=0,CF=0,OF=1
(3) 和为 3240H;SF=0,ZF=0,CF=1,OF=0
(4) 和为 0000H;SF=0,ZF=1,CF=1,OF=0
求出以下各十六进制数与十六进制数 4AE0H 的差值,并根据结果设置标志位 SF、ZF、CF 和 OF的值。
(1) 1234H (2) 5D90H (3) 9090H (4) EA04H
答:(1) 差为 C754H;SF=1,ZF=0,CF=1,OF=0
(2) 差为 12B0H;SF=0,ZF=0,CF=0,OF=0
(3) 差为 45B0H;SF=0,ZF=0,CF=0,OF=1
(4) 差为 9F24H;SF=1,ZF=0,CF=0,OF=0
写出执行以下计算的指令序列,其中 X、Y、Z、R、W 均为存放 16 位带符号数单元的地址。
(1) Z←W+(Z-X) (2) Z←W-(X+6)-(R+9)
(3) Z←(WX)/(Y+6),R←余数 (4) Z←((W-X)/5Y)*2
答:(1) MOV AX, Z ;以下程序都未考虑带符号数的溢出
SUB AX, X
ADD AX, W
MOV Z, AX
(2) MOV BX, X
ADD BX, 6
MOV CX, R
ADD CR, 9
MOV AX, W
SUB AX, BX
SUB AX, CX
MOV Z, AX
(3) ADD Y, 6
MOV AX, W
IMUL X
IDIV Y
MOV Z, AX
MOV R, DX
(4) MOV AX, W
SUB AX, X
CWD
MOV BX, 5
IDIV BX
IMUL Y
SHL AX, 1 ;((DX),(AX))*2
RCL DX, 1
已知程序段如下:
MOV AX, 1234H ;(AX)=1234H,标志位不变
MOV CL, 4 ;(AX)和标志位都不变
ROL AX, CL ;(AX)=2341H,CF=1,SF 和 ZF 不变
DEC AX ;(AX)=2340H,CF=1 不变,SF=0,ZF=0
MOV CX, 4 ;(AX)和标志位都不变
MUL CX ;(AX)=8D00H,CF=OF=0,其它标志无定义
INT 20H
试问:
(1) 每条指令执行完后,AX 寄存器的内容是什么?
(2) 每条指令执行完后,进位、符号和零标志的值是什么?
(3) 程序结束时,AX 和 DX 的内容是什么?
答:(1) 见注释;
(2) 见注释;
(3) (AX)=8D00H,(DX)=0
下列程序段中的每条指令执行完后,AX 寄存器及 CF、SF、ZF 和 OF 的内容是什么?
MOV AX, 0 ;(AX)=0, 标志位不变
DEC AX ;(AX)=0FFFFH, CF 不变,SF=1,ZF=0,OF=0
ADD AX, 7FFFH ;(AX)=7FFEH, CF=1,SF=0,ZF=0,OF=0
ADD AX, 2 ;(AX)=8000H, CF=0,SF=1,ZF=0,OF=1
NOT AX ;(AX)=7FFFH, 标志位不变
SUB AX, 0FFFFH ;(AX)=8000H, CF=1,SF=1,ZF=0,OF=1
ADD AX, 8000H ;(AX)=0, CF=1,SF=0,ZF=1,OF=1
SUB AX, 1 ;(AX)=0FFFFH, CF=1,SF=1,ZF=0,OF=0
AND AX, 58D1H ;(AX)=58D1H, CF=0,SF=0,ZF=0,OF=0
SAL AX, 1 ;(AX)=0B1A2H, CF=0,SF=1,ZF=0,OF=1
SAR AX, 1 ;(AX)=0D8D1H, CF=0,SF=1,ZF=0,OF=0
NEG AX ;(AX)= 272FH, CF=1,SF=0,ZF=0,OF=0
ROR AX, 1 ;(AX)= 9397H, CF=1,SF 和 ZF 不变,OF=1
变量 DATAX 和变量 DATAY 的定义如下:
DATAX DW 0148H
DW 2316H
DATAY DW 0237H
DW 4052H
请按下列要求写出指令序列:
(1) DATAX 和 DATAY 两个字数据相加,和存放在 DATAY 中。
(2) DATAX 和 DATAY 两个双字数据相加,和存放在从 DATAY 开始的双字单元中。
(3) 解释下列指令的作用:
STC
MOV BX, DATAX
ADC BX, DATAY
(4) DATAX 和 DATAY 两个字数据相乘(用 MUL)。
(5) DATAX 和 DATAY 两个双字数据相乘(用 MUL)。
(6) DATAX 除以 23(用 DIV)。
(7) DATAX 双字除以字 DATAY (用 DIV)。
答:(1) MOV AX, DATAX
ADD DATAY, AX
MOV AX, DATAX+2
ADD DATAY+2, AX
(2) MOV AX, DATAX
ADD DATAY, AX
MOV AX, DATAX+2
ADC DATAY+2, AX
MOV DATAY+4, 0 ;用于存放进位位
ADC DATAY+4, 0
(3) DATAX 和 DATAY 两个字数据之和加 1,结果存入 BX 寄存器。
(4) RESULT1 DW 0
DW 0
RESULT2 DW 0
DW 0
┇
MOV AX, DATAX
MUL DATAY
MOV RESULT1 , AX
MOV RESULT1+2, DX
MOV AX, DATAX+2
MUL DATAY+2
MOV RESULT2 , AX
MOV RESULT2+2, DX
(5) AA DW 0
BB DW 0
CC DW 0
DD DW 0
┇
MOV AX, DATAX
MUL DATAY
MOV AA , AX
MOV BB, DX
MOV AX, DATAX
MUL DATAY+2
ADD BB, AX
ADC CC, DX
MOV AX, DATAX+2
MUL DATAY
ADD BB, AX
ADC CC, DX
ADC DD, 0
MOV AX, DATAX+2
MUL DATAY+2
ADD CC, AX
ADC DD, DX
(6) MOV AX, DATAX
MOV BL, 23
DIV BL
(7) MOV DX, DATAX+2
MOV AX, DATAX
DIV DATAY
写出对存放在 DX 和 AX 中的双字长数求补的指令序列。
答:NEG DX 也可为: NOT DX
NEG AX NOT AX
SBB DX, 0 ADD AX, 1
ADC DX, 0
试编写一程序求出双字长数的绝对值。双字长数在 A 和 A+2 单元中,结果存放在 B 和 B+2 单元中。
答:程序段如下:
MOV AX, A
MOV DX, A+2
CMP DX, 0
JNS ZHENSHU ;不是负数则转走
NEG DX
NEG AX
SBB DX, 0
ZHENSHU: MOV B, AX
MOV B+2, DX
INT 20H
假设(BX)=0E3H,变量 VALUE 中存放的内容为 79H,确定下列各条指令单独执行后的结果。
(1) XOR BX, VALUE ;(BX)=9AH,CF、OF 都为 0,AF 无定义,SF=1,ZF=0,PF=1
(2) AND BX, VALUE ;(BX)=61H,CF、OF 都为 0,AF 无定义,SF=0,ZF=0,PF=0
(3) OR BX, VALUE ;(BX)=0FBH,CF、OF 都为 0,AF 无定义,SF=1,ZF=0,PF=0
(4) XOR BX, 0FFH ;(BX)=1CH,CF、OF 都为 0,AF 无定义,SF=0,ZF=0,PF=0
(5) AND BX, 0 ;(BX)=00H,CF、OF 都为 0,AF 无定义,SF=0,ZF=1,PF=1
(6) TEST BX, 01H ;(BX)=0E3H,CF、OF 都为 0,AF 无定义,SF=1,ZF=0,PF=0
试写出执行下列指令序列后 BX 寄存器的内容。执行前(BX)=6D16H。
MOV CL, 7
SHR BX, CL
试用移位指令把十进制数+53 和-49 分别乘以 2。它们应该用什么指令?得到的结果是什么?如果要除以 2 呢?
答:MOV AL, 53
SAL AL, 1 ;(AL)=(+532)=6AH
MOV AL, -49
SAL AL, 1 ;(AL)=(-492)=9EH
MOV AL, 53
SAR AL, 1 ;(AL)=(53/2)= 1AH
MOV AL, -49
SAR AL, 1 ;(AL)=(-49/2)=0E7H
试分析下面的程序段完成什么功能?
MOV CL, 04
SHL DX, CL
MOV BL, AH
SHL AX, CL
SHR BL, CL
OR DL, BL
答:本程序段将 ((DX),(AX)) 的双字同时左移 4 位,即将此双字乘以 10H (16)。
假定(DX)=0B9H,(CL)=3,(CF)=1,确定下列各条指令单独执行后 DX 中的值。
(1) SHR DX, 1 ;(DX)=05CH
(2) SAR DX, CL ;(DX)=17H
(3) SHL DX, CL ;(DX)=5C8H
(4) SHL DL, 1 ;(DX)=72H
(5) ROR DX, CL ;(DX)=2017H
(6) ROL DL, CL ;(DX)=0CDH
(7) SAL DH, 1 ;(DX)=0B9H
(8) RCL DX, CL ;(DX)=2CCH
(4) RCR DL, 1 ;(DX)=0DCH
下列程序段执行完后,BX 寄存器的内容是什么?
MOV CL, 3
MOV BX, 0B7H
ROL BX,1
ROR BX, CL
假设数据段定义如下:
CONAME DB ‘SPACE EXPLORERS INC.’
PRLINE DB 20 DUP (‘’)
用串指令编写程序段分别完成以下功能:
(1) 从左到右把 CONAME 中的字符串传送到 PRLINE。
(2) 从右到左把 CONAME 中的字符串传送到 PRLINE。
(3) 把 CONAME 中的第 3 和第 4 个字节装入 AX。
(4) 把 AX 寄存器的内容存入从 PRLINE+5 开始的字节中。
(5) 检查 CONAME 字符串中有无空格字符,如有则把第一个空格字符的地址传送给 BX 寄存器。
答:(1) MOV CX, 20
CLD
MOV SI, SEG CONAME
MOV DS, SI
MOV ES, SI
LEA SI, CONAME
LEA DI, PRLINE
REP MOVSB
(2) MOV CX, 20
STD
MOV SI, SEG CONAME
MOV DS, SI
MOV ES, SI
LEA SI, CONAME
ADD SI, 20-1
LEA DI, PRLINE
ADD DI, 20-1
REP MOVSB
(3) MOV AX, WORD PTR CONAME+3-1
(4) MOV WORD PTR PRLINE +5, AX
(5) MOV AL, ‘ ’ ;空格的 ASCII 码送 AL 寄存器
CLD
MOV DI, SEG CONAME
MOV ES, DI
LEA DI, CONAME
REPNE SCASB
JNE NEXT
DEC DI
MOV BX, DI
NEXT: ┇
编写程序段,把字符串 STRING 中的‘&’字符用空格符代替。
STRING DB ‘The date is FEB&03’
答:程序段如下:
MOV CX, 18
MOV AL, ‘&’
CLD
MOV DI, SEG STRING
MOV ES, DI
LEA DI, STRING
REPNE SCASB
JNE NEXT
DEC DI
MOV ES:BYTE PTR [DI], ‘ ’ ;送空格符
NEXT: ┇
假设数据段中数据定义如下:
STUDENT_NAME DB 30 DUP (?)
STUDENT_ADDR DB 9 DUP (?)
PRINT_LINE DB 132 DUP (?)
分别编写下列程序段:
(1) 用空格符清除 PRINT_LINE 域。
(2) 在 STUDENT_ADDR 中查找第一个‘-’。
(3) 在 STUDENT_ADDR 中查找最后一个‘-’。
(4) 如果 STUDENT_NAME 域中全是空格符时,填入‘*’。
(5) 把 STUDENT_NAME 移到 PRINT_LINE 的前 30 个字节中,把 STUDENT_ ADDR 移到PRINT_LINE 的后 9 个字节中。
答:公共的程序段如下:
MOV DI, DS
MOV ES, DI
(1) MOV CX, 132
MOV AL., ‘ ’ ;空格的 ASCII 码送 AL 寄存器
CLD
LEA DI, PRINT_LINE
REP STOSB
(2) MOV CX, 9
MOV AL., ‘-’
CLD
LEA DI, STUDENT_ ADDR
REPNE SCASB
JNE NO_DASH
DEC DI
NO_DASH: ┇
(3) MOV CX, 9
MOV AL., ‘-’
STD
LEA DI, STUDENT_ ADDR
ADD DI, 9-1
REPNE SCASB
JNE NO_DASH
INC DI
NO_DASH: ┇
(4) MOV CX, 30
MOV AL, ‘ ’ ;空格的 ASCII 码送 AL 寄存器
CLD
LEA DI, STUDENT_NAME
REPE SCASB
JNE NEXT
MOV CX, 30
MOV AL, ‘’ ;“”的 ASCII 码送 AL 寄存器
LEA DI, STUDENT_NAME
REP STOSB
NEXT: ┇
(5) MOV CX, 30
CLD
LEA SI, STUDENT_NAME
LEA DI, PRINT_LINE
REP MOVSB
MOV CX, 9
STD
LEA SI, STUDENT_ADDR+9-1
LEA DI, PRINT_LINE+132-1
REP MOVSB
编写一程序段:比较两个 5 字节的字符串 OLDS 和 NEWS,如果 OLDS 字符串不同于 NEWS 字符串则执行 NEW_LESS;否则顺序执行程序。
答:程序段如下:
MOV CX, 5
CLD
MOV DI, SEG OLDS
MOV DS, DI
MOV ES, DI
LEA SI, OLDS
LEA DI, NEWS
REPE CMPSB
JNE NEW_LESS
┇
NEW_LESS: ┇
假定 AX 和 BX 中的内容为带符号数,CX 和 DX 中的内容为无符号数,请用比较指令和条件转移指令实现以下判断:
(1) 若 DX 的内容超过 CX 的内容,则转去执行 EXCEED。
(2) 若 BX 的内容大于 AX 的内容,则转去执行 EXCEED。
(3) 若 CX 的内容等于 0,则转去执行 ZERO。
(4) BX 与 AX 的内容相比较是否产生溢出?若溢出则转OVERFLOW。
(5) 若 BX 的内容小于等于 AX 的内容,则转 EQ_SMA。
(6) 若 DX 的内容低于等于 CX 的内容,则转 EQ_SMA。
答:(1) CMP DX, CX
JA EXCEED
(2) CMP BX, AX
JG EXCEED
(3) JCXZ ZERO
(4) CMP BX, AX
JO OVERFLOW
(5) CMP BX, AX
JLE EQ_SMA
(6) CMP DX, CX
JBE EQ_SMA
试分析下列程序段:
ADD AX, BX
JNO L1
JNC L2
SUB AX, BX
JNC L3
JNO L4
JMP SHORT L5
如果 AX 和 BX 的内容给定如下:
AX BX
(1) 147BH 80DCH
(2) B568H 42C8H
(3) 42C8H 608DH
(4) D023H 9FD0H
(5) 94B7H B568H
问该程序分别在上面 5 种情况下执行后,程序转向哪里?
答:(1) 转向 L1
(2) 转向 L1
(3) 转向 L2
(4) 转向 L5 ;因为加法指令后 AX 中已经是 6FF3H
(5) 转向 L5 ;因为加法指令后 AX 中已经是 4A14H
指令 CMP AX, BX 后面跟着一条格式为 J… L1 的条件转移指令,其中…可以是 B、NB、BE、NBE、L、NL、LE、NLE 中的任意一个。如果 AX 和 BX 的内容给定如下:
AX BX
(1) 1F52H 1F52H
(2) 88C9H 88C9H
(3) FF82H 007EH
(4) 58BAH 020EH
(5) FFC5H FF8BH
(6) 09A0H 1E97H
(7) 8AEAH FC29H
(8) D367H 32A6H
问以上 8 条转移指令中的哪几条将引起转移到 L1?
答:(1) JNB、JBE、JNL、JLE
(2) JNB、JBE、JNL、JLE
(3) JNB、JNBE、JL、JLE
(4) JNB、JNBE、JNL、JNLE
(5) JNB、JNBE、JL、JLE
(6) JB、JBE、JL、JLE
(7) JB、JBE、JNL、JNLE
(8) JNB、JNBE、JL、JLE
假设 X 和 X+2 单元的内容为双精度数 p,Y 和 Y+2 单元的内容为双精度数 q,(X 和 Y 为低位字),试说明下列程序段做什么工作?
MOV DX, X+2
MOV AX, X
ADD AX, X
ADC DX, X+2
CMP DX, Y+2
JL L2
JG L1
CMP AX, Y
JBE L2
L1: MOV AX, 1
JMP SHORT EXIT
L2: MOV AX, 2
EXIT:INT 20H
答:此程序段判断 p2>q,则使(AX)=1 后退出;p2≤q,则使(AX)=2 后退出。
要求测试在 STATUS 中的一个字节,如果第 1、3、5 位均为 1 则转移到 ROUTINE_1;如果此三位中有两位为 1 则转移到 ROUTINE_2;如果此三位中只有一位为 1 则转移到 ROUTINE_3;如果此三位全为 0 则转移到 ROUTINE_4。试画出流程图,并编制相应的程序段。
MOV AL, STATUS
AND AL, 00010101B ;只保留第 1、3、5 位
JZ ROUTINE_4 ;3 位全为 0 转 ROUTINE_4
JPE ROUTINE_2 ;两位为 1 转 ROUTINE_2
CMP AL, 00010101B
JZ ROUTINE_1 ;3 位全为 1 转 ROUTINE_1
ROUTINE_3: ┇ ;仅一位为 1 执行 ROUTINE_3
JMP EXIT
ROUTINE_1: ┇
JMP EXIT
ROUTINE_2: ┇
JMP EXIT
ROUTINE_4: ┇
EXIT: INT 20H
38. 在下列程序的括号中分别填入如下指令:
(1) LOOP L20
(2) LOOPE L20
(3) LOOPNE L20
试说明在三种情况下,当程序执行完后,AX、BX、CX、DX 四个寄存器的内容分别是什么?
TITLE EXLOOP.COM
CODESG SEGMENT
ASSUME CS:CODESG, DS: CODSEG, SS: CODSEG
ORG 100H
BEGIN: MOV AX, 01
MOV BX, 02
MOV DX, 03
MOV CX, 04
L20:
INC AX
ADD BX, AX
SHR DX, 1
( )
RET
CODESG ENDS
END BEGIN
答:(1) (AX)=5H,(BX)=10H,(CX)=0H,(DX)=0H
(2) (AX)=2H,(BX)=4H,(CX)=3H,(DX)=1H
(3) (AX)=3H,(BX)=7H,(CX)=2H,(DX)=0H
考虑以下的调用序列:
(1) MAIN 调用 NEAR 的 SUBA 过程(返回的偏移地址为 0400);
(2) SUBA 调用 NEAR 的 SUBB过程(返回的偏移地址为 0A00);
(3) SUBB调用 FAR 的 SUBC 过程(返回的段地址为 B200,返回的偏移地址为 0100);
(4) 从 SUBC 返回 SUBB;
(5) SUBB调用 NEAR 的 SUBD 过程(返回的偏移地址为 0C00);
(6) 从 SUBD 返回 SUBB;
(7) 从 SUBB返回 SUBA;
(8) 从 SUBA 返回 MAIN;
(9) 从 MAIN 调用 SUBC(返回的段地址为 1000,返回的偏移地址为 0600);
请画出每次调用及返回时的堆栈状态。
假设(EAX)=00001000H,(EBX)=00002000H,(DS)=0010H,试问下列指令访问内存的物理地址是什么?
(1) MOV ECX,[EAX+EBX]
(2) MOV [EAX+2EBX],CL
(3) MOV DH,[EBX+4EAX+1000H]
答:(1) PA=(DS)*10H+EA=00100H+00001000H+00002000H=00003100H
(2) PA=(DS)10H+EA=00100H+00001000H+200002000H=00005100H
(3) PA=(DS)10H+EA=00100H+00002000H+400001000H+1000H=00007100H
假设(EAX)=9823F456H,(ECX)=1F23491H,(BX)=348CH,(SI)=2000H,(DI)=4044H。在 DS 段中从偏移地址 4044H 单元开始的 4 个字节单元中,依次存放的内容为 92H,6DH,0A2H 和 4CH,试问下列各条指令执行完后的目的地址及其中的内容是什么?
(1) MOV [SI],EAX
(2) MOV [BX],ECX
(3) MOV EBX,[DI]
答:(1) 目的地址为 DS:2000H,内容依次为:56H,0F4H,23H 和 98H
(2) 目的地址为 DS:348CH,内容依次为:91H,34H,0F2H 和 01H
(3) 目的操作数为 EBX 寄存器,(EBX)=4CA26D92H
说明下列指令的操作
(1) PUSH AX ;将(AX)压入堆栈
(2) POP ESI ;将堆栈中的双字弹出到 ESI 寄存器中
(3) PUSH [BX] ;将((BX))对应存储单元中的字压入堆栈
(4) PUSHAD ;32 位通用寄存器依次进栈
(5) POP DS ;将堆栈中的字弹出到 DS 寄存器中
(6) PUSH 4 ;将立即数 4 以字的方式压入堆栈
请给出下列各指令序列执行完后目的寄存器的内容。
(1) MOV EAX,299FF94H
ADD EAX,34FFFFH ;(EAX)= 2CEFF93H
(2) MOV EBX,40000000
SUB EBX,1500000 ;(EBX)= 3EB00000H
(3) MOV EAX,39393834H
AND EAX,0F0F0F0FH ;(EAX)= 09090804H
(4) MOV EDX,9FE35DH
XOR EDX,0F0F0F0H ;(EDX)= 6F13ADH
请给出下列各指令序列执行完后目的寄存器的内容。
(1) MOV BX,-12
MOVSX EBX,BX ;(EBX)= 0FFFF FFF4H
(2) MOV CL,-8
MOVSX EDX,CL ;(EDX)= 0FFFF FFF8H
(3) MOV AH,7
MOVZX ECX,AH ;(ECX)= 0000 0007H
(4) MOV AX,99H
MOVZX EBX,AX ;(EBX)= 0000 0099H
请给出下列指令序列执行完后 EAX 和 EBX 的内容。
MOV ECX,307 F455H
BSF EAX,ECX ;(EAX)= 0D
BSR EBX,ECX ;(EBX)= 25D
请给出下列指令序列执行完后 AX 和 DX 的内容。
MOV BX,98H
BSF AX,BX ;(AX)= 3D
BSR DX,BX ;(DX)= 7D
请编写一程序段,要求把 ECX、EDX 和 ESI 的内容相加,其和存入 EDI 寄存器中(不考虑溢出)。
答:MOV EDI,0 也可为:MOV EDI,ECX
ADD EDI,ECX ADD EDI,EDX
ADD EDI,EDX ADD EDI,ESI
ADD EDI,ESI
请说明 IMUL BX,DX,100H 指令的操作。
试编写一程序段,要求把 BL 中的数除以 CL 中的数,并把其商乘以 2,最后的结果存入 DX 寄存器中。
答:MOV AL,BL
MOV AH,0 ;假定为无符号数,否则用 CBW 指令即可
DIV CL
MOV AH,0
SHL AX,1
MOV DX,AX
请说明 JMP DI 和 JMP [DI]指令的区别。
答:JMP DI 是转移到以(DI)内容为偏移地址的单元去执行指令;JMP [DI]是转移到以(DI)间接寻址的内存单元内容为偏移地址的单元去执行指令。
试编写一程序段,要求在长度为 100H 字节的数组中,找出大于 42H 的无符号数的个数并存入字节单元 UP 中;找出小于 42H 的无符号数的个数并存入字节单元 DOWN 中。
答:JMP BEGIN
UP DB 0
DOWN DB 0
TABLE DB 100H DUP (?) ;数组
BEGIN:
MOV CX,100H
MOV BX,-1
MOV SI,0
MOV DI,0
L1:INC BX
CMP TABLE[BX],42H
JA L2
JB L3
JMP L4
L2:INC SI
JMP L4
L3:INC DI
L4:LOOP L1
MOV UP,SI
MOV DOWN,DI
请用图表示 ENTER 16,0 所生成的堆栈帧的情况。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|