第三章 数据处理

数据表示

数据(Data):计算机处理的对象
对应指令操作的对象:操作数(Oprand)
计算机中的数据要用二进制的0和1组合表示,进入计算机的任何信息都要转换成0和1数码
IA-32整数指令支持的基本数据类型、8、16、32、64位无符号整数和有符号整、ASCII字符、字符串和BCD码

数制

计算机使用二进制进行数据处理,十六进制数便于表达二进制数
二进制数用后缀字母B,十六进制数用后缀字母H

  1. 二进制
    便于计算机存储及物理实现
    特点:逢二进一,由0和1两个数码组成,基数为2,各个位权以2k表示
    二进制数的算术运算:逢2进1、借1当2
    在这里插入图片描述
  2. 逻辑运算
    事件的假和真可用数码0和1表示,事件之间的关系可以利用二进制表达
    数字电路的低高电平用数码0和1表示,数字信号之间的关系可以利用二进制描述
    数码0和1仅仅代表两种状态
    它们的运算是逻辑运算
  3. 十六进制
    用于表达二进制数,相互转换简单
    基数16,逢16进位,位权为16k
    16个数码:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
    十六进制数的加减:逢16进位1,借1当16
  4. 数制间的转换
    在这里插入图片描述
    · 十进制小数转换为二或十六进制数
    小数部分转换:用乘法
    分别乘以各自的基数,记录整数部分,直到小数部分为0为止
    0.8125=0.1101B
    0.8125=0.DH
    小数转换会发生总是无法乘到为0的情况
    可选取一定位数(精度)
    将产生无法避免的转换误差
    · 二进制和十六进制数的相互转换
    二进制和十六进制数之间具有对应关系
    以小数点为基准
    整数从左向右,小数从右向左
    每4个二进制位对应一个十六进制位

数制的编码

编码:用文字、符号或者数码来表示某种信息(数值、语言、操作指令、状态等)的过程
二进制编码:组合0和1数码
机器数:计算机中用0和1数码组合表达的数值
真值:现实中真实的数值
数值的两种编码方式:定点格式(第3章)+ 浮点格式(第9章)

  1. 定点整数
    定点格式:固定小数点的位置表达数值
    定点整数:小数点固定在机器数的最右侧
    定点小数:小数点固定在机器数的最左侧
    无符号整数(无符号数)
    · 只表达0和正整数的定点整数
    · N位无符号整数表达范围:0~2N-1
    有符号整数(有符号数、带符号数)
    · 表达负整数、0和正整数的定点整数
    · 最高位表达数值正负
    · 符号位用0表示正数、1表示负数
    在这里插入图片描述
  2. 补码
    有符号整数在计算机中默认采用补码
    最高位表示符号:正数用0,负数用1
    正数补码:直接表示数值大小(同无符号数)
    负数补码:将对应正数补码取反加1
    [105]补码=01101001B
    [-105]补码=[01101001B]取反+1=10010110B+1=10010111B
    8位二进制补码的数值范围:-128~+127
    16位二进制补码的数值范围:-215~+215-1
    32位二进制补码的数值范围:-231~+231-1
    N位二进制补码的数值范围:-2N-1~+2N-1-1
    负数求补
    负数真值“取反加1”得机器数补码
    负数补码“取反加1”得到负数真值
    补码:11100000B
    真值:-([11100000]求反+1)=-(00011111+1)
    =-00100000=-25=-32
    负数求补运算,等效于用带借位的0作减法
    真值:-8,补码:[-8]补码=00H-08H=F8H
    补码:11111000,真值:-(00H-F8H)=-08H=-8
  0 =	00000000
-(8 =	00001000)
- 8 =	11111000
  1. 补码运算
    利用无符号数加法结合补码表达,实现:无符号数加法、无符号数减法、有符号数加法、有符号数减法
    无符号数加减运算,需要利用进位或借位
    有符号数加减运算,注意避免出现溢出
    在这里插入图片描述
  2. 原码和反码
    正数的原码、反码和无符号数一样
    求负数的原码、反码和补码
    · 首先计算其对应正数的编码
    · 然后取反符号位(设置为1)成为原码
    · 再取反其他位得到反码
    · 最后加1就是补码
    真值:32,机器数:00100000B=20H
    真值:-32,机器数:
    [-32]原码=10100000B=A0H
    [-32]反码=11011111B=DFH
    [20H]补码=11100000B=E0H

字符的编码

在计算机中,各种字符需要用若干位的二进制码的组合表示,即字符的二进制编码
由于字节为计算机的基本存储单位,所以常以8个二进制位为单位表达字符

  1. BCD
    二进制编码的十进制数,一个十进制数位用4位二进制编码来表示
    8421 BCD码:低10个4位二进制编码表示0~9
    压缩BCD码:一个字节表达两位BCD码
    非压缩BCD码:一个字节表达一位BCD码(低4位表达数值,高4位常设置为0)
    BCD码很直观
    BCD码:0100 1001 0111 1000.0001 0100 1001
    十进制真值: 4978.149
    BCD码便于输入输出,表达数值准确
  2. ASCII(美国标准信息交换码)
    · 标准ASCII码用7位二进制编码,有128个
    · 不可显示的控制字符:前32个和最后一个
    回车CR:0DH 换行LF:0AH 响铃BEL:07H
    · 可显示和打印的字符:20H后的94个编码
    数码0~9:30H~39H
    大写字母A~Z:41H~5AH
    小写字母a~z:61H~7AH
    空格:20H
    · 扩展ASCII码:最高D7位为1,表达制表符号
  3. Unicode(统一码)
    8位ASCII码表达英文字符
    16位国标码表达汉字字符
    · 汉字机内码:国标码在计算机中使用的编码
    国际信息交换码Unicode
    · 16位编码
    · 对世界上所有语言的大多数字符进行编码
    · 提供扩展能力
    · Unicode兼容ASCII
    Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论是什么语言

常量表示

常数
· 十、十六和二进制形式表达的数值
· 以后缀字母区分,十进制数可以不加
· 以字母A~F开头的十六进制常数,要加前导0
字符和字符串
· 英文缩略号括起来的单个字符或多个字符
· 数值是每个字符对应的ASCII码值
符号常量
· 使用标识符表达一个数值
· 符号定义伪指令:等价EQU,等号=
数值表达式
· 用运算符连接各种常量构成的算式
· 算术运算符:+(加) -(减) *(乘) /(除)

变量应用

变量(Variable)
· 程序运行中随之发生变化的结果
· 保存在可读可写的主存空间
实质是主存单元的数据,因而可以改变
变量需要事先定义才能使用
变量具有属性方便应用
变量表达主存数据,即存储器操作数

变量定义

申请存储空间,还可以进行存储单元初始化
变量名 变量定义伪指令 初值表
变量名是用户标识符,表示首元素逻辑地址
变量定义伪指令有
· BYTE、WORD、DWORD、FWORD、QWORD、TBYTE
初值表是用逗号分隔的参数
· 各种形式的常量
· “?”表示初值不确定,即未赋初值
· 复制操作符DUP
重复次数 DUP(重复参数)

  1. 变量定义伪指令
    在这里插入图片描述
  2. 字节量数据
    BYTE定义8位、字节量变量数据
    · 可以表达
    · 无符号整数0~255
    · 补码表示的有符号整数:-128~+127
    · 一个字符(ASCII码值)
    · 压缩BCD码:0~99
    · 非压缩BCD码:0~9
    字符串定义使用字节变量定义BYTE
  3. 字量数据
    WORD定义16位、字量变量数据
    可以表达
    · 16位无符号和有符号整数
    · 16位段选择器,16位偏移地址
    16位数据包含高低两个字节,占用2个连续的字节存储单元
    小端方式(Little Endian)
    · 低字节数据存放在低地址存储单元
    · 高字节数据存放在高地址存储单元
  4. 双字量数据
    DWORD定义32位、双字量变量数据
    可以表达
    · 32位无符号和有符号整数
    · 32位偏移地址、线性地址或段基地址
    32位数据包含4个字节,以“高对高、低对低”原则占用4个连续字节空间
    在这里插入图片描述
    在这里插入图片描述
  5. 变量定位
    变量定义的存储空间,按照书写的先后顺序一个接着一个分配
    “ORG 参数”控制存放的偏移地址
    org 100h ;从偏移地址100H处安排
    指令代码也由汇编程序,按照语句的书写顺序安排存储空间
    定位伪指令也可以用于控制代码的偏移地址

变量属性

变量定义
· 分配存储空间
· 赋初值
· 创建变量名
变量名具有两类属性:
⑴地址属性:首个变量所在存储单元的逻辑地址,含有段基地址和偏移地址
⑵类型属性:变量定义的数据单位
字节量BYTE 字量WORD 双字量DWORD
3字量FWORD 4字量QWORD 10字节量TBYTE

  1. 地址操作符
    地址操作符用于获取变量名的地址属性
    在这里插入图片描述
  2. 类型操作符
    类型操作符使用变量名的类型属性
    在这里插入图片描述

数据传送类指令

数据传送
· 把数据从一个位置传送到另一个位置
· 计算机中最基本的操作
· 程序设计中最常使用的指令
除标志寄存器传送指令外,均不影响标志位

通用数据传送指令

提供方便灵活的通用传送操作
主要有传送MOV和交换XCHG指令

  1. 传送指令MOV
    把一个字节、字或双字的操作数从源位置传送至目的位置
    双操作数必须类型一致

MOV AL,050AH ; 错误:类型不一致; 050AH超过了寄存器AL范围
mov eax,050ah; 正确:双字量数据传送

操作数必须有明确的类型

MOV [EBX],255 ; 错误:无明确类型
mov byte ptr [ebx],255 ; 正确:BYTE PTR说明是字节操作
mov word ptr [ebx],255 ; 正确:WORD PTR说明是字操作
mov dword ptr [ebx],255 ; 正确:DWORD PTR说明是双字操作

双操作数不允许都是存储单元

; 假设dbuf1和dbuf2是两个双字变量
MOV DBUF2,DBUF1 ; 错误:两个操作数都是存储单元
mov eax,dbuf1 ; 正确:EAX=DBUF1(将DBUF1内容送EAX)
mov dbuf2,eax ; 正确:DBUF2=EAX(将EAX内容送DBUF2)

操作专用寄存器的指令有限
在这里插入图片描述

  • 交换指令XCHG
    · 将源操作数和目的操作数内容交换
    通用寄存器与通用寄存器之间
    通用寄存器或存储器之间
    · 空操作指令NOP:XCHG EAX,EAX
    处理器执行空操作该指令,需要化费时间,在主存中也要占用一个字节空间
    实现短时间延时
    临时占用代码空间

堆栈操作指令

· “先进后出FILO”存取的存储区域,只有一个数据出入口,即当前栈顶(不断变化)
· 两种基本操作
数据压进堆栈PUSH
数据弹出堆栈操作POP
· SS指向堆栈段的起始位置
· ESP指定栈顶
数据进入堆栈,ESP逐渐减小
数据依次弹出、ESP逐渐增大
在这里插入图片描述

  • 进栈指令PUSH
    push src
    ① ESP=ESP-4(2) ② SS:[ESP]=src
    · 先将ESP减小作为当前栈顶
    · 后将源操作数(立即数、通用寄存器和段寄存器内容或存储器操作数)传送到当前栈顶
    · 以字或双字为单位操作
    进栈双字量数据时,ESP减4
    进栈字量数据时,ESP减2
    在这里插入图片描述
  • 出栈指令POP
    pop dest
    ① dest=SS:[ESP] ② ESP=ESP+4(2)
    · 先将栈顶数据传送到目的操作数(通用寄存器、存储单元或段寄存器)
    · 后ESP增加作为当前栈顶
    · 以字或双字为单位操作
    出栈双字量数据时,ESP加4
    出栈字量数据时,ESP加2
    在这里插入图片描述
  • 堆栈的应用
    · 堆栈不可或缺,被很多指令使用
    堆栈操作指令
    子程序调用CALL和返回RET,中断调用INT和返回IRET等
    内部异常、外部中断等也利用堆栈
    · 堆栈可用来临时存放数据,以便随时恢复它们
    · 常利用堆栈基址指针EBP,随机读写堆栈数据
    mov ebp,esp ; EBP=ESP
    mov eax,[ebp+8] ; EAX←SS:[EBP+8]
    mov [ebp],eax ; SS:[EBP]←EAX
    · 利用堆栈实现主、子程序间传递参数
    · 堆栈还常用于子程序的寄存器保护和恢复
    · 注意入栈和出栈的数据要成对,要保持堆栈平衡

其他传送指令

· 针对特定需要设计的专用传送指令
换码指令
标志传送指令
地址传送指令

  • 换码指令
    · XLAT指令功能:AL←[EBX+AL]
    将(E)BX指定的缓冲区中,AL指定的位移处的一个字节数据,取出赋给AL
    · 换码指令执行前:
    在主存建立一个字节量表格,内含要目的代码,表格首地址存放于EBX,AL存放相对表格首地址的位移量
    · 换码指令执行后:
    将AL寄存器的内容转换为目标代码
  • 标志传送指令
    直接操作标志寄存器
    标志位操作指令:直接改变CF、DF、IF标志
    在这里插入图片描述
  • 地址传送指令
    · 地址传送指令获取存储器操作数的地址
    LEA r16/r32,mem ;r16/r32←mem的有效地址EA(不需类型一致)
    · LEA指令类似的地址操作符OFFSET的作用
    LEA指令在指令执行时计算出偏移地址
    OFFSET操作符在汇编阶段取得变量的偏移地址
    OFFSET无需在执行时计算、指令执行速度更快
    LEA指令能获取汇编阶段无法确定的偏移地址

算术运算类指令

算术运算
对数据进行加减乘除,基本的数据处理方法。加减运算有“和”或“差”的结果外,还有进借位、溢出等状态标志,也是结果的一部分

状态指令

最基本的标志,有6个
用来记录指令执行结果的辅助信息
加减运算和逻辑运算指令是主要设置它们
其他有些指令的执行也会相应地设置它们
处理器主要使用其中5个构成各种条件,分支指令判断这些条件实现程序分支
在这里插入图片描述

  • 进位标志CF(Carry Flag)
    · 当加减运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0
    · 针对无符号整数,判断加减结果是否超出表达范围
    N个二进制位表达无符号整数的范围:0~2N-1
    8位:0~+255
    16位:0~+65535
    32位:0~+232-1
  • 溢出标志OF(Overflow Flag)
    · 有符号数加减结果有溢出,则OF=1;否则OF=0
    · 针对有符号整数,判断加减结果是否超出表达范围
    N个二进制位表达有符号整数的范围:-2N-1~2N-1-1
    8位:-128~+127
    16位:-32768~+32767
    32位:-231~+231-1
    • 进位和溢出的区别
      · 进位标志反映无符号整数运算结果是否超出范围
      有进位,加上进位或借位后运算结果仍然正确
      · 溢出标志反映有符号整数运算结果是否超出范围
      有溢出,运算结果已经不正确
      · 处理器按照无符号整数求得结果
      设置进位标志CF;设置溢出标志OF
      · 程序员决定
      操作数是无符号数,关心进位;操作数是有符号数,注意溢出

    • 溢出标志的判断
      · 处理器硬件判断规则
      最高位和次高位同时有进位或同时无进位,无溢出;最高位和次高位进位状态不同,有溢出
      · 人工判断的简单规则
      只有当两个相同符号数相加(含两个不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,不会产生溢出
      在这里插入图片描述

  • 零标志ZF(Zero Flag)
    运算结果为0,则ZF=1,否则ZF=0
  • 符号标志SF(Sign Flag)
    运算结果最高位为1,则SF=1;否则SF=0
    最高位=符号位=SF
  • 奇偶标志PF(Parity Flag)
    当运算结果最低字节(仅最低8位“1”的个数)中“1”的个数为零或偶数时,PF=1;否则PF=0

加法指令

· 加法指令 ADD
· 带进位加法指令 ADC
· 增量指令 INC
除INC不影响进位标志CF外,其他指令按定义影响全部状态标志位,按照运算结果相应设置各个状态标志为0或为1
数据传送类指令不影响(=不改变)状态标志,加法和减法指令根据结果按定义改变状态标志

  1. 加法指令ADD
    · 目的操作数加上源操作数,和送到目的操作数
    ADD dest,src ;加法:dest←dest+src
    寄存器与立即数、寄存器、存储单元的加法,存储单元与立即数、寄存器的加法
    · 按照定义影响6个状态标志位

mov eax,0aaff7348h ;EAX=AAFF7348H add al,27h
;EAX=AAFF736FH,OF=0,SF=0,ZF=0,PF=1,CF=0 add ax,3fffh
;EAX=AAFFB36EH,OF=1,SF=1,ZF=0,PF=0,CF=0 add eax,88000000h
;EAX=32FFB36EH,OF=1,SF=0,ZF=0,PF=0,CF=1

  1. 带进位加法指令ADC
    · 两个操作数相加,再加CF,结果送目的操作数
    · 按照定义影响6个状态标志位
    ADC dest,src ;dest←dest+src+CF
    · 用于与ADD指令相结合实现多精度数的加法
    先将两个操作数的低32位相加(用ADD指令)
    再加高位部分、并将进位加到高位(用ADC指令)

〔例3-11〕
64位数据相加程序 mov eax,dword ptr qvar1 ;取低32位 add eax,dword ptr
qvar2 ;加低32位,设置CF mov edx,dword ptr qvar1+4 ;取高32位 adc edx,dword ptr
qvar2+4 ;加高32位,同时加CF

  1. 增量指令INC
    只有一个操作数:寄存器或存储单元
    对操作数加1(增量)再将结果返回原处
    INC reg/mem ;加1:reg/mem←reg/mem+1
    用于计数器和地址指针的调整
    不影响进位CF标志,影响其他状态标志位

例如
inc ecx
inc esi
inc wvar
inc dvar[ebx+edi]

减法指令

· 减法指令 SUB
· 带借位减法指令 SBB
· 减量指令 DEC
· 求补指令 NEG
· 比较指令 CMP
除DEC不影响CF标志外,其他按定义影响全部状态标志位
数据传送类指令不影响(=不改变)状态标志,加法和减法指令根据结果按定义改变状态标志

  1. 减法指令SUB
    · 目的操作数减去源操作数,差送到目的操作数
    SUB dest,src ;减法:dest←dest-src
    寄存器与立即数、寄存器、存储单元的减法,存储单元与立即数、寄存器的减法
    · 按照定义影响6个状态标志位

mov eax,0aaff7348h ;EAX=AAFF7348H
sub al,27h ;EAX=AAFF7321H,OF=0,SF=0,ZF=0,PF=1,CF=0
sub ax,3fffh ;EAX=AAFF3322H,OF=0,SF=0,ZF=0,PF=1,CF=0
sub eax,0bb000000h ;EAX=EFFF3322H,OF=0,SF=1,ZF=0,PF=1,CF=1

  1. 带借位减法指令SBB
    · 目的操作数减去源操作数,再减CF,结果送目的操作数
    · 按照定义影响6个状态标志位
    SBB dest,src ;dest←dest-src-CF
    · 用于与SUB指令相结合实现多精度数的减法
    先将两个操作数的低32位相减(用SUB指令),然后减高位部分、并减去借位(用SBB指令)
  2. 减量指令DEC
    · 对操作数减1(减量)再将结果返回原处
    DEC reg/mem ;减1:reg/mem←reg/mem-1
    · 用于计数器和地址指针的调整
    · 不影响进位CF标志,影响其他状态标志位

例如
dec ecx
dec esi
dec wvar
dec dvar[ebx+edi]

  1. 求补指令NEG
    · 对操作数执行求补运算,即用零减去操作数
    NEG reg/mem ;reg/mem←0-reg/mem
    · 对标志的影响与用零作减法的SUB指令一样
    · 可用于求补码或由补码求其绝对值

mov ax,0ff64h
neg al ;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1,CF=1
sub al,9dh ;AX=FFFFH,OF=0,SF=1,ZF=0,PF=1,CF=1
neg ax ;AX=0001H,OF=0,SF=0,ZF=0,PF=0,CF=1
dec al ;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=1
neg ax ;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=0

  1. 比较指令CMP
    · 将目的操作数减去源操作数
    · 差值不回送目的操作数
    · 按照减法结果影响状态标志
    CMP dest,src ;做减法运算:dest-src
    根据标志状态获知两个操作数的大小关系
    给条件转移等指令使用其形成的状态标志

乘除法指令

算术运算类指令还有:乘法除法指令、零位扩展和符号扩展指令、十进制调整指令

  1. 乘法指令
    · 无符号数乘法指令 MUL
    · 有符号数乘法指令 IMUL
    · 计算二进制数乘法:A5H×64H
    用MUL指令作无符号数乘法:
    4074H(=16500)=A5H(=165)×64H(=100)
    用IMUL指令作无符号数乘法:
    DC74H(=-9100)=A5H(=-91)×64H(=100)
    加减指令只进行无符号数运算,利用CF和OF区别无符号数和有符号数
    在这里插入图片描述
  2. 除法指令
    · 无符号除法指令DIV和有符号除法指令IDIV
    · 除法指令可能产生除法溢出
    对DIV指令,除数为0,或者在字节除时商超过8位,在字除时商超过16位,或者双字除时超过32位,则发生除法溢出
    对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,在字除时商不在-32768~32767范围内,或者在双字除时商不在-231~231-1范围内,则发生除法溢出
    · 除法错溢出,将产生编号为0的内部中断
    在这里插入图片描述
  3. 零位扩展和符号扩展指令
    · 零位扩展对应无符号数:MOVZX指令
    前面加0实现位数扩展
    80H:8位无符号数,零位扩展为16位:0080H
    · 符号扩展对应有符号数:MOVSX指令
    前面加符号位(最高位)实现位数扩展
    64H:8位有符号数,符号扩展成16位:0064H
    FF00H:16位有符号数据,符号扩展成32位:FFFFFF00H,都表达真值:-256
    真值-1,字节量补码:FFH,字量补码:FFFFH,双字量补码:FFFFFFFFH
    位数加长,大小没变
    在这里插入图片描述
  4. 十进制调整指令
    · 算术运算指令实现二进制数的加减乘除
    · 十进制BCD码运算:对二进制运算结果调整
    · 压缩BCD码:4个二进制位表示一个十进制位
    一个字节表示两个十进制位:00~99
    压缩BCD码调整指令:加法DAA和减法DAS
    · 非压缩BCD码:8个二进制位表示一个十进制位
    一个字节表示一个十进制位0~9
    ASCII码可以认为是非压缩BCD码
    非压缩BCD码调整指令:
    加法AAA、减法AAS、乘法AAM和除法AAD

位操作类指令

· 计算机中最基本的数据单位是二进制位
· 针对二进制位进行操作、实现位控制的指令
逻辑运算指令
移位指令
……
· 进行一位或若干位处理,采用位操作类指令

逻辑运算指令

· 逻辑与指令 AND
· 逻辑或指令 OR
· 逻辑非指令 NOT
· 逻辑异或指令 XOR
· 测试指令 TEST
除NOT指令不影响标志外,其他逻辑指令,使OF=CF=0,根据结果按定义影响ZF、SF和PF

  • 逻辑与指令AND
    逻辑与(逻辑乘)运算规则:两位都是逻辑1,则结果是1;否则,结果是0
    逻辑与指令AND:按位进行逻辑与,结果返回目的操作数
    AND dest,src ;逻辑与:dest←dest∩src
    设置CF=OF=0,影响SF,ZF和PF
    在这里插入图片描述
  • 逻辑或指令OR
    逻辑或(逻辑加)运算规则:两位都是逻辑0,则结果是0;否则,结果是1
    逻辑或指令OR:按位进行逻辑或,结果返回目的操作数
    OR dest,src ;逻辑或:dest←dest∪src
    设置CF=OF=0,影响SF,ZF和PF
    在这里插入图片描述
  • 逻辑非指令NOT
    逻辑非(逻辑反)运算规则:原来为0的位变成1,原来为1的位变成0
    逻辑非指令NOT:按位进行逻辑非,结果返回操作数
    NOT reg/mem ;逻辑非:reg/mem←~reg/mem
    不影响状态标志位
    在这里插入图片描述
  • 逻辑异或指令XOR
    逻辑异或(逻辑半加)运算规则:两位不同(相异),则结果是1;否则,结果是0
    逻辑异或指令XOR:按位进行逻辑异或,结果返回目的操作数
    XOR dest,src ;逻辑或:dest←dest 异或 src
    设置CF=OF=0影响SF,ZF和PF
    在这里插入图片描述
    • 逻辑运算的屏蔽作用
      AND指令复位某些位(同0与),不影响其他(同1与)
      OR指令置位某些位(同1或),不影响其他(同0或)
      XOR求反某些位(同1异或),不影响其他(同0异或)
      大写=小写 AND DFH
      小写=大写 OR 20H
  1. 测试指令TEST
    按位进行逻辑与运算,不返回逻辑与结果
    TEST dest,src ;作逻辑与运算:dest  src
    TEST指令像AND指令一样来设置状态标志
    TEST指令常用于检测一些条件是否满足,一般后跟条件转移指令,目的是利用测试条件转向不同的分支

移位指令

逻辑左移指令 SHL
逻辑右移指令 SHR
算术左移指令 SAL
算术左移指令 SAR

不带进位循环左移指令 ROL
不带进位循环右移指令 ROR
带进位循环左移指令 RCL
带进位循环右移指令 RCR
在这里插入图片描述

  1. 移位指令
    · 分逻辑(Logical)和算术(Arithmetic)移位
    · 具有左移(Left)或右移(Right)操作

SHL reg/mem,i8/CL ;逻辑左移:最低位补0,最高位进入CF
SHR reg/mem,i8/CL ;逻辑右移:最高位补0,最低位进入 CF
SAL reg/mem,i8/CL ;算术左移,与SHL是同一条指令
SAR reg/mem,i8/CL ;算术右移:最高位不变,最低位进入CF

· 目的操作数:寄存器或存储单元reg/mem
· 后一个操作数:移位位数i8/CL
在这里插入图片描述
SHL逻辑左移一位相当于无符号数乘以2, SHR逻辑右移一位相当于无符号数除以2

  1. 循环移位指令
    · 循环(Rotate)移位指令要将从一端移出的位返回到另一端形成循环
    · 分成不带进位循环移位和带进位循环移位
    · 分别具有左移或右移操作

ROL reg/mem,i8/CL ;不带进位循环左移指令
ROR reg/mem,i8/CL ;不带进位循环右移指令
RCL reg/mem,i8/CL ;带进位循环左移指令
RCR reg/mem,i8/CL ;带进位循环右移指令

不带进位的循环移位指令
在这里插入图片描述
带进位的循环移位指令
在这里插入图片描述

串操作类指令

· 数据串(数组):以字节、字和双字为单位的多个数据存放在连续的主存区域中
· 源操作数:允许段超越:DS:[ESI]
· 目的操作数:不允许段超越:ES:[EDI]
· 每执行一次串操作:ESI和EDI自动±1/2/4
以字节为单位(用B结尾)操作:地址指针±1
以字为单位(用W结尾)操作:地址指针±2
以双字为单位(用D结尾)操作:地址指针±4
DF=0(执行CLD指令):地址指针增加(+)
DF=1(执行STD指令):地址指针减小(-)

串传送指令

MOVSB|MOVSW|MOVSD
;串传送:ES:[EDI]←DS:[ESI]
;然后:ESI←ESI±1/2/4,EDI←EDI±1/2/4
STOSB|STOSW|STOSD
;串存储:ES:[EDI]←AL/AX/EAX
;然后:EDI←EDI±1/2/4
LODSB|LODSW|LODSD
;串读取:AL/AX/EAX←DS:[ESI]
;然后:ESI←ESI±1/2/4
REP
;执行一次串指令,ECX减1;直到ECX=0

串检测指令

CMPSB|CMPSW|CMPSD
;串比较:DS:[ESI]-ES:[EDI]
;然后:ESI←ESI±1/2/4,EDI←EDI±1/2/4
SCASB|SCASW|SCASD
;串扫描:AL/AX/EAX-ES:[EDI]
;然后:EDI←EDI±1/2/4
REPE|REPZ
;执行一次串指令,ECX减1;直到ECX=0或ZF=0
REPNE|REPNZ
;执行一次串指令,ECX减1;直到ECX=0或ZF=1

IA-32指令系统

指令系统(指令集):
处理器支持的所有指令的集合
通用指令属于处理器的基本指令
在这里插入图片描述

  • Intel 80x86指令系统的发展
    8086(80186)建立16位基本指令
    80286增加保护方式指令
    80386扩展为32位指令系统,新增许多位操作指令
    80486新增6条指令,开始直接支持浮点处理指令
    Pentium新增6条指令,如处理器识别指令CPUID
    Pentium Pro增加3条指令,如条件传送指令CMOV
    Pemtium II/III/4逐渐增加多媒体指令:MMX、SSE/SSE2/SSE3/SSSE3指令
    Intel 64处理器提供64位指令,具有虚拟机管理指令
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值