文章目录
数据表示
数据(Data):计算机处理的对象
对应指令操作的对象:操作数(Oprand)
计算机中的数据要用二进制的0和1组合表示,进入计算机的任何信息都要转换成0和1数码
IA-32整数指令支持的基本数据类型、8、16、32、64位无符号整数和有符号整、ASCII字符、字符串和BCD码
数制
计算机使用二进制进行数据处理,十六进制数便于表达二进制数
二进制数用后缀字母B,十六进制数用后缀字母H
- 二进制
便于计算机存储及物理实现
特点:逢二进一,由0和1两个数码组成,基数为2,各个位权以2k表示
二进制数的算术运算:逢2进1、借1当2
- 逻辑运算
事件的假和真可用数码0和1表示,事件之间的关系可以利用二进制表达
数字电路的低高电平用数码0和1表示,数字信号之间的关系可以利用二进制描述
数码0和1仅仅代表两种状态
它们的运算是逻辑运算 - 十六进制
用于表达二进制数,相互转换简单
基数16,逢16进位,位权为16k
16个数码:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
十六进制数的加减:逢16进位1,借1当16 - 数制间的转换
· 十进制小数转换为二或十六进制数
小数部分转换:用乘法
分别乘以各自的基数,记录整数部分,直到小数部分为0为止
0.8125=0.1101B
0.8125=0.DH
小数转换会发生总是无法乘到为0的情况
可选取一定位数(精度)
将产生无法避免的转换误差
· 二进制和十六进制数的相互转换
二进制和十六进制数之间具有对应关系
以小数点为基准
整数从左向右,小数从右向左
每4个二进制位对应一个十六进制位
数制的编码
编码:用文字、符号或者数码来表示某种信息(数值、语言、操作指令、状态等)的过程
二进制编码:组合0和1数码
机器数:计算机中用0和1数码组合表达的数值
真值:现实中真实的数值
数值的两种编码方式:定点格式(第3章)+ 浮点格式(第9章)
- 定点整数
定点格式:固定小数点的位置表达数值
定点整数:小数点固定在机器数的最右侧
定点小数:小数点固定在机器数的最左侧
无符号整数(无符号数)
· 只表达0和正整数的定点整数
· N位无符号整数表达范围:0~2N-1
有符号整数(有符号数、带符号数)
· 表达负整数、0和正整数的定点整数
· 最高位表达数值正负
· 符号位用0表示正数、1表示负数
- 补码
有符号整数在计算机中默认采用补码
最高位表示符号:正数用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)成为原码
· 再取反其他位得到反码
· 最后加1就是补码
真值:32,机器数:00100000B=20H
真值:-32,机器数:
[-32]原码=10100000B=A0H
[-32]反码=11011111B=DFH
[20H]补码=11100000B=E0H
字符的编码
在计算机中,各种字符需要用若干位的二进制码的组合表示,即字符的二进制编码
由于字节为计算机的基本存储单位,所以常以8个二进制位为单位表达字符
- 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码便于输入输出,表达数值准确 - 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,表达制表符号 - Unicode(统一码)
8位ASCII码表达英文字符
16位国标码表达汉字字符
· 汉字机内码:国标码在计算机中使用的编码
国际信息交换码Unicode
· 16位编码
· 对世界上所有语言的大多数字符进行编码
· 提供扩展能力
· Unicode兼容ASCII
Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论是什么语言
常量表示
常数
· 十、十六和二进制形式表达的数值
· 以后缀字母区分,十进制数可以不加
· 以字母A~F开头的十六进制常数,要加前导0
字符和字符串
· 英文缩略号括起来的单个字符或多个字符
· 数值是每个字符对应的ASCII码值
符号常量
· 使用标识符表达一个数值
· 符号定义伪指令:等价EQU,等号=
数值表达式
· 用运算符连接各种常量构成的算式
· 算术运算符:+(加) -(减) *(乘) /(除)
变量应用
变量(Variable)
· 程序运行中随之发生变化的结果
· 保存在可读可写的主存空间
实质是主存单元的数据,因而可以改变
变量需要事先定义才能使用
变量具有属性方便应用
变量表达主存数据,即存储器操作数
变量定义
申请存储空间,还可以进行存储单元初始化
变量名 变量定义伪指令 初值表
变量名是用户标识符,表示首元素逻辑地址
变量定义伪指令有
· BYTE、WORD、DWORD、FWORD、QWORD、TBYTE
初值表是用逗号分隔的参数
· 各种形式的常量
· “?”表示初值不确定,即未赋初值
· 复制操作符DUP
重复次数 DUP(重复参数)
- 变量定义伪指令
- 字节量数据
BYTE定义8位、字节量变量数据
· 可以表达
· 无符号整数0~255
· 补码表示的有符号整数:-128~+127
· 一个字符(ASCII码值)
· 压缩BCD码:0~99
· 非压缩BCD码:0~9
字符串定义使用字节变量定义BYTE - 字量数据
WORD定义16位、字量变量数据
可以表达
· 16位无符号和有符号整数
· 16位段选择器,16位偏移地址
16位数据包含高低两个字节,占用2个连续的字节存储单元
小端方式(Little Endian)
· 低字节数据存放在低地址存储单元
· 高字节数据存放在高地址存储单元 - 双字量数据
DWORD定义32位、双字量变量数据
可以表达
· 32位无符号和有符号整数
· 32位偏移地址、线性地址或段基地址
32位数据包含4个字节,以“高对高、低对低”原则占用4个连续字节空间
- 变量定位
变量定义的存储空间,按照书写的先后顺序一个接着一个分配
“ORG 参数”控制存放的偏移地址
org 100h ;从偏移地址100H处安排
指令代码也由汇编程序,按照语句的书写顺序安排存储空间
定位伪指令也可以用于控制代码的偏移地址
变量属性
变量定义
· 分配存储空间
· 赋初值
· 创建变量名
变量名具有两类属性:
⑴地址属性:首个变量所在存储单元的逻辑地址,含有段基地址和偏移地址
⑵类型属性:变量定义的数据单位
字节量BYTE 字量WORD 双字量DWORD
3字量FWORD 4字量QWORD 10字节量TBYTE
- 地址操作符
地址操作符用于获取变量名的地址属性
- 类型操作符
类型操作符使用变量名的类型属性
数据传送类指令
数据传送
· 把数据从一个位置传送到另一个位置
· 计算机中最基本的操作
· 程序设计中最常使用的指令
除标志寄存器传送指令外,均不影响标志位
通用数据传送指令
提供方便灵活的通用传送操作
主要有传送MOV和交换XCHG指令
- 传送指令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
数据传送类指令不影响(=不改变)状态标志,加法和减法指令根据结果按定义改变状态标志
- 加法指令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
- 带进位加法指令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
- 增量指令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标志外,其他按定义影响全部状态标志位
数据传送类指令不影响(=不改变)状态标志,加法和减法指令根据结果按定义改变状态标志
- 减法指令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
- 带借位减法指令SBB
· 目的操作数减去源操作数,再减CF,结果送目的操作数
· 按照定义影响6个状态标志位
SBB dest,src ;dest←dest-src-CF
· 用于与SUB指令相结合实现多精度数的减法
先将两个操作数的低32位相减(用SUB指令),然后减高位部分、并减去借位(用SBB指令) - 减量指令DEC
· 对操作数减1(减量)再将结果返回原处
DEC reg/mem ;减1:reg/mem←reg/mem-1
· 用于计数器和地址指针的调整
· 不影响进位CF标志,影响其他状态标志位
例如
dec ecx
dec esi
dec wvar
dec dvar[ebx+edi]
- 求补指令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
- 比较指令CMP
· 将目的操作数减去源操作数
· 差值不回送目的操作数
· 按照减法结果影响状态标志
CMP dest,src ;做减法运算:dest-src
根据标志状态获知两个操作数的大小关系
给条件转移等指令使用其形成的状态标志
乘除法指令
算术运算类指令还有:乘法除法指令、零位扩展和符号扩展指令、十进制调整指令
- 乘法指令
· 无符号数乘法指令 MUL
· 有符号数乘法指令 IMUL
· 计算二进制数乘法:A5H×64H
用MUL指令作无符号数乘法:
4074H(=16500)=A5H(=165)×64H(=100)
用IMUL指令作无符号数乘法:
DC74H(=-9100)=A5H(=-91)×64H(=100)
加减指令只进行无符号数运算,利用CF和OF区别无符号数和有符号数
- 除法指令
· 无符号除法指令DIV和有符号除法指令IDIV
· 除法指令可能产生除法溢出
对DIV指令,除数为0,或者在字节除时商超过8位,在字除时商超过16位,或者双字除时超过32位,则发生除法溢出
对IDIV指令,除数为0,或者在字节除时商不在-128~127范围内,在字除时商不在-32768~32767范围内,或者在双字除时商不在-231~231-1范围内,则发生除法溢出
· 除法错溢出,将产生编号为0的内部中断
- 零位扩展和符号扩展指令
· 零位扩展对应无符号数:MOVZX指令
前面加0实现位数扩展
80H:8位无符号数,零位扩展为16位:0080H
· 符号扩展对应有符号数:MOVSX指令
前面加符号位(最高位)实现位数扩展
64H:8位有符号数,符号扩展成16位:0064H
FF00H:16位有符号数据,符号扩展成32位:FFFFFF00H,都表达真值:-256
真值-1,字节量补码:FFH,字量补码:FFFFH,双字量补码:FFFFFFFFH
位数加长,大小没变
- 十进制调整指令
· 算术运算指令实现二进制数的加减乘除
· 十进制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
- 逻辑运算的屏蔽作用
- 测试指令TEST
按位进行逻辑与运算,不返回逻辑与结果
TEST dest,src ;作逻辑与运算:dest src
TEST指令像AND指令一样来设置状态标志
TEST指令常用于检测一些条件是否满足,一般后跟条件转移指令,目的是利用测试条件转向不同的分支
移位指令
逻辑左移指令 SHL
逻辑右移指令 SHR
算术左移指令 SAL
算术左移指令 SAR
不带进位循环左移指令 ROL
不带进位循环右移指令 ROR
带进位循环左移指令 RCL
带进位循环右移指令 RCR
- 移位指令
· 分逻辑(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
- 循环移位指令
· 循环(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位指令,具有虚拟机管理指令