指令对标志寄存器的影响总结
常用汇编指令对标志位的影响
常用汇编指令对标志位的影响1000字汇编语言中,标志位用来表示CPU运算过程中的一些状态。
不同的指令对标志位有不同的影响,下面列举一些常用汇编指令对标志位的影响:1. ADD指令:加法运算指令,将两个操作数相加,结果存储在目的操作数中。
如果结果为0,标志位ZF被设置为1,如果溢出,标志位OF被设置为1,如果结果是负数,标志位SF被设置为1。
2. SUB指令:减法运算指令,将两个操作数相减,结果存储在目的操作数中。
如果结果为0,标志位ZF被设置为1,如果溢出,标志位OF被设置为1,如果结果是负数,标志位SF被设置为1。
3. MOV指令:将源操作数的值赋值给目的操作数。
MOV指令不影响标志位。
4. CMP指令:比较两个操作数的大小关系。
如果源操作数小于目的操作数,则标志位CF被设置为1,如果相等,则标志位ZF被设置为1,如果源操作数大于目的操作数,则标志位SF被设置为1。
5. INC指令:将操作数加1。
如果结果为0,标志位ZF被设置为1,如果溢出,标志位OF被设置为1,如果结果是负数,标志位SF被设置为1。
6. DEC指令:将操作数减1。
如果结果为0,标志位ZF被设置为1,如果溢出,标志位OF被设置为1,如果结果是负数,标志位SF被设置为1。
7. AND指令:按位与操作。
如果结果为0,标志位ZF被设置为1,如果结果为负数,标志位SF被设置为1。
8. OR指令:按位或操作。
如果结果为0,标志位ZF被设置为1,如果结果为负数,标志位SF被设置为1。
9. XOR指令:按位异或操作。
如果结果为0,标志位ZF被设置为1,如果结果为负数,标志位SF被设置为1。
10. SHR指令:逻辑右移指令。
如果结果的最低位是1,标志位CF被设置为1,如果结果为0,标志位ZF被设置为1,如果结果为负数,标志位SF被设置为1。
11. SHL指令:逻辑左移指令。
如果溢出,标志位OF被设置为1,如果结果为0,标志位ZF被设置为1,如果结果为负数,标志位SF 被设置为1。
汇编语言与接口技术习题答案
第3章 80X86的指令系统和寻址方式本章主要讲授:本章主要讲授:80X8680X86的数据类型、寻址方式、指令格式、指令系统(数据传送指令、算术运算指令、逻辑运算指令、串操作数指令、控制转移指令、处理机指令和高级语言指令)和80486指令等。
通过本章的学习,注意下面几方面的内容:一、掌握80X86的数据类型;二、掌握80X86的寻址方式;三、掌握80X86的指令系统及它们的一些使用实例。
四、了解保护属性检查指令、高级语言指令以及Cache 管理指令等。
习题精解1.已知DS DS==2000H 2000H,,BX BX==0100H 0100H,,SI SI==0002H 0002H,存储单元,存储单元,存储单元[20100H][20100H][20100H]~~[20103H][20103H]依次存放依次存放12 34 56 78H 56 78H,,[21200H][21200H]~~[21203H][21203H]依次存放依次存放2A 4C B7 65H 2A 4C B7 65H,说明下列每条指令执行后,说明下列每条指令执行后AX 寄存器的内容。
(1)MOV AX AX,,1200H (2)MOV AX AX,,BX (3)MOV AX AX,,[1200H] (4)MOV AX AX,,[BX] (5)MOV AX AX,,[BX+1100H] (6)MOV AX AX,,[BX + SI] (7)MOV AX AX,,[BX][SI+1100H]参考答案:根据物理地址形成公式:物理地址=段基址×根据物理地址形成公式:物理地址=段基址×161616+有效地址,得:+有效地址,得:(1)1200H(2)0100H(3)4C2AH(4)3412H(5)4C2AH(6)7856H(7) 65B7H分析:本题主要考查点是数据寻址方式,寻址方式就是指令中用于说明操作数所在地址的方法,或者是寻找操作数有效地址的方法。
汇编基本指令对标志位的影响
汇编基本指令对标志位的影响算术运算指令1、加法指令1)、普通加法指令ADD ADD reg/mem,reg/mem/imm受影响标志位:AF/CF/OF/PF/SF/ZF 2)、带进位的加法ADC ADCreg/mem,reg/mem/imm受影响标志位:AF/CF/OF/PF/SF/ZF该指令和1)中唯一不同的是除了执行1)中加法外还要加上CF。
3)、加1指令INC INC reg/mem受影响标志位:AF/OF/PF/SF/ZF 4)、交换加法指令XADD XADDreg/mem,reg该指令首先交换两个操作数的值,然再做加法,相当于以下两条指令:XCHG reg/mem,reg ADD reg.mem,reg 2、减法指令[和加法指令相反]1)、普通减法SUB 2)、带借位的减法SBB除了1)中减法还有减去CF 3)、减1指令DEC 4)、求补指令NEG NEG reg/mem受影响标志位:AF/CF/OF/PF/SF/ZF执行结果:操作数=0-操作数3、乘法指令分为带符号乘法和无符号乘法,区别在于:数据的最高位是作为符号还是数值参与运算。
1)、无符号乘法MUL MUL reg/mem受影响标志位:CF/OF我们知道乘法要有乘数和被乘数,指令中只有一个操作数,所以我们必须知道第二个操作数在哪里。
Intel处理的方式是,被乘数提前存在EAX中,然后与给出的乘数相乘,结果放在规定的寄存器中:乘数位数隐含的被乘数乘积存放位置[高-低]举例8 AL AX MUL CL 16 AX DX-AX NUL CX 32 EAX EDX-EAX MUL ECX 2)、有符号乘法IMUL IMUL reg/mem受影响标志位:CF/OF其操作数都作为有符号数相乘。
4、除法指令1)无符号除法DIV reg/mem不影响标志位被除数默认存放规则如下:除数位数隐含的被除数商余数8 AX AL AH 16 DX-AX AX DX 32 EDX-EAX EAX EDX 2)有符号除法IDIV reg/mem受影响标志位:AF/CF/OF/PF/SF/ZF三、逻辑运算指令1、逻辑与AND指令AND reg/mem,reg/mem/imm受影响的标志位:CF(0)/OF(0)/SF/PF/ZF执行过程:源操作数和目的操作数进行逻辑与运算,结果存放在目的操作数。
FLAGS标志寄存器讲解
微机原理整理江苏大学非计算机专业使用,本人私人资料;微机原理97FLAGS标志寄存器:6个状态标志位和3个控制标志CF:进位标志位。
当进行加减法运算时,若最高位向前有进借位CF=1,无CF=0。
PF:奇偶标志位。
当运算结果的低8位中1的个数为偶数时PF=1,为奇数时PF=0。
AF:辅助进位标志。
D3向D4有借进位发生时AF=1,无借进位发生AF=0。
ZF:零位标志。
当运算结果为零时ZF=1,运算结果不为零时ZF=0。
SF:符号标志位。
当运算结果的最高位为1时SF=1,最高位为0时SF=0。
OP:溢出标志位。
当运算结果超出了带符号数的范围,即溢出时OF=1,未溢出时OF=0。
(D7为符号位,说明:D7,D6,D5,D4,D3,D2,D1,D0)3.3.2算数运算指令算数运算指令;加,减,乘,除有符号数的溢出:OF无符号数的溢出:CF指令对操作数的要求:单操作数指令中的操作数不允许使用立即数双操作数指令中,立即数只能作为源操作数,不允许源操作数和目的操作数都是存储器。
1,加法运算指令(不允许段寄存器作为操作数和两个都是存储器)1)ADD普通加法指令(对全部6个状态标志位都会产生影响)ADD OPRD1,OPRD2 ;OPRD1+OPRD2送到OPRD1中去ADD [SI],[BX]是错误的;不允许两个操作数都是存储器操作数例:MOV AL,7EHADD AL,5BH程序执行后,AL=D9H,即11011001B, D9H>7FH(8位带符号数的最大值) OF=1D9H<FFH(8位无符号数的最大值) CF=0 所有状态标志位AF=0,CF=0,OF=1,PF=0,SF=1,ZF=02)ADC带进位(CF)位的加法指令(对全部6个状态标志位都会产生影响)ADC OPRD1,OPRD2 ;OPRD1+OPRD2+CF送到OPRD1中去不允许两个操作数都是存储器操作数例:设CF=1,写出以下指令执行后的结果MOV AL,7EHADC AL,0ABH指令执行后:AL=7EH+0ABH+1=2AH,且CF=13)INC加1指令(不影响CF,影响其它5个状态标志)INC OPRD ;OPRD+1送到OPRD中去OPRD不能是立即数通常用于在循环程序中修改地址指针及循环次数2,减法指令(不允许段寄存器作为操作数和两个都是存储器)1)SUB不考虑借位的减法指令(对全部6个状态标志位都会产生影响)SUB OPRD1,OPRD2不允许两个操作数都是存储器操作数例:SUB AL,[BP+SI] ;将SS:[BP+SI]单元的内容送到AL中去基址变址寻址:基址:BX或BP 变址:SI或DIDS☺[BX][变址]SS ☺[BP][变址]2)SBB考虑借位的减法指令(对全部6个状态标志位都会产生影响)SUB OPRD1,OPRD2 ;将OPRD1-OPRD2-CF送到OPRD1中不允许两个操作数都是存储器操作数3)DEC减1指令(不影响CF,影响其它5个状态标志)DEC OPRDOPRD不能是立即数4)NEG求补指令(对全部6个状态标志位都会产生影响)NEG OPRD (求负数的绝对值);用0-OPRD CF通常为1,除非OPRD为0OF通常为0,除非OPRD为80H(-128)或8000H(-32768),执行后操作数不变,但是OF为1。
掌握ADD,SUB等汇编指令及其对标志位的影响
电子信息工程学系实验报告 ——适用于计算机课程课程名称:汇编语言程序设计实验项目名称:掌握ADD,SUB 等汇编指令及其对标志位的影响实验时间:班级: 姓名: 学号:实 验 目 的:掌握ADD,SUB,MUL,IMUL,DIV,IDIV 汇编算术指令以及它们对标志位的影响。
实 验 环 境:微机一台,操作系统:WINXP2,轻松汇编实 验 内 容 及 过 程:输入给出程序,通过对程序的调试掌握ADD,SUB 等汇编指令的操作及其对标志位的影响;编程实现Z (W*X )/(Y+6) ,R 余数(其中X ,Y ,Z ,R 和W 均为存放16为带符号数单元的地址。
1、上机输入以下程序: code segment main proc far assume cs:code start:push ds xor ax,ax push axmov ax,0 dec axadd ax,7FFFH add ax,2 neg axsub ax,0FFFFHret main endp code ends end2、 写出上面汇编程序中字体为红色的指令执行后,AX 寄存器及标志位CF ,SF ,ZF 和OF 的内容是什么?3、编程实现Z (W*X )/(Y+6),R 余数(其中X ,Y ,Z ,R 和W 均为存放16位带符号数单元的地址。
实 验 结 果 及 分 析:2、由以上运行结果可知执行程序1的指令后,AX寄存器及标志位CF,SF,ZF和OF的内容如表格所示:Mov为传送指令不影响标志位;dec不影响CF,影响SF、ZF、OF;add影响标志位CF,SF,ZF和OF;neg影响CF,SF,ZF和OF;sub影响标志位CF,SF,ZF和OF。
在本程序中(程序2)AX(商)的值也即Z(商)的值,DX(余数)的值也即R(余数)的值。
实验心得:。
8086-8088 CPU的指令系统算术运算指令
微机原理
OP1 OP2
运算器
F
(a)
OP1 OP2
运算器
F
(b)
微机原理
⑵ ADC 带进位加法指令 指令格式:ADC DST,SRC 执行操作:(DST)←(SRC)+(DST)+CF 影响的标志位:OF、SF、ZF、AF、PF、CF ⑶ INC 加1指令 指令格式:INC OPR 执行操作:(OPR)←(OPR)+1。 影响的标志位:OF、SF、ZF、AF、PF。
⑵ IDIV 带符号数除法指令
指令格式:IDIV SRC 执行操作:与DIV相同,但操作数必须是带符号数,商 和余数也均为带符号数,用补码表示
⑶ CBW 字节转换为字指令 格式:CBW 执行操作:将AL的符号位扩展到整个AH 若AL的符号位为0,则AH←00H 若AL的符号位为1,则AH←0FFH 对标志位的影响:不影响标志位
微机原理
3.乘法指令 ⑴ MUL 无符号数乘法指令 指令格式:MUL SRC 执行操作: 字节操作数 AX←AL×(SRC)。 字操作数 DX,AX←AX×(SRC)。 对标志位的影响:OF、CF ⑵ IMUL 有符号数乘法指令 指令格式:IMUL SRC 执行操作:字节操作数AX←AL×(SRC)
微机原理
5.十进制调整指令 ⑴压缩的BCD码调整指令 ① DAA 加法的十进制调整指令 指令格式:DAA 执行操作:AL←加法结果AL的内容调整到压 缩的BCD码格式 标志位的影响:SF、ZF、AF、PF、CF
例:MOV AL, 28H MOV BL, 68H ADD AL, BL DAA
微机原理
MOV AL,08H
AAD
AL= 44H
AH=0
微型计算机基本原理与接口技术
8086标志寄存器
8086标志寄存器CPU内部的寄存器中,有⼀种特殊的寄存器(对于不同的机器,个数和结构都有可能不同)具有以下三个功能:⽤来存储某些相关指令的执⾏结果⽤来为CPU执⾏相关的指令提供⾏为依据⽤来控制CPU的相关⼯作⽅式这种特殊的寄存器在8086CPU中称为标志寄存器。
8086的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。
标志寄存器与其他寄存器不⼀样,其他寄存器是⽤来放数据的,都是整个寄存器具有⼀个含义,⽽标志寄存器是按位起作⽤的。
8086中的标志寄存器的结构如下图所⽰:其中1、3、4、12、13、14、15位在8086中没有使⽤。
另外对于有确切含义的每⼀位,我们称为标志位ZF标志标志寄存器的第六位是ZF,零标志位。
他是记录相关指令执⾏后,其结果是否位零。
如果为零,那么zf=1,如果不为零,那么zf=0⽐如指令:mov ax, 1sub ax, 1执⾏后,ax的结果为0,所以zf=1再⽐如:mov ax, 2sub ax, 1执⾏后,ax的结果不为0,所以zf=0在这⾥,有⼀点需要注意:在8086的指令集中,有的指令的执⾏是影响标志位的,⽐如add、sub、mul、div、inc、or、and等,它们⼤都是运算指令(进⾏逻辑或算数运算);有的指令的执⾏对标志寄存器没有影响,⽐如mov、push、pop等,它们⼤都是传送指令。
PF标志标志寄存器的第⼆位是PF,奇偶标志位。
它记录相关指令执⾏后,其结果的所有bit位中1的个数是否位偶数。
如果是偶数,pf=1,如果位奇数,pf=0⽐如指令:mov al, 1add al, 10执⾏后,al为00001011B,其中有3个1,所以pf=0再⽐如:mov al, 1or al, 2执⾏后结果为00000011B,其中有2个1,所以pf=1SF标志标志寄存器的第七位是SF,符号标志位。
它记录相关指令执⾏后,其结果是否为负。
如果为负,sf=1,如果⾮负,sf=0这⾥要明确⼀点,在计算机中,通常⽤补码来表⽰有符号的数据,计算机中的⼀个数据既可以看作有符号数,也可以看作⽆符号数。
8086汇编cmp指令
8086汇编cmp指令8086汇编 cmp 指令cmp 是⽐较指令,功能相当于减法指令,只是不保存结果。
cmp 指令执⾏后,将对标志寄存器产⽣影响。
格式:cmp 操作对象1,操作对象2功能:计算操作对象1–操作对象2原理:通过做减法运算影响标志寄存器,标志寄存器的相关位的取值,体现⽐较的结果。
cmp 指令说明⼀、应⽤使⽤其他相关指令通过识别这些被影响的标志寄存器位来得知⽐较结果。
应⽤⽅法:⽤标志寄存器值,确定⽐较结果。
⼆、⽆符号数⽐较与标志位取值思路:通过cmp 指令执⾏后相关标志位的值,可以看出⽐较的结果指令:cmp ax,bx三、有符号数⽐较与标志位取值问题:⽤cmp来进⾏有符号数⽐较时,CPU⽤哪些标志位对⽐较结果进⾏记录仅凭结果正负(SF)⽆法得出结论,需要配合是否溢出(OF)得到结论。
⽰例指令:cmp ah,bh条件转移指令;或者其他影响标志寄存器的指令cmp oper1, oper2jxxx 标号⼀、根据单个标志位转移的指令⼆、根据⽆符号数⽐较结果进⾏转移的指令三、根据有符号数⽐较结果进⾏转移的指令四、转移指令全写j-Jump e-Equal n-Not b-Below a-Above L-less g-Greater s-Sign C-carry p-Parity o-Overflow z-Zero 条件准转移指令使⽤jxxx系列指令和cmp指令配合,构造条件转移指令不必再考虑cmp指令对相关标志位的影响和jxxx指令对相关标志位的检测可以直接考虑cmp和jxxx指令配合使⽤时表现出来的逻辑含义。
jxxx系列指令和cmp指令配合实现⾼级语⾔中if语句的功能例1:如果(ah)=(bh),则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)例2:如果(ax)=0,则(ax)=(ax)+1。
常用汇编指令及其影响的标志位
常⽤汇编指令及其影响的标志位加法指令 ADD (addition)指令对标志位的影响:CF=1 最⾼有效位向⾼位有进位CF=0 最⾼有效位向⾼位⽆进位OF=1 两个同符号数相加(正数+正数或负数+负数),结果符号与其相反。
OF=0 两个不同符号数相加,或同符号数相加,结果符号与其相同。
带进位加法指令 ADC (add with carry)指令对标志位的影响:CF=1 最⾼有效位向⾼位有进位CF=0 最低有效位相⾼位⽆进位OF=1 两个同符号数相加,结果符号与其相反,OF=0 两个同符号数相加,或同符号相加,结果符号与其相同加1指令 INC (increament)指令对标志位的影响:对CF⽆影响OF=1 两个同符号数相加,结果符号与其相反,OF=0 两个同符号数相加,或同符号相加,结果符号与其相同。
减法指令 SUB (subtract)指令对标志位的影响:CF=1 ⼆进制减法运算中最⾼有效位向⾼位有借位(被减数⼩于减数,不够减的情况)CF=0 ⼆进制减法运算中最⾼有效为向⾼位⽆借位(被减数〉=减数,够减的情况)OF=1 两数符号相反(正数-负数,或负数-正数),⽽结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
带借位减法指令 SBB (subtract with borrow)指令对标志位的影响:CF=1 ⼆进制减法运算中最⾼有效位向⾼位有借位(被减数⼩于减数,不够减的情况)CF=0 ⼆进制减法运算中最⾼有效为向⾼位⽆借位(被减数〉=减数,够减的情况)OF=1 两数符号相反(正数-负数,或负数-正数),⽽结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
减1指令 DEC (decrement)指令对标志位的影响:对CF⽆影响OF=1 两数符号相反(正数-负数,或负数-正数),⽽结果符号与减数相同。
OF=0 同符号数相减时,或不同符号数相减,其结果符号与减数不同。
8086指令系统总结
8086指令系统总结学习微处理器及其程序设计,必须掌握微处理器的指令系统。
本章以 8086 微处理器为例介绍微型计算机的指令系统,包括指令格式、寻址方式和各类指令功能。
要明确各种寻址方式的区别和特点,掌握有效地址和物理地址的计算方法,要正确使用指令,掌握各类指令的功能、对标志位的影响和使用上的一些特殊限制。
能够编写小汇编程序,初步掌握汇编程序的编写和调试方法。
本章的重点难点内容是: 8086 的指令格式及寻址方式, 8086 的常用指令和8086 指令前缀的使用。
下面我们分别进行总结:一.8086寻址方式(1)操作数是数字,指令中立即写出数字------------立即数寻址MOV AX,1234H 解释此句意义(2)操作数是寄存器内容,指令中写出寄存器的符号---------寄存器寻址MOV AX,BX(3)操作数是存储单元内容,用括号括出存储单元有效地址-----直接寻址MOV AX,[1234H]MOV AX,ES:[1234H](4)操作数是存储单元内容,用括号括出寄存器或其表达式,寄存器或其表达式的值为存储单元有效地址-------------间接寻址MOV AH,[BX]MOV AX,ES:[SI]MOV AL,[BX+SI+5]===5[BX+SI]===5[BX][SI]二.8086指令系统1.数据传送指令(一)通用传送指令(1)MOV指令指令格式:MOV 目,源功能:将源操作数传送给目标操作数。
(2)堆栈操作指令进栈指令:PUSH格式:PUSH 源功能:将源操作数压入堆栈。
例:用堆栈指令完成上例的功能。
MOV AX,3000HMOV DS,AX ;段寄存器填充MOV SI,0100H ;基本指令执MOV DI,2000H ;行前的初值MOV CX,50NT:PUSH [SI] ;程序从这POP [DI] ;开始设计INC SIINC SIINC DIINC DILOOP NTMOV AH,4CHINT 21H(3)交换指令 XCHG格式:XCHG 目,源功能:源和目标中的内容交换。
关于标志位影响
CMP R0,R1 后V=1 ;
总之,两个负数运算结果第31位为0,则V=1
C 当进行加法运算(包括CMN指令),并且最高位产生进位时C=1,否则C=0。当进行减法运算(包括CMP 指令),
并且最高位产生借位时C=0,否则C=1。对于结合移位操作的非加法/减法指令,C为从最高位最后移出的值,
其它指令C通常不变;
例如:执行 mov r0,#0xF0000000
mov r1,#0x7FFFFFFF
subs r3,R0,r1 ,lsr #1
后C=0;
总之,一般情况下加法进位,减法无借位时C=1; 对于结合移位操作的非加/减法指令,C为最后移出的值。
执行 mov r1,#0x70000000
adds r1,r1,r1 或 CMN R1,R1 后V=1;
执行 LDR R0,=0x8000000
也会按照Thumb方式来执行,BX是跳特殊指令,会根据目标寄存器地址来切换T标志。
ቤተ መጻሕፍቲ ባይዱ 两个正数运算结果第31位为1,则V=1。
另外THUMB指令一般不需要S后缀,便能影响状态标志位。
如 在THUMB状态下下面两条指令相同
movs r0,#0x00
mov r0,#0x00
ADDS R0,R0,R0
后C=1;
执行 SUBS R2,R2,R2后C=1,因为R2-R2=0不需要借位。
执行 CMP R3,R3后C=1;
各标志位的含义如下:
所有ARM数据处理指令的乘法指令均可选择使用S后缀,并影响状态标志位。而其它指令一般不允许加S后缀,如B 、LDR、SWI、MRS等。
汇编语言心得体会
汇编语言心得体会【篇一:汇编语言学习心得】汇编学习心得08网工(一)班李锐 0804031002另外,在c语言中不到10个语句构成的程序,用汇编语言却要好几十行甚至上百行。
这不得不让我们对汇编产生一种恐惧感。
事实上,这是完全不必要的。
一旦对它的原理掌握后,编写程序就容易多了。
另外,学习汇编语言能让我们更加了解计算机内部的组织结构,对我们计算机专业的学生来说,学习汇编也是提升综合能力的关键环节。
汇编的学习不仅仅是学习其语法,而更多的是学习计算机基本的体系结构。
其中遇到很多新的概念,名字。
如寄存器、中断、寻址方式等。
这些概念在刚接触汇编这门课的时候难以理解,但在之后的学习中通过老师的讲解,自己亲手编程的方式也就渐渐清晰明了。
我们在学习之前都需要明确什么是汇编语言。
计算机能够直接识别的数据是由二进制数0和1组成的代码。
机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。
为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。
经过一个学期的学习,我也慢慢摸出了汇编学习的规律。
首先,学习这门语言时如果能联系上以前学过的其他高级语言的知识,则会起到良好的效果。
例如c语言程序的运行逻辑结构有顺序(按语句依次执行)、分支结构(if...then...else...),循环结构(for...next)三种结构,也通过c语言了解并掌握了什么是子程序,什么是调用。
事实上,汇编语言中有关程序结构,子程序等等的知识都是跟c语言十分相似的,只是在编程时用到的语言不同:汇编语言完全面向机器,需要指明数据在寄存器、内存中的流向。
第二,学习汇编语言,首要问题是学习80x86指令系统。
如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。
指令系统确定了cpu所能完成的功能,是用汇编语言进行程序设计的最基本部分。
如果不熟悉汇编指令的功能及其有关规定,那肯定不能灵活使用汇编语言。
FLAGS标志寄存器
微机原理整理江苏大学非计算机专业使用,本人私人资料;微机原理97FLAGS标志寄存器:6个状态标志位和3个控制标志CF:进位标志位。
当进行加减法运算时,若最高位向前有进借位CF=1,无CF=0。
PF:奇偶标志位。
当运算结果的低8位中1的个数为偶数时PF=1,为奇数时PF=0。
AF:辅助进位标志。
D3向D4有借进位发生时AF=1,无借进位发生AF=0。
ZF:零位标志。
当运算结果为零时ZF=1,运算结果不为零时ZF=0。
SF:符号标志位。
当运算结果的最高位为1时SF=1,最高位为0时SF=0。
OP:溢出标志位。
当运算结果超出了带符号数的范围,即溢出时OF=1,未溢出时OF=0。
(D7为符号位,说明:D7,D6,D5,D4,D3,D2,D1,D0)3.3.2算数运算指令算数运算指令;加,减,乘,除有符号数的溢出:OF无符号数的溢出:CF指令对操作数的要求:单操作数指令中的操作数不允许使用立即数双操作数指令中,立即数只能作为源操作数,不允许源操作数和目的操作数都是存储器。
1,加法运算指令(不允许段寄存器作为操作数和两个都是存储器)1)ADD普通加法指令(对全部6个状态标志位都会产生影响)ADD OPRD1,OPRD2 ;OPRD1+OPRD2送到OPRD1中去ADD [SI],[BX]是错误的;不允许两个操作数都是存储器操作数例:MOV AL,7EHADD AL,5BH程序执行后,AL=D9H,即11011001B, D9H>7FH(8位带符号数的最大值) OF=1D9H<FFH(8位无符号数的最大值) CF=0 所有状态标志位AF=0,CF=0,OF=1,PF=0,SF=1,ZF=02)ADC带进位(CF)位的加法指令(对全部6个状态标志位都会产生影响)ADC OPRD1,OPRD2 ;OPRD1+OPRD2+CF送到OPRD1中去不允许两个操作数都是存储器操作数例:设CF=1,写出以下指令执行后的结果MOV AL,7EHADC AL,0ABH指令执行后:AL=7EH+0ABH+1=2AH,且CF=13)INC加1指令(不影响CF,影响其它5个状态标志)INC OPRD ;OPRD+1送到OPRD中去OPRD不能是立即数通常用于在循环程序中修改地址指针及循环次数2,减法指令(不允许段寄存器作为操作数和两个都是存储器)1)SUB不考虑借位的减法指令(对全部6个状态标志位都会产生影响)SUB OPRD1,OPRD2不允许两个操作数都是存储器操作数例:SUB AL,[BP+SI] ;将SS:[BP+SI]单元的内容送到AL中去基址变址寻址:基址:BX或BP 变址:SI或DIDS☺[BX][变址]SS ☺[BP][变址]2)SBB考虑借位的减法指令(对全部6个状态标志位都会产生影响)SUB OPRD1,OPRD2 ;将OPRD1-OPRD2-CF送到OPRD1中不允许两个操作数都是存储器操作数3)DEC减1指令(不影响CF,影响其它5个状态标志)DEC OPRDOPRD不能是立即数4)NEG求补指令(对全部6个状态标志位都会产生影响)NEG OPRD (求负数的绝对值);用0-OPRD CF通常为1,除非OPRD为0OF通常为0,除非OPRD为80H(-128)或8000H(-32768),执行后操作数不变,但是OF为1。
指令影响标志位总结
传送类指令---只有SAHF、POPF影响⏹通用数据传送指令(都不影响标志位)❑MOV❑PUSH/POP❑XCHG⏹专用数据传送指令❑标志寄存器操作指令LAHF、SAHF;PUSHF、POPF(LAHF、PUSHF不影响;SAHF、POPF影响)因为SAHF POPF本身就是对标志寄存器做修改的,所以会影响;需要注意的是SAHF LAHF是字节操作,PUSHF POPF是字操作❑查表指令XLAT (不影响标志位)❑地址传送指令近LEA、远LDS (不影响标志位)❑符号扩展指令CBW、CWD (不影响标志位)❑输入/输出指令IN、OUT (不影响标志位)❑串传送类指令MOVSB、MOVSW、MOVS;LODSB、LODSW、LODS;STOSB、STOSW、STOS (不影响标志位,但是受到方向标志位DF的影响)运算类指令---这里面除了标志寄存器的位操作外,其他指令都不影响D、I、T三位⏹逻辑运算AND、OR、XOR、NOT、TEST(可以看到,DIT三位不受影响,O、C两个始终置零,A也不受影响,符号位S、零标志Z和奇偶标志P受影响,不难理解)⏹标志寄存器的位操作(Obviously,都影响)⏹移位,循环移位SAL、SHL、SAR、SHR(同样的,DIT三位不受影响,A也不受影响,其他的均受影响)循环ROL、ROR、RCL、RCR(只有进位标志C和溢出标志O受影响,因为循环移位时用了C)⏹二进制算术运算•加减基本的指令ADD/ADC/SUB/SBB/NEG/CMP/串比较系列CMPSB、CMPSW、CMPS/串扫描系列SCASB、SCASW、SCAS(以上的指令对于除DIT之外都影响)加一减一指令INC、DEC(以上两条指令对除了DIT三位和进位标志C外其他都影响)未组合BCD调整加AAA、减AAS(以上两条指令只影响辅助进位A和进位C,因为在调整过程中要用到这两位)组合BCD调整加DAA、减DAS(可以看到除了DIT三位和溢出位O不受影响)•乘除乘法MUL、IMUL(可以看到只影响溢出O与进位C)除法DIV、IDIV(可以看到都不受影响)BCD码调整AAD、AAM(符号位S、零标志Z、奇偶标志P受影响)转移指令⏹条件转移指令❑根据标志位的转移指令❑无符号数运算后的转移❑带符号数运算后的转移❑根据CX的值转移⏹循环次数控制⏹串操作次数控制前缀⏹无条件转移指令❑调用指令❑返回指令❑中断指令(这里面大部分不改变标志位,但受标志位影响,一般都是上一条是一个运算指令,经过运算标志位被改变了,跳转时就根据这时候的标志位来判断是否需要跳转)处理器控制指令---应该也不影响⏹空操作指令NOP❑格式:NOP❑一条指令耗时3T⏹CPU停等中断HLT❑格式:HLT⏹等待指令WAIT。
标志寄存器解析
标志寄存器CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能不同)具有三种作用:1)用来存储相关指令的某些执行结果;2)用来为CPU执行相关指令提供行为依据;3)用来控制CPU的相关工作方式。
这种特殊的寄存器在8086CPU中,被称为标志寄存器。
8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。
简称flag。
flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0flag的1、3、5、12、13、14、15位在8086CPU中没有使用,不具有任何含义,而其余位都具有特殊的含义。
ZF标志flag的第6位是ZF,零标志位。
它记录相关指令执行后,其结果是否为0。
如果结果为0,那么ZF=1,如果结果不为0,那么ZF=0。
mov ax,1sub ax,1执行后,结果为0,则ZF=1,表示“结果是0”。
mov ax,2sub ax,1执行后,结果不为0,则ZF=0,表示“结果不是0”。
在计算机中0表示逻辑假,表示否定,1表示逻辑真,表示肯定。
注意,在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或自述运算);有的指令的执行对标志寄存器没有影响,比如:mov、push、pop等,它们大都是传送指令。
我们在使用一条指令的时候,要注意这条指令的全部功能,其中包括,执行结果对标记寄存器的哪些标志位造成影响。
PF标志flag的第2位是PF,奇偶标志位。
它记录相关指令执行后,其结果的所有二进制位中1的个数是否为偶数。
如果1的个数为偶数,PF=1,如果为奇数,那么PF=0。
比如:mov al,1add al,10执行后,结果为00001011B,其中有3(奇数)个1,则PF=0。
8086汇编语言学习(九)8086标志寄存器
8086汇编语⾔学习(九)8086标志寄存器8086标志寄存器介绍 前⾯已经介绍了8086⼤多数的寄存器,现在介绍⼀种8086内部⼀个特殊的寄存器,标志寄存器(flag register)。
8086标志寄存器⼤致有以下作⽤: 1.存储⼀些相关指令的执⾏结果 2.为CPU执⾏相关指令提供依据 3.控制CPU的部分⼯作⽅式 8086的寄存器是16位的,通常的寄存器都是存放⼀个16位数据视作⼀个整体进⾏⼯作的。
但标志寄存器较为特殊,标志寄存器中的每⼀bit位是单独⼯作的,虽然理论上16位的标志寄存器能够提供⾄多16个flag标志,但事实上8086CPU的设计者只使⽤了其中的9位,剩余的bit位并没有实际意义。
8086的指令集中,有许多指令的执⾏会同时影响标志寄存器中flag的值。
⽐如add、sub、inc、and等运算指令(逻辑或算术运算),⽽像mov、push、pop等单纯传送数据的指令则不会对标志寄存器产⽣影响。
在使⽤⼀条指令时,出了其本⾝的作⽤外,也要注意指令对标志寄存器的影响。
其中ZF、PF、SF、CF、OF、AF被归类为运算结果标志位,⽽DF、IF、TF则被归类为状态控制标志位。
下⾯对标志寄存器的各位进⾏详细介绍。
ZF(Zero Flag) 零标志位 ZF零标志位,记录相关指令执⾏后,结果是否为0。
通常⼀位bit的布尔变量1表⽰真,0表⽰假。
ZF零标志位在指令执⾏的结果为0时,值为真(ZF=1);不为0时;不为0时,值为假(ZF=0)。
PF(Parity Flag) 奇偶标志位 PF奇偶校验位,记录相关指令执⾏后,结果中bit位中1的个数是否为偶数。
若1的个数为偶数,则PF=1;反之,若1的个数为奇数,则PF=0。
SF(Sign Flag) 符号标志位 SF符号标志位,记录相关指令执⾏后,结果是否为负。
若结果为负,SF=1;若结果为⾮负,SF=0。
CF(Carry Flag) 进位标志位 CF进位标志位,⼀般在⽆符号数运算时,记录最⾼位是否产⽣了进位(例如加法指令),或是否从最⾼位借位(例如减法指令)。
简要说明add、sub、and、or指令对标志位的影响。 -回复
简要说明add、sub、and、or指令对标志位的影响。
-回复标题:add、sub、and、or指令对标志位的影响引言:在计算机中,标志位(也称为标志寄存器)是一组二进制位,用于存储计算机运算过程中的状态信息,它们可以通过不同的指令被修改。
本文将详细介绍四个常用指令,分别是add、sub、and和or指令对标志位的影响。
一、add指令对标志位的影响add指令用于将两个数相加,并将结果存储在目标操作数中。
在执行add 指令时,会根据操作数的数值和结果的情况来修改标志位,影响如下:1.进位标志(CF):如果两个无符号数相加产生了进位,CF被置为1,否则置为0。
2.溢出标志(OF):如果两个带符号数相加产生了溢出,OF被置为1,否则置为0。
3.零标志(ZF):如果两个操作数相加结果为0,ZF被置为1,否则置为0。
4.符号标志(SF):如果结果为负数,SF被置为1,否则置为0。
5.奇偶标志(PF):如果相加结果具有偶数个1,则PF被置为1,否则置为0。
二、sub指令对标志位的影响sub指令用于将第一个操作数减去第二个操作数,并将结果存储在目标操作数中。
执行sub指令时,也会修改标志位,影响如下:1.借位标志(CF):如果执行减法操作时需要借位,CF被置为1,否则置为0。
2.溢出标志(OF):如果执行减法操作产生了溢出,OF被置为1,否则置为0。
3.零标志(ZF):如果结果为0,ZF被置为1,否则置为0。
4.符号标志(SF):如果结果为负数,SF被置为1,否则置为0。
5.奇偶标志(PF):如果结果具有偶数个1,则PF被置为1,否则置为0。
三、and指令对标志位的影响and指令用于执行位与操作,将两个操作数的对应位进行逻辑与运算,并将结果存储在目标操作数中。
执行and指令时,标志位的修改如下:1.零标志(ZF):如果结果为0,ZF被置为1,否则置为0。
2.符号标志(SF):如果结果为负数,SF被置为1,否则置为0。
汇编语言中cmp指令用法笔记与总结
汇编语⾔中cmp指令⽤法笔记与总结本⽂实例讲述了汇编语⾔中cmp指令⽤法。
分享给⼤家供⼤家参考,具体如下:cmp是⽐较指令,cmp的功能是相当于减法指令,只是不保存结果.cmp指令执⾏后,将对标志寄存器产⽣影响.其他相关指令通过识别这些被影响的标志寄存器来得知⽐较结果.cmp指令格式: cmp 操作对象1,操作对象2功能: 计算操作对象1 - 操作对象2 但不保存结果,仅仅根据计算结果对标志寄存器进⾏设置.⽐如cmp ax,ax 是做ax - ax 的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位.指令执⾏后: zf = 1,pf = 1,sf = 0,cf = 0,of = 0;下⾯的指令:mov ax,8mov bx,3mov ax,bx执⾏后: (ax)= 8,zf = 0,pf = 1,sf = 0, cf = 0, of = 0如果 ax = bx 则 ax - bx = 0 ,所以 : zf = 1如果 ax != bx 则ax - bx != 0,所以 : zf = 0如果ax < bx 则ax - bx 将产⽣错位,所以 : cf = 1如果 ax >= bx 则 ax - bx 将不必借位,所以 : cf = 0如果ax > bx 则 ax - bx 既不必借位,结果⼜不为0, 所以 : cf = 0 并且 zf = 0如果 ax <= bx 则ax - bx 既可能借位,结果可能为0,所以 : cf = 1 或 zf =1检测⽐较结果的条件转移指令je 等于则转移 zf=1jne 不等于则转移 zf=0jb 低于则转移 cf=1jnb 不低于则转移 cf=0ja ⾼于则转移 cf=0且zf=0jna 不⾼于则转移 cf=1或zf=1e : equalne : not equalb: belownb : not belowa : abovena : not above编程: 统计data段中数值⼩于8的字节的个数,⽤ax保存统计结果mov ax,datamov ds,axmov ax,0 ;初始化累加器mov bx,0 ;ds:bx指向第⼀个字节mov cx,8s : cmp byte ptr [bx] , 8 ;和8进⾏⽐较jnb next ;如果不⼩于8转到next,继续循环inc ax ;如果⼩于8就将计数值加1next:inc bxloop s程序执⾏后: ax = 2还有疑问的可以去查看⼀下指令⼿册,讲解的⽐较细致希望本⽂所述对⼤家汇编语⾔程序设计有所帮助。
汇编语言各种指令的解释与用法
【】一、通用数据传送指令1、传送指令MOV (move)指令的汇编格式:MOV DST,SRC指令的基本功能:(DST)<-(SRC) 将原操作数(字节或字)传送到目的地址。
指令支持的寻址方式:目的操作数和源操作数不能同时用存储器寻址方式,这个限制适用于所有指令。
指令的执行对标志位的影响:不影响标志位。
指令的特殊要求:目的操作数DST和源操作数SRC不允许同时为段寄存器;目的操作数DST不能是CS,也不能用立即数方式。
2、进栈指令PUSH (push onto the stack)出栈指令 POP (pop from the stack)指令的汇编格式:PUSH SRC ;POP DST指令的基本功能:PUSH指令在程序中常用来暂存某些数据,而POP指令又可将这些数据恢复。
PUSH SRC (SP)<-(SP)-2 ;(SP)<-(SRC)POP DST (DST)<-((SP));(SP)<-(SP)指令支持的寻址方式:push 和 pop指令不能不能使用立即数寻址方式。
指令对标志位的影响:PUSH 和 POP指令都不影响标志位。
指令的特殊要求:PUSH 和 POP指令只能是字操作,因此,存取字数据后,SP的修改必须是+2 或者 -2; POP指令的DST不允许是CS寄存器;3、交换指令XCHG (exchange)指令的汇编格式:XCHG OPR1,OPR2指令的基本功能:(OPR1)<->(OPR2)指令支持的寻址方式:一个操作数必须在寄存器中,另一个操作数可以在寄存器或存储器中。
指令对标志位的影戏:不影响标志位。
指令的特殊要求:不允许使用段寄存器。
二、累加器专用传送指令4、输入指令IN (input)输出指令 OUT (output)指令的汇编格式:IN ac,port port<=0FFHIN ac,DX port>0FFHOUT port,ac port<=0FFHOUT DX,ac port>0FFH指令的基本功能:对8086及其后继机型的微处理机,所有I/O端口与CPU之间的通信都由输入输出指令IN和OUT来完成。
微机原理总结2
第三章剩余的一些指令说明:还剩下十进制调整指令、符号拓展指令、逻辑运算和移位指令、循环逻辑移位指令、控制转移指令、循环控制指令、过程调用与返回指令、中断指令、串操作指令,其中,红色着重号标出的是重点需要掌握的,其余的由于用的不是很多,了解一下即可。
十进制调整指令:(这两个指令只对AF,CF寄存器有明显的影响,其余的结果不定)在具体讲解该系列的指令前,得先说一下这个“十进制调整指令”是干吗用的。
首先我们知道计算机使用二进制或是“简化后的二进制——十六进制”来表示数据的,但人们却是习惯用十进制来表示数的,如果计算机能够把数据用十进制的方式显示出来,则人们看待数据就会更加直观,于是用来表示十进制数的各种BCD码就诞生了,这里我们主要用的是8421BCD码,即每四位BCD码用来表示一个十进制的位,例如十进制数28,用8421码来表示就是:0010 1000,即十六进制表示:28H,念作二八H所以这个指令就是把运算后的结果,即用十六进制表示的数转化为人们可以看懂的十进制的样子来表示,下面就开始讲解这一系列的指令:1:AAA指令(英文全称是:Adjust ASCII ADD,由英文全称可知这个调整指令主要是用来调整加法运算结果的)功能:功能的介绍看书本111面,但有一点必须要注意,就是这个指令通常用于ADD指令之后,且操作数隐藏(操作数默认是AL与AH)。
另外:书上对这个指令没有讲解的很详细,我在某个晚上看了半个小时的这个指令,一直到快睡着后才发现,这个指令是这样的:首先务必要弄清楚,在AX中存储的值是简化为十六进制数的未组合的BCD码(英文全称是:Binary Convert dec……十进制的英文我忘了,反正字面的意思就是把二进制转化为十进制)来表示的(关于什么是组合的BCD 码什么又是未组合的BCD码,我会在下面粘贴一段百度里面的知识),例如执行AAA指令前得到AX=010AH,得认为AX表示的是十进制数20(把AX分开来看,AH=01,它是未组合的BCD码,表示的就是1;然后AL=0AH,它也是未组合的BCD码,表示的就是10,两个组合在一起就是十进制数20!这个例子不大好理解,就只能这样记了,例如两个未组合BCD码数是010EH,那同上可得其表示的数我们可以看作是十进制数24,如果举个比较好理解的例子,例如两个未组合BCD码数是0109H,则表示的数是十进制数19,不过这个数就不需要用AAA指令来调整了,因为我们一看就知道它就是十进制数19,所以AAA指令就是把像010AH、010EH这样看起来非常不爽的BCD 码数转化为看起来顺眼的未组合的BCD码数,例如上面中的010AH 与010EH经过AAA指令转化后分别变为:0200H与0204H,这样如果告诉我们这两个数是未组合的BCD码,则我们可以很容易地知道它们分别表示的就是用未组合的BCD码以十六进制数表示的可视为十进制数的20与24:有一点要注意,0200H与十进制数的20不想等,同理0204H与十进制数的24不相等,BCD码主要是方便人看的方便,实际的值是不一样的)最后总结一下,这个AAA指令就是把AX储存的两个满足某些条件的未组合的BCD码数(某些条件就是:AL中的数的低四位的值小于0AH 或是AF=1:也就是辅助标志寄存位)转化为我们更容易识别的未组合的BCD码数,它的具体步骤就是:首先判断是否满足条件,如果满足,则首先让AL中的数加上06H,接着让AL中的高四位清零,然后让AH中的数加1,最后AF=CF=1以下是来自百度的相关补充的知识:什么是未组合的BCD码,什么是组合BCD码计算机中的BCD码,经常使用的有两种格式,即分离BCD码(也就是未组合的BCD码),组合BCD码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CF(Carry Flag):进位标志。
当指令执行的结果(8位或16位)在最高位上产生了一个进位或借位时,CF =1。
AF(Auxiliary Carry Flag):辅助进位标志。
当一个8位数(或16位数)的低四位向高四位(即
b3向b4)有进位或借位时,AF=1。
常用于十进制算术运算指令。
OF(Overflow Flag): 溢出标志。
在算术运算中,带符号数的运算结果超出了8位或16位符号数所能表示的范围时,OF=1。
ZF(Zero Flag): 零标志。
当运算结果为全零时,ZF=1。
SF(Sign Flag): 符号标志。
当运算结果为正数,即结果的最高位为0时,SF=1。
PF(Parity Flag):奇偶标志。
当算术逻辑运算的结果中1的个数为偶数时,PF=1,为奇数时,PF=0。
DF(Direction Flag):方向标志。
用于控制数据串操作指令的步进方向,当DF=1时,表示从高地址向低地址以递减的顺序对数据串中的数据进行处理。
IF(Interrupt-enable Flag):中断允许标志。
当IF=1时,CPU可以响应外部可屏蔽中断请求。
该标志可以用指令设置为1或0。
TF(Trap Flag):陷阱标志。
当TF=1时,CPU进入单步工作方式,每执行完一条指令就自动产生一个内部中断,以便进行程序调试。
当TF=0时,正常执行程序。