汇编语言第三章(二)-8086的指令系统

1. 数据传送指令

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

在这里插入图片描述

  1. 交换指令
    XCHG OPR1,OPR2
    (OPR1) ↔ (OPR2)(注意CISC的特点)
  • 不影响标志位
  • 可替代指令(非必须指令)
  • 不允许使用段寄存器
  • 不允许立即寻址

XCHG [ 1000H ],BX
XCHG AH,CL

  1. 堆栈操作指令(必须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 地址传送指令

  1. 有效地址寄存器
    LEA REG,SRC
    (REG) ← SRC的地址值(默认SRC的数值)
    (比较
    MOV BX,TABLE
    LEA BX,TABLE)
  • 不影响标志位
  • REG不允许段寄存器
  • SRC必须有地址
    在这里插入图片描述
  1. 指针送寄存器和段寄存器
    LDS REG,SRC
    (REG) ← [SRC],(DS) ← [SRC+2]
    LES REG,SRC
    (REG) ← [SRC],(ES) ← [SRC+2]
  • SRC对应一个32位指针数据

在这里插入图片描述
LDS SI,point: (DS) =7856H,(SI) =3412H

1.3 标志寄存器传送

  1. 标志寄存器传送
    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 累加器专用指令

累加器专用指令

  1. 输入
    IN AL,PORT(8位数据)
    (AL) ← (I/O设备)
    IN AX,PORT(16位数据)
    (AX) ← (I/O设备)
  2. 输出
    OUT PORT,AL
    (I/O设备) ← (AL)
    OUT PORT,AX
    (I/O设备) ← (AX)
  • 8位累加器AL, 16位累加器AX
  • I/O操作专用指令
  • PORT为端口地址
  • 8位端口地址直接表示,无中括号 [ ]
  • 16位端口地址必须放入DX中

IN AX,15H
MOV DX,305H;IN AL,DX

在这里插入图片描述

  • 注意:底层的汇编级语言考虑面向寄存器的数据流
  • 8086只支持面向字节的低速外设

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) 置标志位

  • 影响所有标志位
  • DEC不影响CF标志位
    在这里插入图片描述
  • 注意:减法实际计算操作,得出的进位是反相数值
    OF按实际计算操作的符号关系判定

在这里插入图片描述

  • 注意:两个特殊数值,NEG后数轴上没有移动
    用CF和OF加以判定标识

在这里插入图片描述
在这里插入图片描述

2.3 乘法运算指令

MUL SRC 无符号数乘法指令
IMUL SRC 有符号数乘法指令

  • 被乘数默认在累加器中
    8位AL, 16位AX
  • 执行过程
    (AX) ← (AL) * (SRC)
    (DX,AX) ← (AX) * (SRC)
  • 注意:乘积结果为双倍字长,且存放的默认位置
  • SRC不允许立即寻址
  • 乘法指令仅对CF和OF有定义

在这里插入图片描述

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,CL
  • CF为移入数值,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)

在这里插入图片描述

  • 循环移位不影响SF、ZF、PF和AF

在这里插入图片描述

  • 注意:若不考虑高位溢出及低位舍入:
    对应数值左移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. 习题

  1. 给定(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. 试根据以下要求写出相应的汇编语言指令
    (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
  1. 写出把首地址为 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]
  1. 现有(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
  1. 给定(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
  1. 设当前数据段寄存器的内容为 1B00H,在数据段的偏移地址 2000H 单元内,含有一个内容为0FF10H 和 8000H 的指针,它们是一个 16 位变量的偏移地址和段地址,试写出把该变量装入 AX
    的指令序列,并画图表示出来。
    在这里插入图片描述
  • 答:MOV BX, [2000H] ;图示如上所示。
    MOV AX, [2000H+2]
    MOV ES, AX
    MOV AX, ES:[BX]
  1. 在 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(向上转移,负位移量)
  1. 假定(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
  1. 在 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
  1. 如 TABLE 为数据段中 0032 单元的符号名,其中存放的内容为 1234H,试问以下两条指令有什么区别?指令执行完后 AX 寄存器的内容是什么?
    MOV AX, TABLE
    LEA AX, TABLE
  • 答:MOV AX, TABLE 是将 TABLE 单元的内容送到 AX,(AX)=1234H
    LEA AX,TABLE 是将 TABLE 单元的有效地址送到 AX,(AX)=0032H
  1. 执行下列指令后 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 的存储方式如下图所示)
    在这里插入图片描述
  1. 下列 ASCII 码串(包括空格符)依次存储在起始地址为 CSTRING 的字节单元中:
    CSTRING DB ‘BASED ADDRESSING’
    请编写指令将字符串中的第 1 个和第 7 个字符传送给 DX 寄存器。
  • 答:MOV DH, CSTRING
    MOV DL, CSTRING+7-1
  1. 已知堆栈段寄存器SS的内容是0FFA0H,堆栈指针寄存器SP的内容是00B0H,先执行两条把8057H和 0F79H 分别进栈的 PUSH 指令,再执行一条 POP 指令。试画出堆栈区和 SP 的内容变化过程示意图(标出存储单元的物理地址)。
  • 答:堆栈区和 SP 的内容变化过程示意图如下图所示。
    在这里插入图片描述
  1. 设(DS)=1B00H,(ES)=2B00H,有关存储单元的内容如下图所示。请写出两条指令把字变量 X装入 AX 寄存器。
    在这里插入图片描述
  • 答:MOV BX, [2000H];MOV AX, ES:[BX]
  1. 求出以下各十六进制数与十六进制数 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
  1. 求出以下各十六进制数与十六进制数 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
  1. 写出执行以下计算的指令序列,其中 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
  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
  1. 下列程序段中的每条指令执行完后,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
  • 答:见注释。
  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
  1. 写出对存放在 DX 和 AX 中的双字长数求补的指令序列。
  • 答:NEG DX 也可为: NOT DX
    NEG AX NOT AX
    SBB DX, 0 ADD AX, 1
    ADC DX, 0
  1. 试编写一程序求出双字长数的绝对值。双字长数在 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
  1. 假设(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
  • 答:见注释。
  1. 试写出执行下列指令序列后 BX 寄存器的内容。执行前(BX)=6D16H。
    MOV CL, 7
    SHR BX, CL
  • 答:(BX)=00DAH。
  1. 试用移位指令把十进制数+53 和-49 分别乘以 2。它们应该用什么指令?得到的结果是什么?如果要除以 2 呢?
  • 答:MOV AL, 53
    SAL AL, 1 ;(AL)=(+532)=6AH
    MOV AL, -49
    SAL AL, 1 ;(AL)=(-49
    2)=9EH
    MOV AL, 53
    SAR AL, 1 ;(AL)=(53/2)= 1AH
    MOV AL, -49
    SAR AL, 1 ;(AL)=(-49/2)=0E7H
  1. 试分析下面的程序段完成什么功能?
    MOV CL, 04
    SHL DX, CL
    MOV BL, AH
    SHL AX, CL
    SHR BL, CL
    OR DL, BL
  • 答:本程序段将 ((DX),(AX)) 的双字同时左移 4 位,即将此双字乘以 10H (16)。
  1. 假定(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
  • 答:见注释。
  1. 下列程序段执行完后,BX 寄存器的内容是什么?
    MOV CL, 3
    MOV BX, 0B7H
    ROL BX,1
    ROR BX, CL
  • 答:(BX)=0C02DH。
  1. 假设数据段定义如下:
    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: ┇
  1. 编写程序段,把字符串 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: ┇
  1. 假设数据段中数据定义如下:
    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
  1. 编写一程序段:比较两个 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: ┇
  1. 假定 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
  1. 试分析下列程序段:
    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
  1. 指令 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
  1. 假设 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 后退出。
  1. 要求测试在 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. 考虑以下的调用序列:
    (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);
    请画出每次调用及返回时的堆栈状态。
  • 答:每次调用及返回时的堆栈状态图如下所示:
    在这里插入图片描述
  1. 假设(EAX)=00001000H,(EBX)=00002000H,(DS)=0010H,试问下列指令访问内存的物理地址是什么?
    (1) MOV ECX,[EAX+EBX]
    (2) MOV [EAX+2EBX],CL
    (3) MOV DH,[EBX+4
    EAX+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
  1. 假设(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. 说明下列指令的操作
    (1) PUSH AX ;将(AX)压入堆栈
    (2) POP ESI ;将堆栈中的双字弹出到 ESI 寄存器中
    (3) PUSH [BX] ;将((BX))对应存储单元中的字压入堆栈
    (4) PUSHAD ;32 位通用寄存器依次进栈
    (5) POP DS ;将堆栈中的字弹出到 DS 寄存器中
    (6) PUSH 4 ;将立即数 4 以字的方式压入堆栈
  • 答:见注释。
  1. 请给出下列各指令序列执行完后目的寄存器的内容。
    (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. 请给出下列各指令序列执行完后目的寄存器的内容。
    (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
  • 答:见注释。
  1. 请给出下列指令序列执行完后 EAX 和 EBX 的内容。
    MOV ECX,307 F455H
    BSF EAX,ECX ;(EAX)= 0D
    BSR EBX,ECX ;(EBX)= 25D
  • 答:见注释。
  1. 请给出下列指令序列执行完后 AX 和 DX 的内容。
    MOV BX,98H
    BSF AX,BX ;(AX)= 3D
    BSR DX,BX ;(DX)= 7D
  • 答:见注释。
  1. 请编写一程序段,要求把 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
  1. 请说明 IMUL BX,DX,100H 指令的操作。
  • 答:(BX)←(DX)*100H
  1. 试编写一程序段,要求把 BL 中的数除以 CL 中的数,并把其商乘以 2,最后的结果存入 DX 寄存器中。
  • 答:MOV AL,BL
    MOV AH,0 ;假定为无符号数,否则用 CBW 指令即可
    DIV CL
    MOV AH,0
    SHL AX,1
    MOV DX,AX
  1. 请说明 JMP DI 和 JMP [DI]指令的区别。
  • 答:JMP DI 是转移到以(DI)内容为偏移地址的单元去执行指令;JMP [DI]是转移到以(DI)间接寻址的内存单元内容为偏移地址的单元去执行指令。
  1. 试编写一程序段,要求在长度为 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
  1. 请用图表示 ENTER 16,0 所生成的堆栈帧的情况。
  • 答:答案见右图。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43681073/article/details/109293699