汇编语言总复习(中)
本文将结合老师说的考试范围与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
上述两个语句可以实现从一个段到另一个段的传送(通过寄存器中转)
十、堆栈
注意:
- 堆栈操作的单位是字,进栈和出栈只对字量
- 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节
- 在pop指令中,POP CS 为非法指令
- 堆栈操作不影响标志
十一、标志寄存器
标志(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 | .model small |
十八、简化段定义标准格式
结语
只花了一天的时间去复习整理汇编语言,希望别挂科就好
后面看到这篇的人一定要好好学汇编啊。
张海英你没有心(确信)