本文将结合老师说的考试范围与PPT,对所涉及的知识点作个人总结,面向考试复习(高星,yyds

为了网页加载快一点将文章分开发了

实在是太多了

九、MOV指令总结

(一)立即数传送(MOV reg/mem,imm)

例:MOV CX,0FFH (字传送)

MOV BYTE PTR [SI],0AH (字节操作)

MOV WORD PTR [SI+2],0BH(字操作)

即:立即数可以传到寄存器和存储器

(二)寄存器传送(MOV reg/mem/seg,reg)

例:MOV AX,BX

​ MOV AH,AL

​ MOV DS,AX

​ MOV [BX],AL

即:寄存器可以传到寄存器、存储器和段寄存器中。

(三)存储器传送(MOV reg/seg,mem)

例:MOV AL,[BX]

​ MOV DX,[BP]

​ MOV ES,[SI]

注:不存在存储器向存储器的传送(除串操作)

(四)段寄存器传送(MOV reg/mem,seg)

例:MOV [SI],DS

​ MOV AX,ES

​ MOV DS,AX

上述两个语句可以实现从一个段到另一个段的传送(通过寄存器中转)

总结:

(五)非法传送实例

1.两个操作数的类型不一致

绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令

MOV AL,050AH ;非法指令:050Ah为字,而AL为字节

对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型

MOV BYTE PTR [SI],0AH (字节操作)

MOV WORD PTR [SI+2],0BH(字操作)

2.两个操作数不能都是存储器

存储器之间的传送,可以通过寄存器中转实现

MOV AX,BUFFER1

MOV BUFFER2,AX

3.段寄存器的操作有一些限制

段寄存器属专用寄存器,对他们的操作能力有限

不允许立即数传送给段寄存器

MOV DS,100H;非法指令:立即数不能传送段寄存器

不允许直接改变CS值

MOV CS,[SI] ;不允许使用的指令

不允许段寄存器之间的直接数据传送

MOV DS,ES;非法指令:不允许段寄存器间传送

​ MOV AX,ES

​ MOV DS,AX

上述两个语句可以实现从一个段到另一个段的传送(通过寄存器中转)

十、堆栈

注意:

  1. 堆栈操作的单位是字,进栈和出栈只对字量
  2. 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节
  3. 在pop指令中,POP CS 为非法指令
  4. 堆栈操作不影响标志

十一、标志寄存器

标志(Flag)用于反映指令执行结果或控制指令执行形式。

8086中,各种常用的标志形成16位标志寄存器FLAGS(程序状态字PSW寄存器)分成两类:

(1) 状态标志

状态标志是最基本的标志,用来记录指令执行结果的辅助信息。加、减运算和逻辑运算指令是主要设置他们的指令,有些其他指令的执行也会相应地设置它们。

①进位标志CF(Carry Flag)

当运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF = 1;否则CF = 0。

例:AAH + 7CH=(1)26H,有进位:CF = 1

②溢出标志OF(Overflow Flag)

若算术运算的结果有溢出,则OF=1;否则 OF=0

例:3AH+ 7CH=B6H,就是58+124=182,超出了+127~-128范围。

产生溢出:OF = 1

重点:什么是溢出?

处理器内部以补码表示有符号数

8位表达的整数范围是:+127~-128

16位表达的范围是:+32767~-32768

如果运算结果超出这个范围,就产生了溢出。有溢出,说明有符号数的运算结果不正确

溢出和进位有什么区别?

进位标志表示无符号数运算结果是否超出范围,超出范围后加上进位或借位运算结果仍然正确

溢出标志表示有符号数运算结果是否超出范围,超出范围后运算结果不正确

如何判断溢出?

只有当两个相同符号数相加(包括不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;因为,此时的运算结果显然不正确

其他情况下,则不会产生溢出

奇偶标志PF(Parity Flag)

1的个数为偶数时,PF=1,奇数为0

仅反映最低8位中“1”的个数是偶或奇,即使是进行16位字操作

例:3AH + 7CH=B6H=10110110B 结果中有5个1,是奇数:PF = 0

零标志ZF(Zero Flag)

运算结果为0,则ZF=1

符号标志SF(Sign Flag)

运算结果最高位为1,则SF = 1;否则SF = 0

例:3AH + 7CH=B6H,最高位D7=1:SF = 1

​ 84H + 7CH=(1)00H,最高位D7=0:SF = 0

(2) 控制标志

控制标志可由程序根据需要用指令设置,用于控制处理器执行指令的方式

方向标志DF(Direction Flag)仅用于串操作指令中

中断允许标志IF(Interruptenable Flag)简称中断标志。

若IF=1,则CPU可以相应外部可屏蔽中断请求

若IF=0,则CPU不允许相应中断请求。

陷阱标志TF(Trap Flag),常称为单步标志。

3.指令指针寄存器(Instruction Pointer)

IP是专用寄存器,具有自动增量的能力。处理器执行完一条指令,IP中的值就加上该指令的字节数,从而指向下一条指令。即:指示代码段中指令的偏移地址

它与代码段寄存器CS联用,确定下一条指令的物理地址

•计算机通过CS : IP寄存器来控制指令序列的执行流程

十二、物理地址和逻辑地址

每个物理存储单元有一个唯一的20位编号,即物理地址

00000H~FFFFFH

•分段后用户编程时,采用逻辑地址:

段基地址 : 段内偏移地址

段地址说明逻辑段在主存中的起始位置,8086规定段地址必须是模16地址:xxxx0H

将逻辑地址中的段地址左移四位,加上偏移地址就得到物理地址。

十三、8086的寻址方式

(一)立即数寻址

立即数寻址方式常用来给寄存器赋值

例:MOV AX,0102H ;AX,<-0102H

(二)寄存器寻址

MOV AX,1234H ;AX←1234H

MOV BX,AX ;BX←AX

(三)存储器寻址

1.直接寻址方式

默认的段地址在DS段寄存器,可使用段超越前缀改变

MOV AX,ES:[2000H](用ES改变)

2.寄存器间接寻址

有效地址存放在基址寄存器BX或变址寄存器SI、DI中

默认的段地址在DS段寄存器,可使用段超越前缀改变

MOV AX,[SI] ;AX←DS:[SI]

3.寄存器相对寻址

段地址对应BX/SI/DI寄存器默认在DS,对应BP寄存器默认在SS;可用段超越前缀

MOV AX,[DI+06H] ;AX←DS:[DI+06H]

MOV AX,[BP+06H] ;AX←SS:[BP+06H]

4.基址变址寻址方式

有效地址=BX/BP+SI/DI

段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀

MOV AX,[BX+SI] ;AX←DS:[BX+SI]

MOV AX,[BP+DI] ;AX←SS:[BP+DI]

MOV AX,DS:[BP+DI] ;AX←DS:[BP+DI]

5.相对基址变址寻址

有效地址=BX/BP+SI/DI+8/16位位移量

MOV AX,[BX+SI+06H] ;AX←DS:[BX+SI+06H]

(四)多种表示

十四、各种指令

XCHG

XCHG reg,reg/mem

不能在存储器与存储器之间对换数据

XLAT 换码指令

LEA 有效地址传送指令

存储器操作数的有效地址传送至指定的16位寄存器

例:

MOV BX,0400H

MOV SI,3CH

LEA BX,[BX+SI+0F62H]

;BX=0400H+003CH+0F62H=139EH

ADD 加法/SUB 减法

将源与目的操作数相加/减,结果送到目的操作数

ADD AL,BL

(ADD mem,imm/reg)

ADD WORD PTR [BX+2],0F0F0H

INC(increment)DEC(decrement)

注意:INC/DEC指令不影响进位CF标志,按定义设置其他状态标志

主要用于对计数器和地址指针的调整

求补指令NEG(negative)

NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数

求补运算也可以表达成:将操作数按位取反后加1

NEG指令对标志的影响与用零作减法的SUB指令一样

NEG reg/mem

比较指令CMP(compare)

CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志

但结果不回送目的操作数

乘法 MUL/IMUL

源操作数显式给出,隐含使用另一个操作数AX和DX

•字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX

•字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX

•乘法指令如下影响OF和CF标志:

•MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1

•IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1

乘法指令对其他状态标志没有定义

除法 DIV IDIV

•除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数

•字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH

•字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX

•除法指令对标志没有定义

除法指令会产生结果溢出

•当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生溢出,8086CPU中就产生编号为0的内部中断——除法错中断

CBW/CWD

对有符号数除法,可以利用符号扩展指令得到倍长于除数的被除数

对无符号数除法,采用直接使高8位或高16位清0,获得倍长的被除数。这就是零位扩展

TEST与CMP

TEST不影响目的操作数,只根据运算结果设置标志。

test逻辑与(AND)运算结果为零,就把ZF(零标志)置1;
cmp 算术减法运算(SUB)结果为零,就把ZF(零标志)置1.

NOT 逻辑非(按位取反)

NOT reg/mem 不影响任何标志。

SHL/SAL/SHR/SAR

SHL reg/mem,1/CL逻辑左移,最高位进入CF,最低位补0

操作数左移一位,相当于乘2(对有符号数同理,只要OF=0,结果就对)。

③操作数逻辑右移(SHR)一位,相当于无符号数除以2;操作数算术右移(SAR)一位,相当于有符号数除以2。

循环移位

RCL/RCR 带着CF位循环左右移 ROL/ROR 不带CF左右移

RCL是将某数最高位移进入CF,而CF里的内容跑到该数的最低位,形成咬尾蛇循环,移位次数为CL或CX指定的次数

例:将32位左移一位

十五、控制转移类指令

段内转移、间接寻址

JMP R16/M16 ;IP←R16/M16

JMP WORD PTR [2000H] ;IP←[2000H]

段间转移、直接寻址

JMP FAR PTR LABEL

;IP←LABEL的偏移地址

;CS←LABEL的段地址

段间转移、间接寻址

JMP FAR PTR MEM

;IP←[MEM],CS←[MEM+2]

十六、大小与高低

无符号数的大小用高(Above)低Below)表示

•利用CF确定高低、利用ZF标志确定相等(Equal)

•两数的高低分成4种关系:

⑴ 低于(不高于等于):JB(JNAE)

⑵ 不低于(高于等于):JNB(JAE)

⑶ 低于等于(不高于):JBE(JNA)

⑷ 不低于等于(高于):JNBE(JA )

•有符号数大(Greater)小(Less)

需要组合OF、SF标志,并利用ZF标志确定相等(Equal)

•两数的大小分成4种关系:

⑴ 小于(不大于等于):JL(JNGE)

⑵ 不小于(大于等于):JNL(JGE)

⑶ 小于等于(不大于):JLE(JNG)

⑷ 不小于等于(大于):JNLE(JG )

JCXZ CX=0**) 串操作是否处理完所有**

LOOP label CX!=0 循环label

LOOPZ label CX!=0且ZF=1 循环label

循环指令默认利用CX计数器

label操作数采用相对短转移寻址方式

空操作指令 NOP

不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期

作用:预留空间 删除指令 软件延时

•事实上,NOP和XCHG AX,AX的指令代码一样,都是 90H

ORG参数(使他后面的数据或指令从参数指定的地址开始)

ORG 100H;从0100H单元开始分配存储器。

ORG $+10;$表示地址计数器的当前值,$+10

表示由当前地址向前跳过10个字节。

•EVEN ;从偶地址开始

•ALIGN n ;从n的整数倍地址开始

十七、地址操作符和类型操作符

(一)地址操作符

mov bx,offset array ;等价于 lea bx,array

mov cl,array+4 ;等效于 mov cl,array[4]

(二)类型操作符

PTR操作符:使名字或标号具有指定的类型

mov al,byte ptr w_var ;w_var是一个字变量

jmp far ptr n_label ;n_label是一个标号

THIS

•利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
.model small
.stack
.data
V_byte equ this byte
V_word dw 3332h,3735h
Target dw 5 dup(20h)
Crlf db 0dh,0ah, ‘$
Flag db 0
N_point dw offset s_label
.code
.startup
mov al,byte ptr v_word
dec al
mov v_byte ,al;v_word=3331h
N_label:cmp flag,1 ;flag单元=0
jz s_label
inc flag ;flag=1
jmp short n_label
S_label: cmp flag,2 ;flag=1
jz next
inc flag ;flag=2
jmp n_point ;段内间接转移,等同于jmp s_label
Next: mov ax,type v_word ;ax=0002h
mov cx,lengthof target;5个数据项,cx=5
mov si,offset target
W_again: mov [si],ax
inc si
inc si
loop w_again;对target填充5个字:0002h
mov cx,sizeof target;cx=10
mov al,’?’
mov di,offset target
B_again: mov [di],al
inc di
loop b_again ;对target填充10个‘?’
mov dx,offset v_word
mov ah,9
int 21h ;显示结果为1357??????????
.exit 0
end

十八、简化段定义标准格式

结语

只花了一天的时间去复习整理汇编语言,希望别挂科就好

后面看到这篇的人一定要好好学汇编啊。

张海英你没有心(确信)