考点1:指令格式及功能
一、指令格式
二、指令类型
(一)传送类:
MOV PUSH POP LEA
(二)算数运算:
加 ADD ADC INC
减SUB SBB DEC CMP NEG
扩展 CBW, CWD
(三)位操作:
AND OR NOT XOR TEXT ROR ROL RCR RCL SHL SHR SAL SAR
(四)控制转移:
大于小于 有符号 无符号,JC JZ JS
(五)串操作类:
3个
(六)处理机类:
CLI , STI CLC , STC
MOV AX, [DI+BX] # X 基址+变址
MOV AX,[DX] #X [内只能放BX BP SI DI ]
ADD AL, BX # x 字长不统一
PUSH AL #push pop 必须对 字
MOV AL, BX #长度不统一
PUSH 1000H #单操作数 不能直接用立即数
MOV AX ,1000H
PUSH AX
ADD AL, BX # X 类型不一致
MOV [BX], SI #将si的值 存入 BX指向的内存单元 写操作
SUB[BX], [SI] # X 两操作数不能同时为内存操作数
MOV AX,[BX]
SUB AX,[SI]
MOV [BX],AX
CMP 5, AL
MOV CX, AX
LEA BL, A;(A为变量名) #X 类型不一致 LEA A,BL
SHR AL, 6 # X 移位次数大于1时应存放在CL中
MOB CL,6
SHR AL,CL
MOV AL, [DI+SI] #错 DI SI 不能同时使用
MOV AL,[DI+SP]
MOV AL,[SI+BP]
MOV BL, 200H #错 两操作数类型不一致,200H超出字节的范围
MOV BX ,200H
MOV AX, DATA(DATA为段名) #对
INC[BX]#
INC Byte PTR[BX]; #12 +1
INC Word PTR [BX]; #3412H+1
CMP[BX], A;A为变量 #X 两操作数不可同为内存中的数
MOV AX, '+' ;AX=ASCII值
MOV AX, [BP+BX]#错, BP和BX不可同时使用在寻址方式中
ADD AX, [CX]
#错, cx不能作为寄在器间接寻址
OUT 400, AL #
MOV BX,400
OUT AD,AL
pot:字节{00H~FFH 0-255}
port:字 {0100H-FFFFH 一定用间,port_DX中 }
out port,AL/AX 逗号前面一定是口地址 输出 写 端口 地址
IN AL/AX,port 将接口上的信息送往cpu
JNC P ; 标号
MOV BX, OFFSET A ; 取有效地址 将 A的有效地址 给了BX
LEA DI, A[SI] ;取有效地址 A+SI的值作为 有效地址 给了 DI
CMP AX, 5 对
CMP AL,5 ; 差值 不会返回结果 只用于 比较
寻址
立即数
MOV AX,5
寄存器寻址
直接【地址值】
间接寻址
[R:BX BP SI DI]
寄存器相对寻址
【R+位移量】
基址变址寄存器
【BX/BP+SI/DI】
相对基址变址
[基+变+位移量]-
考点1总结
1.操作数的个数:
2.指令功能:下列各组指令有何区别?
已知 BX=2000H
OR AX, OFFH ; 立即数寻址
OR AX, [OFFH]; 直接寻址
MOV AX,BX ; 寄存器寻址 AX=2000H
MOV AX,[BX]; 寄存器间接寻址 AX=1234H
LEA BX,MESS BX-2000H
MOV BX,MESS BX=1234H
LEA BX, MESS ; 等效
MOV BX, OFFSET MESS ;等效
MOV AL, 0 ; MOV 不影响任何标志位
XOR AL, AL ;AL =0 ,CF=0 ,OF=0
ADD AX, AX ; AX ——2AX 影响 6个状态位
SAL AX, 1 ;左移一位 X2 移除的位 进入 CF
ADD AL, 1
INC AL ; 不影响 CF
SUB AX, CX AX-CX 的 差 给AX
CMP AX, CX AX值不变
-
隐含寻址:
(1) IN/OUT: AX、 DX 不能有 其他寄存器
(2) MUL/DIV: AL、 AX、 DX
(3) CBW/CWD: AL、 AX、 DX
(4) LOOP: CX
(5) DOS中断调用:入口或出口参数 -
比较指令MOV BX, BUF 与LEA BX, BUF
-
比较指令OR BL, OFH 与AND BL, OFH
-
或 已知BL=12H
OR BL,OFH
00010010
00001111
00011111
BL=1FH
与 【清0指令】
0001001
00001111
00000010
BL=02H -
3.比较指令MOV AX,BX 与MOV AX,[BX]
-
4.比较指令MOV AX,[BX+DI] MOV AX,[BP+DI]
-
出现BP用SS
考点2:指令执行后对标志位的影响
(1) INC 和 DEC:
不影响CF,其它状态位影响
(2) MUL
CF=OF=0 乘积的高一半为0
CF=OF=1 乘积的高一半不为0
IMUL
IMUL:CF=OF=0 乘积的高一半为低一半的符号扩展
:(3) AND、 OR、 XOR、 TEST:
CF=OF=0 , AF无定义
(4)移位指令:
CF:移出的位
OF:移位数为1时,移位后最高位与CF不同,则OF=1,否则为0
(5)传送类、符号扩展、无条件、条件转移,循环转移,INT, NOT
不影响任何状态位
考点3:指令的寻址方式
寻址方式:
写出各操作数的寻址方式,计算存储器操作数有效地址(有题需要计算物理地址)
1.设BX=2000H, SI=3000H,指令MOV AX, [BX+SI+8]
a EA=BX+SI+8=5008H
b物理地址 PA =1000HX16+5008H=15008H
- DS=1000H, ES=2000H, BX=3000H,指令ADD AL, [BX]
a EA=BX=2000H
b = PA=DSX16+EA =12000H
3.设DS=2000H, ES=3000H, SI=200H,指令MOV ES: [SI], AL
a EA=SI=200H
b PA=ESX16+EA=3-200H
-
ADD[BX+SI], AL
a EA=BX+SI
b PA=DSX16+EA=
c (PA )_ 字节 +al 的和 给 pa
总线操作需要3次 取指 取数+al 和 送回内存 -
SUB BX, A[SI]
两个总线周期
a EA=SI+A
b PDSX16+EA -
MOV AX, BUF
两个总线周期
a EA=buf
b PA=DSX16+EA -
CMP AL,5 立即数 占用两个字节
8.已知AX=14FOH ,’ BX=035CH , SI=1200H,DS=2000H, (2155CH) =7000H, (215A2H)=75A2H,(215AOH) =7726H,则执行指令ADD AX, [BX+SI+46H]后,AX=8A92H, BX=035CH,ZF=0
a EA=BX+SI+46H=035CH+1200H+0046H
15A2H
b PA=DSX16+EA=215A2H
c AX=14F0H, (215A2H)=75A2H
d 求和: ALU中 14F0H+75A2H = 8A92H
先 计算出 有效地址
通过有效地址 计算 物理地址
通过物理地址找出 单元地址 再通过 AX的值 与 单元地址求和
数据段中有以下定义:
ARRAY1 EQU 16H ; 符号名,EQU定义不占内存
ARRAY2 DW 16H ;变量 占用内存
请指出下面两条指令的寻址方式:
MOV AX, ARRAY1 ;寻址方式 立即数
MOV AX, ARRAY2 ;寻址方式 直接寻址
专项练习 2. 选择题
(1)用一条指令实现将BX+SI→ AX的方法是( )。
A. XCHG AX, [BX][SI]
B. MOV AX, [BX+SI] ;[MOV 是将 【的内容给了AX】]
C. LEA AX, BX[SI]
D. LEA AX, [BX][SI]
(2)在下列指令中, ()指令的执行会影响条件码中的CF位。
A. JMP NEXT
B. JC NEXT
C. INC BX
D. SHL AX,1 [左移指令影响CF 移出的位 移进CF CF=0正 CF=1负]
SHR AX,1 CF=1,D0=1 奇数
CF=0.D0=0 偶数
通过左移 就可以判断出 结果是正或者负
统计AX中1的个数
L2:SHL AX,1
JNC L1 ; CF-0转L1
L1::LOOP L2
(3)条件转移指令JB产生程序转移的条件是( )。
A. CF=1
B. CF=0
C. CF=1和ZF=1[如果是JB选A JBE选C JA时选C]
D. CF=1和ZF=0
CMP AX,BX
JB L1; 当AX<BX时转L1
另外一种情况
CMP AX,BX
JBE L1
条件转移
JB:无符号小于时转
JA: 大于时
JL : 有 符号 小于时转
JG 大
(3)条件转移指令JB产生程序转移的条件是()
A. CF=1 【JB】
B. CF=0 [JA]
C. CF=1和ZF=1 【JBE】
D. CF=1和ZF=0
JBE 小于等于转
CMP AX=<BX
JBE L1
(4)条件转移指令JNBE产生转移的条件是( )。
A.CF=0且ZF=0
B.CF=0且ZF=1
C.CF=1且ZF=0
D.CF=1且ZF=1
(5)循环指令LOOPNZ终止循环的条件是( D)。
A.CK=0,且ZF=0
B.CX=0,或ZF=1
C.CX≠0,且ZF=0
D.CX≠0,或ZF=1
LOOP L1; CX≠0时转L1
CX=0时 结束循环
LOOPZ L2 ; CX≠0时且ZF=0时 转L2
CX=0 或 ZF=1 退出
LOOP≠Z L3 ; CX≠0且 ZF=0 时 转L3
CX=0或者 ZF为1 时 退出
6)下列逻辑运算指令中,不允许使用立即数为操作数的指令为(D)。
A. AND[双] B. OR[双] C. XOR[双] D. NOT[单]
(7)若将BL寄存器中的D1、D3、D4和D6位取反,应使用(C)
[BL=D 7 6 5 4 3 2 1 0]
FFH=1 1 1 1 1 1 11
1 0 1 0 0 1 01
A. AND BL, 5AH ;清 0
B. OR BL, 5AH ;置一
C. XOR BL, 5AН ; 取反
D. TEST BL, 5AH ;测试
(8)在下列指令中,不影响堆栈内容的指令是(C)。
A. PUSH 【入栈】
B. RET 【返主】
C. JMP 【无条件转移指令 】
D. CALL【调子】
(9)当执行指令ADDAX, BX后,若AX的内容为2BAOH,设置的奇偶标志位PF=1【偶校验】,下面的叙述正确的是( D)。
A.表示结果中含1的个数为偶数
B. 表示结果中含1的个数为奇数
c. 表示该数为偶数
D.表示结果中低八位含1的个数为偶数
0010101110100000
低8位 1的个数为偶数
(10)设DS=1100H, (12000H) =80H, (12001H) =20H, (12002H) =30H,执行 MOV AX, [1000H]则AX=©。
A.8000H
B.0080H
C.2080H
D.8020H
EA=1000H
PA=12000H
12000 H [80]
1201H [20]
12002H [30]
(11)已定义数据段,
DATA SEGMENT
ORG 0213H ;定义下一个内存单元的有效地址
**DA1** DB 15H, 34H, 55H ;在DA1地址定义了 3个字节变量
ADR DW **DA1** ;*ADR DW 0213H*
DATA ENDS
下述语句能使AX中数据为偶数的语句是()
A. MOV AX, WORD PTR DA1
B. MOV AL, DA1+2
C. MOV AL, BYTE PTR ADR+1
D. MOV AX, WORD PTR DA1+2
(12)数据段有如下语句:
ORG 0435H
DA1 DB 17H, 44H, 77H
ADR DW DA
1下述语句能使AL中的数据为偶数的是(B)
A. MOV AX, WORD PTR DA1
B. MOV AX, WORD PTR DA1+1
C. MOV AX, ADR
D. MOV AL, BYTE PTR ADR
(1)对于乘法,除法指令,其目的操作数存放在AX或DX:AX,而其源操作数,可以用除立即数以外的任一种寻址方式。
MUL OPR ; 如果是字节的话 ALXOPR 为字 存放到AX中
如果是 字 AX X OPR 为双字 32位 【DX:AX】 DX为高16位
(2)试比较以下几条指令的功能。
MOV BX, SI ; 寄存器寻址
MOV BX, [SII ;寄存器间接寻址
MOV BX, OFFSET[SI] ;有效地址给BX
LEA BX, [SI] ;有效地址给BX
LDS BX, [SI] ;取两个字 1送BX 2送DS
LES BX, [SI]
答:
MOV BX, SI ;将SI的值送给BX
MOV BX,[SI];将SI的值作为偏移地址找到对应的内存单元中的值送给BX
MOV BX,OFFSET[SI];将SI的值作为偏移地址找到对应内存单元的偏移地址送给BX,即SI的值送给BX
LEA BX, [SI] ;将SI的值作为偏移地址找到对应内存单元的偏移地址送给BX,即SI的值送给BX
LDS BX, [SI] ;将SI值作为偏移地址找到对应内存单元中的第一个字值送给BX, 第二个字值送DS
LES BX,[SI] :将SI值作为偏移地址找到对应内存单元中的第一个字值送给BX,第二个字值送ES
考点4:阅读、编写汇编语言程序段
专项练习,三、程序段:
7.执行上述指令序列后, AL=**00H** -, AH=**7EH** BH= **FEH**
MOV AX, OFFFFH ; AX=0FFFFH
AND AL, 0 ;AL=FFH 与 0 相与 11111111与0== AL=0
XOR AH, 80H ; AH FFH 与 80H进行异或 1111111111111111与10000000=AH=7FH
MOV BH, AH ;将AH的值给BH,BH=7FH
SHL BH, 1 ;将BH左移一位 (二进制) 11111110 = BH =FEH
8,下面程序段完成的功能是什么?
MOV AX, X ; X=1234H
MOV DX, Z ; Z=5678H
SHR DX, 1 ; ;Z=2B3CH
RCR AX, 1 ; 考虑进位标志位的情况下移除
功能是 32位数据循环移位
9,下面程序段执行后AX=, CF=
XOR AX, AX :将AX寄存器的内容与自身进行异或操作,这将将AX寄存器的所有位设置为0。
MOV AX, 6342H ;将16位立即数0x6342加载到AX寄存器,所以现在AX的值为0x6342。
MOV CX, 0404H :将16位立即数0x0404加载到CX寄存器,所以CX的值为0x0404。
ROL AH, CL :将AH寄存器(AX的高字节)向左循环移位,移位位数由CL寄存器的低8位确定。在这里,CL的值为0x04,所以AH寄存器向左移位4位。由于初始情况下AH为0x63,左移4位后,AH的值变为0x36。
XCH CH, CL;交换CH和CL寄存器的值,所以CH现在的值为0x04,CL的值为0x36。
ROR AL, CL:将AL寄存器(AX的低字节)向右循环移位,移位位数由CL寄存器的低8位确定。在这里,CL的值为0x36,所以AL寄存器向右移位36位。由于初始情况下AL为0x42,向右移位4位后,AL的值变为0x24(因为循环移位会将移出的位再次移回来)。
AX = 0x3624
CF = 0(没有进位发生,因为ROR指令是循环移位,没有位被移出)。
所以,AX的值为0x3622,CF的值为0。
10.现有程序段如下:
MOV AX,1
MOV BX, 2
MOV CX, 4
MOV DX, 3
L: INC AX
ADD BX, AX
SHR DX, 1
LOOPNZ L
请回答: (1)该程序段的循环次数是多少?
(2)该程序段执行完后AX=3, BX=7, CX=2, DX=0
一、填空题
1,汇编语言源程序至少须有一个___代码段段
2. 程序结束伪指令是___end_
3. 过程定义伪指令是__过程名 proc 过程名 endp_____
4.用CBW指令生成双倍长数据,存放在__AX__中,用CWD生成双字放在_DX,AX_____中。
5,指令中数据的寻址方式是指寻找__操作数___的方式
6,用Dw语句定义的一个字1234H的语句是
DW 1234H
7,用DB定义一个字1234H的语句是
DB 34H,12H
4. 一个机器指令包括___操作码_和操作数两部分。
8,下述指令序列运行后, BX的内容是 **0002**
DATA SEGMENT ;没有ORG定义 默认内存单元偏移地址从 0000H开始
TA1 DW 0102H, 0304H, 0506H ;从变量TA1内存单元中连续存放3个字数据
TA2 DB 02H, 03H, 04H ;在TA1 存放的数据后 存放3个字节数据
MOV BX, DS: [0006H];将地址0006H的字数据给BX 此时BX=0302H
AND BX, OFFH;将0302H与0FFH相与,结果为0002H
AND BH, [BX] ; 将BX内存单元的内容0002H的BH=00H BL=02H 取的内容是04H
9.数据段定义如下:
ORG 0020H
BUF DB 3,4,‘34’
ARR DW 3,43,4
NUM EQU ARR-BUF
①该数据段占用的存储字节数是
② NUM的值是