tceic.com
学霸学习网 这下你爽了
当前位置:首页 >> 其它课程 >>

32位汇编语言03_图文

第3章 通用数据处理指令
3.1 数据传送类指令 3.2 算术运算类指令 3.3 位操作类指令

第3章 通用数据处理指令
熟悉IA-32处理器通用的基本指令: 数据传送指令、算术运算指令 逻辑运算和移位操作指令 ? 掌握指令功能和编程应用
?

学习指令的注意事项

? 指令的功能——该指令能够实现何种操作。通

常指令助记符就是指令功能的英文单词或其缩 写形式 ? 指令支持的寻址方式——该指令中的操作数可 以采用何种寻址方式 ? 指令对标志的影响——该指令执行后是否对各 个标志位有影响,以及如何影响 ? 其他方面——该指令其他需要特别注意的地方, 如指令执行时的约定设置、必须预置的参数、 隐含使用的寄存器等
3

第3章 通用数据处理指令

3.1 数据传送类指令

? 数据传送
?

?
?

把数据从一个位置传送到另一个位置 计算机中最基本的操作 程序设计中最常使用的指令

? 除标志寄存器传送指令外,均不影响标志位
全面而准确地理解每条指令的功能和应用 是编写汇编语言程序的关键 也是理解处理器如何进行数据处理的核心
4

第3章 通用数据处理指令

3.1.1 通用数据传送指令

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

30H

目的操作数 dest
被传送的数据

30H
5

源操作数 src
第3章 通用数据处理指令

1. 传送指令MOV

? 把一个字节、字或双字的操作数从源位置传送
至目的位置
并非任意传送 ! MOV MOV MOV MOV
6

段寄存器

reg/mem,imm reg/mem/seg,reg reg/seg,mem reg/mem,seg

无法翻译就出错 !
第3章 通用数据处理指令

注意1:双操作数必须类型一致

MOV ESI,DL ;错误:类型不一致 ;ESI为32位寄存器,DL为8位寄存器 mov esi,edx ;正确:两个32位寄存器传送 MOV AL,050AH ;错误:类型不一致 ;050AH超过了寄存器AL范围 mov eax,050ah ;正确:双字量数据传送
7

第3章 通用数据处理指令

注意2:操作数必须有明确的类型

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

8

第3章 通用数据处理指令

注意3:双操作数不允许都是主存单元

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

9

第3章 通用数据处理指令

注意4:不可随意操作专用寄存器

MOV DS,@DATA ;错误:立即数不能直接传送段寄存器 (@DATA是数据段地址) mov ax,@data ;正确:通过AX间接传送给DS mov ds,ax

10

第3章 通用数据处理指令

2. 交换指令XCHG

? 将源操作数和目的操作数内容交换
XCHG reg,reg/mem XCHG reg/mem,reg
? ?

通用寄存器与通用寄存器之间 通用寄存器或存储器之间

xchg esi,edi xchg esi,[edi] xchg al,var

? 空操作指令NOP(=
? ? ?
11

XCHG EAX,EAX)

处理器执行空操作该指令,需要化费时间,在主 存中也要占用一个字节空间 实现短时间延时 临时占用代码空间
第3章 通用数据处理指令

3.1.2 堆栈操作指令

? “先进后出FILO”存取的存储区域,只有一个
数据出入口,即当前栈顶(不断变化) ? 两种基本操作
? ?

数据压进堆栈PUSH 数据弹出堆栈操作POP

? SS指向堆栈段的起始位置 ? ESP指定栈顶
? ?

Word Word Word Word Word

5 4 3 2 1

Stack PUSH

数据进入堆栈,ESP逐渐减小 数据依次弹出、ESP逐渐增大

POP

示意图
12

第3章 通用数据处理指令

1. 进栈指令PUSH
PUSH r16/m16/i16/seg ① ESP=ESP-2 ② SS:[ESP]=r16/m16/i16/seg PUSH r32/m32/i32 ① ESP=ESP-4 ② SS:[ESP]=r32/m32/i32 ? 先将ESP减小作为当前栈顶 ? 后将源操作数(立即数、通用寄存器和段寄存器内容 或存储器操作数)传送到当前栈顶 ? 以字或双字为单位操作 push eax ? 进栈双字量数据时,ESP减4 ? 进栈字量数据时,ESP减2
示意图
14

第3章 通用数据处理指令

2. 出栈指令POP
POP r16/m16/seg ① r16/m16/seg=SS:[ESP] ② ESP=ESP+2 POP r32/m32 ① r32/m32=SS:[ESP] ② ESP=ESP+4 ? 先将栈顶数据传送到目的操作数(通用寄存器、存 储单元或段寄存器) ? 后ESP增加作为当前栈顶 pop eax ? 以字或双字为单位操作 ? 出栈双字量数据时,ESP加4 ? 出栈字量数据时,ESP加2
示意图
16

第3章 通用数据处理指令

〔例3-1〕堆栈操作程序
ten dvar ;数据段 = 10 dword 67762000h,12345678h ;代码段 mov eax,dvar+4 ;EAX=12345678H push eax ;将EAX内容压入堆栈 push dword ptr ten ;将立即数以双字量压入堆栈 push dvar ;变量DVAR第一个数据入堆 pop eax ;栈顶数据弹出到EAX pop dvar+4 ;栈顶数据弹出到DVAR+4 mov ebx,dvar+4 ;EBX=000000AH pop ecx ;栈顶数据弹出到ECX
第3章 通用数据处理指令

18

3. 堆栈的应用

? 堆栈不可或缺,被很多指令使用:
?

?

?

堆栈操作指令 子程序调用 CALL 和返回 RET ,中断调用 INT 和返回 IRET等 内部异常、外部中断等也利用堆栈

? 堆栈可用来临时存放数据,以便随时恢复它们 ? 常利用堆栈基址指针EBP,随机读写堆栈数据 ? 利用堆栈实现主、子程序间传递参数 ? 堆栈还常用于子程序的寄存器保护和恢复 ? 注意入栈和出栈的数据要成对,保持堆栈平衡
19

第3章 通用数据处理指令

3.1.3 其他传送指令

? 针对特定需要设计的专用传送指令
?

?
? ?

地址传送指令 换码指令 标志传送指令 ??

PUSHAD POPAD PUSHFD POPFD ?? LEA LDS LES ?? XLAT CLC STC CMC ??
20

第3章 通用数据处理指令

1. 地址传送指令

? 地址传送指令获取存储器操作数的地址
LEA r16/r32,mem
;r16/r32←mem的有效地址EA(不需类型一致)

? LEA指令类似的地址操作符OFFSET的作用
? ? ? ?

LEA指令在指令执行时计算出偏移地址 OFFSET操作符在汇编阶段取得变量的偏移地址 OFFSET无需在执行时计算、指令执行速度更快 LEA指令能获取汇编阶段无法确定的偏移地址
lea esi, var mov edi, offset var

21

第3章 通用数据处理指令

〔例3-2〕地址传送程序
dvar ;数据段 dword 41424344h ;代码段 mov eax,dvar ;EAX=41424344H lea esi,dvar ;ESI指向DVAR mov ebx,[esi] ;EBX=41424344H mov edi,offset dvar ;EDI指向DVAR mov ecx,[edi] ;ECX=41424344H lea edx,[esi+edi*4+100h] ;EDX=ESI+EDI×4+100H
第3章 通用数据处理指令

22

2. 换码指令

? XLAT指令功能:AL←[EBX+AL]
?

?
?

将EBX指定的缓冲区中 AL指定的位移处的一个字节数据 取出赋给AL

xlat

? 换码指令执行前:
? ?

?

在主存建立一个字节量表格,内含要目的代码 表格首地址存放于EBX AL存放相对表格首地址的位移量

? 换码指令执行后:
?
23

将AL寄存器的内容转换为目标代码
第3章 通用数据处理指令

〔例3-3〕换码显示程序-1
num tab ;数据段 byte 6,7,7,8,3,0,0,0 byte '0123456789' ;代码段 mov ecx,lengthof num mov esi,offset num mov ebx,offset tab mov al,[esi] xlat call dispc add esi,1 loop again
使用XLAT指令

;被转换数字 ;代码表

again:

;EBX指向代码表 ;AL=要转换的数字 ;换码 ;显示 ;指向下一个数字 ;循环
第3章 通用数据处理指令

24

〔例3-3〕换码显示程序-2
不使用XLAT指令 ;代码段 mov ecx,lengthof num mov esi,offset num mov ebx,offset tab ;EBX指向代码表 mov eax,0 ;EAX=0 mov al,[esi] ;AL=要转换的数字 add eax,ebx ;EAX=EAX+EBX,指向对应的字符 mov al,[eax] ;换码 call dispc ;显示 add esi,1 ;指向下一个数字 loop again ;循环
第3章 通用数据处理指令

again:

25

〔例3-3〕换码显示程序-3
;代码段 mov ecx,lengthof num mov esi,offset num mov eax,0 ;EAX=0 mov al,[esi] ;AL=要转换的数字 mov al,tab[eax] ;换码 call dispc ;显示 add esi,1 ;指向下一个数字 loop again ;循环 67783000
寄存器相对寻址

again:

运行结果
26

第3章 通用数据处理指令

3. 标志传送指令

? 直接操作标志寄存器 ? 标志位操作指令:直接改变CF、DF、IF标志
指令 CLC STC CMC CLD STD CLI STI
27

功能 复位进位标志:CF←0 置位进位标志:CF←1 求反进位标志:原为0变为1,原为1变为0 复位方向标志:DF←0,串操作后地址增大 置位方向标志:DF←1,串操作后地址减小 复位中断标志:IF←0,禁止可屏蔽中断 置位中断标志:IF←1,允许可屏蔽中断
第3章 通用数据处理指令

3.2 算术运算类指令

? 算术运算
?

?
?

对数据进行加减乘除 基本的数据处理方法 加减运算有“和”或“差”的结果外,还有进借 位、溢出等状态标志,也是结果的一部分 掌握:加法和减法指令 熟悉:乘法和除法指令 理解:零位扩展和符号扩展

? 注意算术运算类指令对标志的影响
?

?
?

28

第3章 通用数据处理指令

3.2.1 状态标志

? 状态标志是处理器最基本的标志 ? 一方面:作为加减运算和逻辑运算的辅助结果 ? 另一方面:构成各种条件,实现程序分支
15 12 11 10 9 8 7 6 5 4 3 2 1 0

OF DF IF TF SF ZF

0

AF

0

PF

1

CF

8086的标志

29

第3章 通用数据处理指令

进位标志CF(Carry Flag)

? 当加减运算结果的最高有效位有进位(加法)
或借位(减法)时,进位标志置1,即CF=1; 否则CF=0 ? 针对无符号整数,判断加减结果是否超出表达 范围
?

?
? ?
30

N个二进制位表达无符号整数的范围: 0~2N-1 8位:0~+255 16位:0~+65535 32位:0~+232-1
第3章 通用数据处理指令

进位标志CF:举例

? 8位二进制数相加:
00111010+01111100=10110110

? 十六进制表达:3A+7C=B6 ? 转换成十进制数:58+124=182 ? 没有产生进位:CF=0 ? 8位二进制数相加:

0<182<255

10101010+01111100=[1]00100110

? 十六进制表达:AA+7C=[1]26 ? 转换成十进制数:170+124=294=256+38 ? 产生进位:CF=1 进位1表达256
31

第3章 通用数据处理指令

溢出标志OF(Overflow Flag)

? 有符号数加减结果有溢出,则OF=1;否则OF
=0 ? 针对有符号整数,判断加减结果是否超出表达 范围
?

?

?
?

N个二进制位(补码)表达有符号整数的范围: -2N-1~2N-1-1 8位:-128~+127 16位:-32768~+32767 32位:-231~+231-1

32

第3章 通用数据处理指令

溢出标志OF:举例

? 8位二进制数相加:
00111010+01111100=10110110

? 十六进制表达:3A+7C=B6 ? 转换成十进制数:58+124=182 ? 超出范围:OF=1 ? 8位二进制数相加:

182>127

10101010+01111100=[1]00100110

? 十六进制表达:AA+7C=[1]26 ? 转换成十进制数:-86+124=38 ? 没有超出范围:OF=0 补码AAH表达-86
33

第3章 通用数据处理指令

进位和溢出的区别

? 进位标志反映无符号整数运算结果是否超出范围
有进位,加上进位或借位后运算结果仍然正确 ? 溢出标志反映有符号整数运算结果是否超出范围 ? 有溢出,运算结果已经不正确 ? 处理器按照无符号整数求得结果 ? 设置进位标志CF ? 设置溢出标志OF ? 程序员决定 ? 操作数是无符号数,关心进位 ? 操作数是有符号数,注意溢出
?
34

第3章 通用数据处理指令

溢出标志的判断

? 处理器硬件判断规则
?

最高位和次高位同时有进位或同时无进位,无溢 出;最高位和次高位进位状态不同,有溢出

? 人工判断的简单规则
?

只有当两个相同符号数相加(含两个不同符号数 相减),而运算结果的符号与原数据符号相反时, 产生溢出;其他情况下,不会产生溢出
正数 正数 负数 最高位

00111010 +01111100 10110110

次高位
第3章 通用数据处理指令

35

零标志ZF(Zero Flag)

? 运算结果为0,则ZF=1,否则ZF=0
结果是0, ZF标志不是0 !
举例

? 8位二进制数相加:
00111010+01111100=10110110
结果不是0,ZF=0 ? 8位二进制数相加:

10000100+01111100=[1]00000000
结果是0,ZF=1
36

进位

结果
第3章 通用数据处理指令

符号标志SF(Sign Flag)

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

最高位=符号位= SF

? 8位二进制数相加:
00111010+01111100=10110110
最高位=1:SF=1 ? 8位二进制数相加:

10000100+01111100=[1]00000000
最高位=0:SF=0
37

进位

结果
第3章 通用数据处理指令

奇偶标志PF(Parity Flag)

? 当运算结果最低字节中“1”的个数为零或偶
数时,PF=1;否则PF=0
举例

仅最低8位“1”的个 数

? 8位二进制数相加:
00111010+01111100=10110110
“1”的个数为5个:PF=0 ? 8位二进制数相加:

10000100+01111100=[1]00000000
“1”的个数为0个:PF=1
38

进位

结果
第3章 通用数据处理指令

3.2.2 加法指令

? 加法指令 ADD ? 带进位加法指令 ? 增量指令 INC
?

ADC

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

第3章 通用数据处理指令

1. 加法指令ADD

? 目的操作数加上源操作数,和送到目的操作数
ADD reg,imm/reg/mem ;reg←reg+imm/reg/mem ADD mem,imm/reg ;mem←mem+imm/reg ? 按照定义影响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
40

第3章 通用数据处理指令

2. 带进位加法指令ADC

? 两个操作数相加,再加CF,结果送目的操作数
ADC reg,imm/reg/mem ;reg←reg+imm/reg/mem+CF ADC mem,imm/reg ;mem←mem+imm/reg+CF ? 用于与ADD指令相结合实现多精度数的加法

?

先将两个操作数的低32位相加(用ADD指令) ? 再加高位部分、并将进位加到高位(用ADC指令) 〔例3-4〕64位数据相加程序
?

mov add mov adc
41

eax,dword eax,dword edx,dword edx,dword

ptr ptr ptr ptr

qvar1 qvar2 qvar1+4 qvar2+4

;取低32位 ;加低32位,设置CF ;取高32位 ;加高32位,同时加CF
第3章 通用数据处理指令

3. 增量指令INC

? 只有一个操作数:寄存器或存储单元 ? 对操作数加1(增量)再将结果返回原处
INC reg/mem ;加1:reg/mem←reg/mem+1

? 用于计数器和地址指针的调整 ? 不影响进位CF标志,影响其他状态标志位 ? 例如
inc ecx inc dword ptr [ebx] inc wvar
42

第3章 通用数据处理指令

3.2.3 减法指令

? 减法指令 SUB ? 带借位减法指令 ? 减量指令 DEC ? 求补指令 NEG ? 比较指令 CMP
? ?

SBB

除DEC不影响CF标志外 其他按定义影响全部状态标志位 数据传送类指令不影响(=不改变)状态标志 加法和减法指令根据结果按定义改变状态标志

43

第3章 通用数据处理指令

1. 减法指令SUB

? 目的操作数减去源操作数,差送到目的操作数
SUB reg,imm/reg/mem ;reg←reg-imm/reg/mem SUB mem,imm/reg ;mem←mem-imm/reg ? 按照定义影响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
44

第3章 通用数据处理指令

2. 带借位减法指令SBB

? 目的操作数减去源操作数,再减 CF ,结果送目的操
作数 SBB reg,imm/reg/mem ;reg←reg-imm/reg/mem-CF SBB mem,imm/reg ;mem←mem-imm/reg-CF ? 用于与SUB指令相结合实现多精度数的减法 ? 先将两个操作数的低32位相减(用SUB指令) ? 然后减高位部分、并减去借位(用SBB指令)

45

第3章 通用数据处理指令

3. 减量指令DEC

? 只有一个操作数:寄存器或存储单元 ? 对操作数减1(减量)再将结果返回原处
DEC reg/mem ;减1:reg/mem←reg/mem-1 ? 用于计数器和地址指针的调整 ? 不影响进位CF标志,影响其他状态标志位 ? 例如
dec cx dec byte ptr [ebx] dec wvar
46

第3章 通用数据处理指令

〔例3-5〕大小写字母转换程序
msg ;数据段 大写=小写-20H byte 'welcome',0 小写=大写+20H ;代码段 mov ecx,(lengthof msg)-1 ;ECX等于字符串长度 mov ebx,0 ;EBX=0指向头一个字母 sub msg[ebx],'a'-'A' ;小写字母减20H转换为大写 inc ebx ;指向下一个字母 loop again ;循环
第3章 通用数据处理指令

again:

47

4. 求补指令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
48

第3章 通用数据处理指令

5. 比较指令CMP
数,按照减法结果影响状态标志

SUB与CMP?

? 将目的操作数减去源操作数,差值不回送目的操作
SUB reg,imm/reg/mem ;reg-imm/reg/mem SUB mem,imm/reg ;mem-imm/reg ? 根据标志状态获知两个操作数的大小关系 ? 给条件转移等指令使用其形成的状态标志
ADD与ADC? ADD与SUB?
49

SUB与SBB? ADC与SBB?

INC与DEC? DEC与NEG?
第3章 通用数据处理指令

3.2.4 乘法和除法指令

? IA-32处理器的乘法和除法指令比较特殊 ? 针对无符号数和有符号数有各自的指令
?

有符号数指令前用I(sIgned)表示

? 隐含使用EAX(和EDX)寄存器
加减指令只进行无符号数运算 利用CF和OF区别无符号数和有符号数

50

第3章 通用数据处理指令

1. 乘法指令

? 无符号数乘法指令 MUL ? 有符号数乘法指令 IMUL ? 计算二进制数乘法:A5H×64H
用MUL指令作无符号数乘法: 4074H(=16500)=A5H(=165)×64H(=100) ? 用IMUL指令作带符号数乘法: DC74H(=-9100)=A5H(=-91)×64H(=100)
?

51

第3章 通用数据处理指令

乘法指令
指令类型 无符号数乘法 MUL src 有符号数乘法 IMUL src 操作数组合及功能 举例

mul bl AX=AL×r8/m8 DX.AX=AX×r16/m16 imul bx EDX.EAX=EAX×r32/m32 mul dvar
imul eax,10 imul ebx,ecx imul ax,bx,-2
imul eax,dword ptr [esi+8],5

双操作数乘法 r16=r16×r16/m16/i8/i16 IMUL dest,src r32=r32×r32/m32/i8/i32 三操作数乘法
IMUL dest,src,imm

r16=r16/m16×i8/i16 r32=r32/m32×i8/i32

imul eax,dword ptr [esi+8],5
52

第3章 通用数据处理指令

2. 除法指令

? 无符号除法指令 DIV ? 有符号除法指令 IDIV ? 除法指令可能产生除法溢出
?

?

对DIV指令,除数为0,或者在字节除时商超过8位, 在字除时商超过 16 位,或者双字除时超过 32 位, 则发生除法溢出 对IDIV指令,除数为0,或者在字节除时商不在- 128 ~ 127 范 围 内 , 在 字 除 时 商 不 在 - 32768 ~ 32767范围内,或者在双字除时商不在-231~231- 1范围内,则发生除法溢出
第3章 通用数据处理指令

? 除法错溢出,将产生编号为0的内部中断
53

除法指令
指令
无符号除法:

操作数组合及功能
AL←AX÷r8/m8的商 AH←AX÷r8/m8的余数 AX←DX.AX÷r16/m16的商 DX←DX.AX÷r16/m16的余数 EAX←EDX.EAX÷r32/m32的商 EDX←EDX.EAX÷r32/m32的余数

举例
div bl idiv bx div ebx

DIV src
有符号除法: IDIV src

54

第3章 通用数据处理指令

3.2.5 其他运算指令

? 算术运算类指令还有
?

?
?

零位扩展和符号扩展指令 十进制调整指令 ??

MOVZX MOVSX CBW CWD CWDE CDQ DAA DAS AAA AAS AAM AAD ??
55

第3章 通用数据处理指令

1. 零位扩展和符号扩展指令

? 零位扩展对应无符号数:MOVZX指令
?

?

前面加0实现位数扩展 80H:8位无符号数,零位扩展为16位:0080H

? 符号扩展对应有符号数:MOVSX指令
? ? ?

?

前面加符号位(最高位)实现位数扩展 64H:8位有符号数,符号扩展成16位:0064H FF00H : 16 位 有 符 号 数 据 , 符 号 扩 展 成 32 位 : FFFFFF00H,都表达真值:-256 真值 -1 ,字节量补码: FFH ,字量补码: FFFFH , 双字量补码:FFFFFFFFH 位数加长,大小没变
第3章 通用数据处理指令

56

零位扩展和符号扩展指令

指令类型

指令 MOVZX r16,r8/m8

举例

movzx di,bvar 零位扩展 MOVZX r32,r8/m8/r16/m16 movzx eax,ax

movsx ax,al 符号扩展 MOVSX r32,r8/m8/r16/m16 movsx edx,bx

MOVSX r16,r8/m8

57

第3章 通用数据处理指令

〔例3-6〕温度转换程序 F=(9/5)×C+32 ;数据段
tempc tempf word 26 word ? ;代码段 movsx eax,tempc imul eax,9 cdq mov ebx,5 idiv ebx add eax,32 mov tempf,ax ;假设一个摄氏温度C ;保存华氏温度F ;16位有符号数符号扩展 ;EAX=C×9 ;EAX符号扩展为EDX和EAX ;EAX=C×9/5 ;EAX=F=C×9/5+32 ;取16位结果
第3章 通用数据处理指令

58

2. 十进制调整指令

? 算术运算指令实现二进制数的加减乘除 ? 十进制BCD码运算:对二进制运算结果调整 ? 压缩BCD码:4个二进制位表示一个十进制位
? ?

? 非压缩BCD码:8个二进制位表示一个十进制位
一个字节表示一个十进制位0~9 ? ASCII码可以认为是非压缩BCD码 ? 非压缩BCD码调整指令: 加法AAA、减法AAS、乘法AAM和除法AAD
?
59

一个字节表示两个十进制位:00~99 压缩BCD码调整指令:加法DAA和减法DAS

第3章 通用数据处理指令

3.3 位操作类指令

? 计算机中最基本的数据单位是二进制位 ? 针对二进制位进行操作、实现位控制的指令
? ? ? ?

逻辑运算指令 移位指令 循环移位指令 ??

? 进行一位或若干位处理,采用位操作类指令

60

第3章 通用数据处理指令

3.3.1 逻辑运算指令

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

第3章 通用数据处理指令

1. 逻辑与指令AND

? 逻辑与(逻辑乘)运算规则:
两位都是逻辑1,则结果是1;否则,结果是0 ? 逻辑与指令AND: ? 按位进行逻辑与,结果返回目的操作数 AND reg,imm/reg/mem ;reg←reg ? imm/reg/mem AND mem,imm/reg ;mem←mem ? imm/reg A B T ? 设置CF=OF=0 与门电路 ? 影响SF,ZF和PF 0 0 0 A
?

?
62

01000101 00110001 00000001

真值表

0 1 0 1 0 0 1 1 1

B

T

逻辑表达式

T=A·B
第3章 通用数据处理指令

2. 逻辑或指令OR

? 逻辑或(逻辑加)运算规则:
两位都是逻辑0,则结果是0;否则,结果是1 ? 逻辑或指令OR: ? 按位进行逻辑或,结果返回目的操作数 OR reg,imm/reg/mem ;reg←reg ? imm/reg/mem OR mem,imm/reg ;mem←mem ? imm/reg ? 设置CF=OF=0 A B T 或门电路 ? 影响SF,ZF和PF 0 0 0 A
?

?
63

01000101 00110001 01110101

真值表

0 1 1 1 0 1 1 1 1

B

T

逻辑表达式

T=A+B
第3章 通用数据处理指令

3. 逻辑非指令NOT

? 逻辑非(逻辑反)运算规则:
?

原来为0的位变成1,原来为1的位变成0

? 逻辑非指令NOT:
按位进行逻辑非,结果返回操作数 NOT reg/mem ;reg/mem←~reg/mem
?

? 不影响状态标志位
~ 01000101 10111010
64

非门电路

真值表

A T 0 1 1 0

A

T 逻辑表达式

T=A
第3章 通用数据处理指令

4. 逻辑异或指令XOR

? 逻辑异或(逻辑半加)运算规则:
两位不同(相异),则结果是1;否则,结果是0 ? 逻辑异或指令XOR: ? 按位进行逻辑异或,结果返回目的操作数 AND reg,imm/reg/mem ;reg←reg ? imm/reg/mem AND mem,imm/reg ;mem←mem ? imm/reg ? 设置CF=OF=0 A B T 异或门电路 ? 影响SF,ZF和PF 0 0 0 A
?

01000101 ? 00110001 01110100
65

真值表

0 1 1 1 0 1 1 1 0

B

T

逻辑表达式

T=A?B
第3章 通用数据处理指令

〔例3-7〕逻辑运算程序-1 mov eax,varA ;EAX=11001010000111100101010101001101B not eax ;EAX=00110101111000011010101010110010B and eax,varB ;EAX=00110101010000000010000010100000B mov ebx,varB ;EBX=00110111010110100011010111100001B not ebx ;EBX=11001000101001011100101000011110B and ebx,varA ;EBX=11001000000001000100000000001100B or eax,ebx ;EAX=11111101010001000110000010101100B mov varT1,eax 66 第3章 通用数据处理指令

〔例3-7〕逻辑运算程序-2 mov eax,varA A?B ? A?B? A?B xor eax,varB ;EAX=11111101010001000110000010101100B mov varT2,eax ; mov eax,varT1 ;二进制形式显示VART1 call dispbd call dispcrlf ;换行显示 mov eax,varT2 ;二进制形式显示VART2 call dispbd
11111101010001000110000010101100 11111101010001000110000010101100
67

运行结果 第3章 通用数据处理指令

逻辑运算的屏蔽作用

? AND复位某些位(同0与),不影响其他(同1与) ? OR置位某些位(同1或),不影响其他(同0或) ? XOR求反某些位(同1异或),不影响其他(同0异或)
and bl,11110110b ;BL中D0和D3清0,其余位不变 or bl,00001001b ;BL中D0和D3置1,其余位不变 xor bl,00001001b ;BL中D0和D3求反,其余位不变 置位Set:置1 复位Reset:清0,清除Clear xor edx,edx sub edx,edx mov edx,0
第3章 通用数据处理指令

大写=小写 AND DFH 小写=大写 OR 20H
68

5. 测试指令TEST

? 按位进行逻辑与运算,不返回逻辑与结果
TEST reg,imm/reg/mem TEST mem,imm/reg

? TEST指令像AND指令一样来设置状态标志 ? TEST指令常用于检测一些条件是否满足,一般
后跟条件转移指令,目的是利用测试条件转向 不同的分支
AND与TEST? TEST与CMP?

;reg ? imm/reg/mem ;mem ? imm/reg

69

第3章 通用数据处理指令

3.3.2 移位指令

? 逻辑左移指令 ? 逻辑右移指令 ? 算术左移指令 ? 算术左移指令

SHL SHR SAL SAR

S: Shift R: Rotate L: Left R: Right A: Arithmetic C: Carry flag

? 不带进位循环左移指令 ROL ? 不带进位循环右移指令 ROR ? 带进位循环左移指令 RCL ? 带进位循环右移指令 RCR
70

第3章 通用数据处理指令

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

? 目的操作数:寄存器或存储单元reg/mem ? 后一个操作数:移位位数i8/CL
71

;算术右移:最高位不变,最低位进入CF

示意图 第3章 通用数据处理指令

〔例3-8〕移位指令实现乘法程序
xor eax,eax mov ax,wvar shl eax,1 mov ebx,eax shl eax,2 add eax,ebx call dispuid call dispcrlf imul eax,10 call dispuid ;EAX=0 ;AX=要乘以10的无符号数 ;左移一位等于乘2 ;EBX=EAX×2 ;再左移2位,EAX=EAX×8 ;EAX=EAX×10 ;显示乘积 ;换行 ;EAX=EAX×10 ;显示乘积

73

SHL逻辑左移一位相当于无符号数乘以2 SHR逻辑右移一位相当于无符号数除以2
第3章 通用数据处理指令

2. 循环移位指令

? 循环( Rotate )移位指令要将从一端移出的位返回
到另一端形成循环 ? 分成不带进位循环移位和带进位循环移位 ? 分别具有左移或右移操作 ROL reg/mem,i8/CL
;不带进位循环左移指令

ROL/ROR示意图

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

RCL reg/mem,i8/CL
;带进位循环左移指令
RCL/RCR示意图

RCR reg/mem,i8/CL
;带进位循环右移指令
74

第3章 通用数据处理指令

〔例3-9〕循环移位程序-1

;数据段 qvar qword 1234567887654321h ;代码段 mov ecx,4 again: shr dword ptr qvar+4,1 rcr dword ptr qvar,1 loop again
64位数据 逻辑右移4位

高32位
0

CF

低32位

77

第3章 通用数据处理指令

〔例3-15〕循环移位程序-2

ascii bcd

;数据段 byte '38' ;33H,38H byte ? ;代码段 mov al,ascii and al,0fh mov ah,ascii+1 shl ah,4 or al,ah mov bcd,al

BCD=83H

78

第3章 通用数据处理指令

第3章习题:通用数据处理指令
3.1 简答题(1、2、5、7、9) 3.2 判断题(1、4、5、7、10) 3.3 填空题(2、4、5、8、10) 3.4、3.6、3.11、3.14、3.16 3.21、3.22


推荐相关:

32位汇编语言03_图文.ppt

32位汇编语言03 - 第3章 通用数据处理指令 3.1 数据传送类指令 3.2

32位汇编语言02_图文.ppt

32位汇编语言02_其它课程_高中教育_教育专区。计算机必修 第2章 数据表示和寻址...00000030 37 00000002 [02 03 00000002 [04]] byte 2 dup(2,3,2 dup(4)...

32位微机03_图文.ppt

32位微机03 - 《微机原理与接口技术》钱晓捷著第4版课件... 钱晓捷,微机原理与接口技术 第4版基于IA-32处理器和32位汇编语言 第 3 章 数据处理 3.1 3....

32位汇编语言01_图文.ppt

32位汇编语言01_其它_高等教育_教育专区。32位汇编语言0132位汇编语言0132位...[ebx] ; 机器代码:8B 03 mov eax,[ebx+esi*4+80h] ; 机器代码:8B 84...

汇编语言03_图文.ppt

汇编语言03_计算机软件及应用_IT/计算机_专业资料。汇编语言课件03 算术与逻辑...中32位数值左移一位 SHL AX,1 RCL DX,1 DX CF AX 0 移位指令与标志位...

32位汇编语言_图文.ppt

32位汇编语言 - 第1章 汇编语言基础 1.1 英特尔80x86处理器 1.2

汇编语言03._图文.ppt

汇编语言03. - 第三章 汇编语言程序格式 软件学院 侯刚 教学重点 第 2

[工学]汇编语言03_图文.ppt

[工学]汇编语言03 - 第3章 第3章 微型计算机的结构 1 第3章 教学重点

32位汇编语言任务_图文.ppt

32位汇编语言任务 - 32位汇编语言上机任务 32位汇编语言上机任务 上机前作

32位汇编语言习题及答案(全部)(钱晓捷版)_图文.ppt

32位汇编语言习题解答 32位汇编语言习题解答课件制作: 课件制作: 钱晓捷 钱晓捷,32位汇编语言程序设计,机械工业出版社 钱晓捷,32位汇编语言程序设计, 位汇编语言程序...

32位汇编语言08._图文.ppt

32位汇编语言08. - 8.1 DOS编程 第8章 DOS环境的程序设 计 8

32位汇编语言程序设计部分课后习题答案_图文.ppt

32位汇编语言程序设计部分课后习题答案 - 32位汇编语言习题解答 课件制作: 钱晓捷 钱晓捷,32位汇编语言程序设计,机械工业出版社 第1章习题:汇编语言基础 1.1 简...

32位汇编语言05剖析_图文.ppt

32位汇编语言05剖析 - 第5章 模块化程序设计 5.1 子程序结构 5.2

32位汇编语言体系结构._图文.ppt

32位汇编语言体系结构. - IA-32 体系结构 宋军 计算机学院信息安全

32位汇编语言教学技巧_图文.pdf

32位汇编语言教学技巧 - 第 2期 84 201 2年1月2 5日 计算机教育

chap03_addon_汇编语言的编译._图文.ppt

chap03_addon_汇编语言的编译. - 汇编语言的编译及调试环境 设置环

32位汇编语言02_图文.ppt

32位汇编语言02 - 第2章 数据表示和寻址 2.1 数据表示 2.2 常量表

32位汇编语言表达式与操作符._图文.ppt

32位汇编语言表达式与操作符. - 表达式与操作符 宋军 计算机学院信息安全

32位汇编语言习题及答案(全部)(钱晓捷版)_图文.ppt

32位汇编语言习题及答案(全部)(钱晓捷版) - 32位汇编语言习题解答 课件制作: 钱晓捷 钱晓捷,32位汇编语言程序设计,机械工业出版社 第1章习题:汇编语言基础 1.1...

32位汇编语言01_图文.ppt

32位汇编语言01 - 第1章 汇编语言基础 英特尔80 86处理器 80x 1

网站首页 | 网站地图
All rights reserved Powered by 学霸学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com