版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章数据表示和寻址2.1数据表示2.2常量表达2.3变量应用2.4数据寻址方式第2章数据表示和寻址理解计算机的数据表达熟悉汇编语言的常量表达掌握汇编语言的变量定义和属性掌握处理器指令的数据寻址方式32.1数据表示数据(Data):计算机处理的对象对应指令操作的对象:操作数(Oprand)计算机中的数据要用二进制的0和1组合表示进入计算机的任何信息都要转换成0和1数码IA-32整数指令支持的基本数据类型8、16、32、64位无符号整数8、16、32、64位有符号整数ASCII字符、字符串和BCD码42.1.1数制人习惯使用十进制计数计算机使用二进制进行数据处理十六进制数便于表达二进制数二进制数用后缀字母B十六进制数用后缀字母H51.二进制便于计算机存储及物理实现特点:逢二进一,由0和1两个数码组成,基数为2,各个位权以2k表示二进制数:
anan-1…a1a0.b1b2…bm= an×2n+an-1×2n-1+…+a1×21+a0×20
+b1×2-1+b2×2-2+…+bm×2-m 其中ai,bj非0即1二进制数的算术运算:逢2进1、借1当2示意图二进制数的算术运算返回2.逻辑运算事件的假和真可用数码0和1表示事件之间的关系可以利用二进制表达数字电路的低高电平用数码0和1表示数字信号之间的关系可以利用二进制描述数码0和1仅仅代表两种状态它们的运算是逻辑运算逻辑与AND: 1101
0011=0001逻辑或OR: 1101
0011=1111逻辑非NOT:
1101=0010逻辑异或XOR: 1101
0011=11103.十六进制用于表达二进制数,相互转换简单基数16,逢16进位,位权为16k16个数码:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F十六进制数:
anan-1…a1a0.b1b2…bm= an×16n+an-1×16n-1+…+a1×161+a0×160 +b1×16-1+b2×16-2+…+bm×16-m 其中ai,bj是0~F中的一个数码十六进制数的加减:逢16进位1,借1当16减法加法十六进制数的加法运算
23D9+94BEB8979+14=23=16(carry)+713+11+1(carry)=25=16(carry)+93+4+1(carry)=82+9=11=B返回十六进制数的减法运算
A59F-62B842E715-8=716(borrow)+9-11=14=E5-2-1(borrow)=210-6=4返回114.数制之间的转换十进制二进制十六进制BCD码常用二进制位权00000002-3=0.12510001112-2=0.2520010222-1=0.5300113320=1401004421=2501015522=4601106623=8701117724=16810008825=32910019926=64101010A27=128111011B28=256121100C29=512131101D210=1024141110E215=32768151111F216=6553612二进制数或十六进制数转换为十进制数方法:按权展开二进制数转换为十进制数
0011.1010B =1×21+1×20+1×2-1+0×2-2+1×2-3 =3.625十六进制数转换为十进制数
1.2H
=1×160+2×16-1
=1.12513十进制整数转换为二或十六进制数整数部分转换:用除法十进制数整数部分不断除以基数2或16,并记下余数,直到商为0为止由最后一个余数起逆向取各个余数,则为转换成的二进制和十六进制数
126=01111110B 126=7EH示意图14十进制整数的转换返回15十进制小数转换为二或十六进制数小数部分转换:用乘法分别乘以各自的基数,记录整数部分,直到小数部分为0为止
0.8125=0.1101B 0.8125=0.DH小数转换会发生总是无法乘到为0的情况可选取一定位数(精度)将产生无法避免的转换误差示意图16十进制小数的转换返回17二进制和十六进制数的相互转换二进制和十六进制数之间具有对应关系以小数点为基准整数从左向右,小数从右向左每4个二进制位对应一个十六进制位
00111010B=3AH F2H=11110010B182.1.2数值的编码编码:用文字、符号或者数码来表示某种信息(数值、语言、操作指令、状态等)的过程二进制编码:组合0和1数码机器数:计算机用0和1数码组合表达的数值真值:现实中真实的数值数值的两种编码方式定点格式(第2章)浮点格式(第9章)191.定点整数定点格式:固定小数点的位置表达数值定点整数:小数点固定在机器数的最右侧定点小数:小数点固定在机器数的最左侧无符号整数(无符号数)只表达0和正整数的定点整数N位无符号整数表达范围:0~2N-1有符号整数(有符号数、带符号数)表达负整数、0和正整数的定点整数最高位表达数值正负符号位用0表示正数、1表示负数示意图20定点整数格式返回212.补码有符号整数在计算机中默认采用补码最高位表示符号:正数用0,负数用1正数补码:直接表示数值大小(同无符号数)负数补码:将对应正数补码取反加1 [105]补码=01101001B [-105]补码=[01101001B]取反+1 =10010110B+1=10010111B8位二进制补码的数值范围:-128~+12716位二进制补码的数值范围:-215~+215-132位二进制补码的数值范围:-231~+231-1N位二进制补码的数值范围:-2N-1~+2N-1-122负数求补负数真值“取反加1”得机器数补码负数补码“取反加1”得到负数真值补码:11100000B真值:-([11100000]求反+1)=-(00011111+1)=-00100000=-25=-32负数求补运算,等效于用带借位的0作减法真值:-8,补码:[-8]补码=00H-08H=F8H补码:11111000,真值:-(00H-F8H)=-08H=-8+8= 00001000 11110111+ 1-8= 11111000
0= 00000000-(8= 00001000)-8= 11111000233.补码运算利用无符号数加法结合补码表达,实现无符号数加法无符号数减法有符号数加法有符号数减法无符号数加减运算,需要利用进位或借位有符号数加减运算,注意避免出现溢出[X]补码+[Y]补码=[X+Y]补码[X]补码-[Y]补码=[X]补码+[-Y]补码=[X-Y]补码244.原码和反码正数的原码、反码和无符号数一样求负数的原码、反码和补码首先计算其对应正数的编码然后取反符号位(设置为1)成为原码再取反其他位得到反码最后加1就是补码真值:32,机器数:00100000B=20H真值:-32,机器数:
[-32]原码=10100000B=A0H [-32]反码=11011111B=DFH [20H]补码=11100000B=E0H252.1.3
字符的编码在计算机中,各种字符需要用若干位的二进制码的组合表示,即字符的二进制编码由于字节为计算机的基本存储单位,所以常以8个二进制位为单位表达字符0123456789English汉字261.BCD(二进制表达的十进制)二进制编码的十进制数一个十进制数位用4位二进制编码来表示8421BCD码:低10个4位二进制编码表示0~9压缩BCD码:一个字节表达两位BCD码非压缩BCD码:一个字节表达一位BCD码(低4位表达数值,高4位常设置为0)BCD码很直观BCD码:0100100101111000.000101001001十进制真值: 4978.149BCD码便于输入输出,表达数值准确272.ASCII(美国标准信息交换码)标准ASCII码用7位二进制编码,有128个不可显示的控制字符:前32个和最后一个回车CR:0DH
换行LF:0AH
响铃BEL:07H可显示和打印的字符:20H及以后的95个编码数码0~9:30H~39H大写字母A~Z:41H~5AH小写字母a~z:61H~7AH空格:20H扩展ASCII码:最高D7位为1,表达制表符号283.Unicode(统一码)8位ASCII码表达英文字符16位国标码表达汉字字符汉字机内码:国标码在计算机中使用的编码国际信息交换码Unicode16位编码对世界上所有语言的大多数字符进行编码提供扩展能力Unicode兼容ASCIIUnicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论是什么语言29什么是统一码?WhatisUnicode?Unicodeprovidesauniquenumberforeverycharacter,
nomatterwhattheplatform,
nomatterwhattheprogram,
nomatterwhatthelanguage.Unicode给每个字符提供了一个唯一的数字, 不论是什么平台, 不论是什么程序, 不论是什么语言返回302.2
常量表达1.常数十、十六和二进制形式表达的数值以后缀字母区分,十进制数可以不加以字母A~F开头的十六进制常数,要加前导02.字符和字符串英文缩略号括起来的单个字符或多个字符数值是每个字符对应的ASCII码值3.符号常量使用标识符表达一个数值符号定义伪指令:等价EQU,等号=4.数值表达式用运算符连接各种常量构成的算式算术运算符:+(加)-(减)*(乘)/(除)常量具有确定数值31〔例2-1〕数据表达程序-100000000 6464
64
64
64const1 db100,100d,01100100b,64h,'d'00000005 017F8080FFFFconst2 db1,+127,128,-128,255,-10000000B 699720E032CEconst3 db105,-105,32,-32,32h,-32h00000011 303132333435 363738396162 6378797A4142 4358595Aconst4 db'0123456789','abcxyz','ABCXYZ'32〔例2-1〕数据表达程序-200000027 0D0A00crlf db0dh,0ah,0=0000000A
minint equ10
=000000FF
maxint
equ0ffh0000002A 0A0FFAF5const5 dbminint,minint+5,maxint-5,maxint-minint0000002E 105615EBconst6 db4*4,34h+34,67h-52h,52h-67h332.3
变量应用变量(Variable)程序运行中随之发生变化的结果保存在可读可写的主存空间实质是主存单元的数据,因而可以改变变量需要事先定义才能使用变量具有属性方便应用变量表达主存数据,即存储器操作数342.3.1
变量定义申请存储空间,还可以进行存储单元初始化
变量名变量定义伪指令初值表变量名是用户标识符,表示首元素逻辑地址变量定义伪指令有DB(BYTE)、DW(WORD)、DD(DWORD)、DQ(QWORD)初值表是用逗号分隔的参数各种形式的常量“?”表示初值不确定,即未赋初值复制操作符DUP
重复次数DUP(重复参数)351.变量定义伪指令助记符:DB变量类型:字节分配一个或多个字节单元;每个数据是字节量可用于定义字符串常量表示8位无符号数或有符号数,字符的ASCII码值助记符:DW变量类型:字分配一个或多个字单元;每个数据是字量、16位数据表示16位无符号或有符号数、16位段选择器、16位偏移地址助记符:DD变量类型:双字分配一个或多个双字单元;每个数据是双字量、32位数据表示32位无符号或有符号数、32位段基地址、32位偏移地址助记符:DQ变量类型:4个字分配一个或多个8字节单元;8字节量表示64位数据362.字节量数据DB定义8位、字节量变量数据可以表达无符号整数0~255补码表示的有符号整数:-128~+127一个字符(ASCII码值)压缩BCD码:0~99非压缩BCD码:0~9……字符串定义使用字节变量定义DB37〔例2-2〕字节变量程序=0000000A minintequ1000000000 0080FF80007Fbvar1 db0,128,255,-128,0,+12700000006 01FF26DA38C8bvar2 db1,-1,38,-38,38h,-38h0000000C 00bvar3 db?0000000D 00000005[24]bvar4 db5dup('$')00000012 0000000A[00]0000000A[0A00]bvar5 dbminintdup(0),minintdup(minint,?)00000030 00000002[020300000002[04]]
db2dup(2,3,2dup(4))383.字量数据DW定义16位、字量变量数据可以表达16位无符号和有符号整数16位段选择器,16位偏移地址16位数据含高低2个字节,占2个连续的字节存储单元小端方式(LittleEndian)低字节数据存放在低地址存储单元高字节数据存放在高地址存储单元大端方式(Big
Endian)低字节数据存放在高地址存储单元高字节数据存放在低地址存储单元39〔例2-3〕字变量程序-1=0000000A minintequ1000000000 00008000FFFF800000007FFFwvar1 dw0,32768,65535,-32768,0,+327670000000C 0001FFFF0026FFDA0038FFC8wvar2 dw1,-1,38,-38,38h,-38h00000018 0000 wvar3 dw?0000001A 20101020wvar4 dw2010h,1020h0000001E 00000005[000A0000]
dw5dup(minint,?)40〔例2-3〕字变量程序-200000032 31393832wvar6 dw3139h,3832h00000036 39313238bvar6 db39h,31h,32h,38h0000003A 00
db091289128运行结果?414.双字量数据DD定义32位、双字量变量数据可以表达32位无符号和有符号整数32位偏移地址、线性地址或段基地址32位数据包含4个字节,以“高对高、低对低”原则占用4个连续字节空间Howtoopenanegg,fromthelittleendorthebigend?示意图42返回小端存储方式43〔例2-4〕双字变量程序-1=0000000A minintequ1000000000 0000000080000000FFFFFFFF 80000000000000007FFFFFFFdvar1 dd0,80000000h,0ffffffffh,-80000000h,0,7fffffffh00000018 00000001FFFFFFFF00000026 FFFFFFDA00000038FFFFFFC8dvar2 dd1,-1,38,-38,38h,-38h00000030 00000000dvar3 dd?00000034 0000201000001020
dd2010h,1020h44〔例2-4〕双字变量程序-20000003C 0000000A[0000000A00000000]dvar5 ddminintdup(minint,?)0000008C 38323139dvar6 dd38323139h00000090 39313238bvar6 db39h,31h,32h,38h00000094 00 db091289128运行结果!455.变量定位:指定偏移地址变量定义的存储空间 按照书写的先后顺序一个接着一个分配“ORG参数”控制存放的偏移地址
org100h ;从偏移地址100H处安排指令代码也由汇编程序 按照语句的书写顺序安排存储空间定位伪指令也可以用于控制代码的偏移地址465.变量定位:对齐地址边界N字节数据起始于能够被N整除的地址2字节、16位数据是被2整除的地址(偶地址)4字节、32位数据是被4整除的地址(模4地址)8字节、64位数据是被8整除的地址(模8地址)IA-32处理器允许不对齐边界存放数据,性能有下降“ALIGN
N”控制对齐N字节边界
align
4
;对齐4字节地址边界地址A对齐N字节边界AmodN=0
(能够被N整除的地址)47〔例2-5〕变量定位程序
org100h
0000010064
bvar1 db100
align2
000001020064 wvar2 dw100
align4
0000010400000000
dvar3 dd?
align4
0000010800000000
dvar4 dd?482.3.2
变量属性变量定义分配存储空间赋初值创建变量名变量名具有两类属性:⑴地址属性:首个变量所在存储单元的逻辑地址,含有段基地址和偏移地址⑵类型属性:变量定义的数据单位字节量BYTE
字量WORD
双字量DWORD
3字量FWORD4字量QWORD10字节量TBYTE49⒈地址操作符地址操作符用于获取变量名的地址属性[]括起的表达式作为存储器地址指针$返回当前偏移地址OFFSET变量名返回变量名所在段的偏移地址SEG变量名返回段基地址(实地址存储模型)50〔例2-6〕变量地址属性程序-1
;数据段00000000 1234bvar db12h,34h00000002
000100020003000400050006 000700080009000Aarray dw1,2,3,4,5,6,7,8,9,1000000016
5678wvar dw5678h=00000016
arr_sizeequ$-array=0000000B arr_lenequarr_size/200000018 9ABCDEF0dvar
dd9abcdef0h51〔例2-6〕变量地址属性程序-2
;代码段00000000 A000000000R
moval,[bvar]00000005 8A2500000001R
movah,[bvar+1]0000000B 66|8B1D 00000022R
movbx,wvar[2]00000012 B90000000B
movecx,arr_len00000017 BA00000017R
movedx,$0000001C BE00000022R
movesi,offsetdvar52〔例2-6〕变量地址属性程序-300000021 8B3E
movedi,[esi]00000023 8B2D00000022R
movebp,[dvar]00000029 E800000000E
calldisprd运行结果53⒉类型操作符类型操作符使用变量名的类型属性类型名PTR变量名将变量名按照指定的类型使用TYPE变量名返回占用字节空间的字量数值LENGTHOF变量名返回整个变量的数据项数SIZEOF
变量名返回整个变量占用的字节数54〔例2-7〕变量类型属性程序-1
;代码段00000000 A10000000CR
moveax,dwordptr[array] ;获得数据00000005 BB00000001
movebx,typebvar
;获得字节类型值0000000A B900000002
movecx,typewvar
;获得字类型值0000000F BA00000004
movedx,typedvar
;获得双字类型值55〔例2-7〕变量类型属性程序-200000014 BE0000000A
movesi,lengthofarray
;获得数据个数00000019 BF00000014
movedi,sizeofarray
;获得字节长度0000001E BD00000016
movebp,arr_size
;获得字节长度00000023 E800000000E
calldisprd
运行结果562.4数据寻址方式指令有两部分:操作码和操作数操作码:处理器要执行哪种操作不可缺少,用助记符表示操作数:指令执行的参与者各种操作的对象,需要通过地址指示数据寻址方式:通过地址查找数据(操作数)立即数寻址:数据在指令代码中,用常量表达寄存器寻址:数据在寄存器中,用寄存器名表示存储器寻址:数据在主存中,用存储器地址指示572.4.1立即数寻址操作数紧跟操作码,是机器代码的一部分操作数从指令代码中立即得到,即立即数(Immediate),用常量形式直接表达立即数寻址方式只用于源操作数,常用来给寄存器和存储单元赋值例如:MOVEAX,33221100H机器代码:B800112233操作码:B8立即数:33221100示意图58立即数寻址返回59〔例2-8〕立即数寻址程序-1
;数据段=00000040 const equ64000000008749 bvar db87h,49h00000002123456780000000C dvar dd12345678h,12
;代码段00000000B012 moval,12h00000002B464 movah,'d'0000000466|BBFFFF
labl: movbx,-100000008B900000040
movecx,const60〔例2-8〕立即数寻址程序-20000000DBA00000040
movedx,const*4/typedvar00000012BE00000000R
movesi,offsetbvar00000017BF00000004R
movedi,labl0000001CC60500000000R4C
movbyteptr[bvar],01001100b00000023C70500000006R00000012
movdwordptr[dvar+4],12h612.4.2寄存器寻址操作数存放在处理器的内部寄存器中用寄存器名表示它的内容绝大多数指令采用通用寄存器寻址部分指令支持专用寄存器,例如段寄存器寄存器寻址方式简单快捷,最常使用例如:MOVEBX,EAX32位通用寄存器:EAXEBXECXEDX……16位通用寄存器:AXBXCXDX……8位通用寄存器:AHALBHBL……62〔例2-9〕寄存器寻址程序
;代码段000000008AC4 moval,ah0000000266|8BD8 movbx,ax000000058BD8 movebx,eax0000000766|8CDA movdx,ds0000000A66|8EC2 moves,dx
movedi,sieg0209.asm(11):errorA2022:instructionoperandsmustbethesamesize出错了!632.4.3存储器寻址操作数在主存中,通过存储器地址指示编程时,存储器地址使用包含段选择器和偏移地址的逻辑地址段选择器(段寄存器)指示段基地址默认规定:数据在DS指向的数据段;EBP或ESP作为基地址,数据在SS指向的堆栈段显式说明:使用段超越指令前缀,段寄存器名后跟英文冒号偏移地址由各种寻址方式计算常被称为有效地址EA(EffectiveAddress)641.段寄存器的默认和超越访问存储器的方式默认可超越偏移地址取指令CS无EIP堆栈操作SS无ESP一般数据访问DSCSESSSFSGS有效地址EAEBP基址的寻址方式SSCSESDSFSGS有效地址EA串操作的源操作数DSCSESSSFSGSESI串操作的目的操作数ES无EDI主存操作数常通过变量形式引用,一般不需要使用段超越前缀指令652.偏移地址的组成32位有效地址=基址寄存器+(变址寄存器×比例)+位移量基址寄存器:任何8个32位通用寄存器之一变址寄存器:除ESP外的任何32位通用寄存器之一比例:1,2,4或8位移量:8或32位有符号值变化出多种主存寻址方式663.直接寻址有效地址只有位移量部分,直接包含在指令代码中常用于存取变量例如:
MOVECX,[COUNT]
;COUNT是变量
MOVECX,COUNT ;MASM支持
MOVECX,DS:[405000H]指令代码:8B0D00504000操作码和寻址方式:8B0D操作数:有效地址00405000H示意图67存储器直接寻址返回68〔例2-10〕存储器直接寻址程序-1
;数据段00000000
8749 bvar db87h,49h00000002
123456780000000C dvar dd12345678h,12
;代码段00000000
8A0D00000000R movcl,[bvar]00000006
8B1500000002R movedx,[dvar]69〔例2-10〕存储器直接寻址程序-20000000C883500000001R mov[bvar+1],dh0000001266|891500000004R movwordptr[dvar+2],dx00000019C70500000002R87654321 movdwordptr[dvar],87654321h
movdwordptr[dvar+4],dvareg0210.asm(13):errorA2070:invalidinstructionoperands出错了!704.寄存器间接寻址有效地址存放在寄存器中(寄存器内容=偏移地址=有效地址)MASM用中括号括起寄存器可以方便地对数组的元素或字符串的字符进行操作寄存器间接寻址没有说明存储单元类型例如:movedx,[ebx]movcx,[esi]mov[edi],al71〔例2-11〕寄存器间接寻址程序-1 ;数据段srcmsg db'Tryyourbest,whynot.',0count equ$-srcmsg ;计算字符串字符个数,赋给符号常量dstmsg dbcountdup(0) ;代码段
movecx,count ;ECX=字符串字符个数
movesi,offsetsrcmsg ;ESI=源字符串首地址
movedi,offsetdstmsg ;EDI=目的字符串首地址72〔例2-11〕寄存器间接寻址程序-2again: moval,[esi] ;取源串一个字符送AL
mov[edi],al ;将AL传送给目的串
addesi,1 ;源串指针加1,指向下一个字符
addedi,1 ;目的串指针加1,指向下一个字符
loopagain
;字符个数ECX减1,不为0,则转到AGAIN标号处执行
moveax,offsetdstmsg
calldispmsg ;显示目的字符串内容735.寄存器相对寻址有效地址是寄存器内容与位移量之和也可以方便地对数组的元素或字符串的字符进行操作例如:
movesi,[ebx+4] ;位移量:4
movedi,[ebp-08h] ;位移量:-08H
movesi,count[esi] ;位移量:COUNT主存以字节为可寻址单位地址的加减是以字节为单位74〔例2-12〕寄存器相对寻址程序 ;数据段srcmsg db'Tryyourbest,whynot.',0count equ$-srcmsg ;计算字符串字符个数,赋给符号常量dstmsg dbcountdup(0) ;代码段
movecx,count ;ECX=字符串字符个数
movebx,0 ;EBX指向首个字符again: moval,srcmsg[ebx] ;取源串一个字符 movdstmsg[ebx],al ;传送给目的串
addebx,1 ;加1,指向下一个字符
loopagain756.变址寻址使用变址寄存器寻址操作数便于支持两维数组等数据结构例如: ;基址变址寻址,功能:EDI=DS:[EBX+ESI]
movedi,[ebx+esi] movedi,[ebx][esi] ;相对基址变址寻址,功能:EAX=DS:[EBX+EDX+80H]
moveax,[ebx+edx+80h] moveax,80h[ebx+edx] moveax,80h[ebx][edx]767.带比例的变址寻址变址寄存器内容乘以比例1(可省略),2,4或8的变址寻址比例1、2、4和8对应8、16、32和64位数据的字节个数,便于以数组元素为单位寻址相应数据例如:
moveax,[ebx*4] ;带比例的变址寻址
moveax,[esi*2+80h] ;带比例的相对变址寻址
moveax,[ebx+esi*4] ;带比例的基址变址寻址
moveax,[ebx+esi*8-80h] ;带比例的相对基址变址寻址772.4.4数据寻址的组合立即数寻址imm(通用)寄存器寻址reg存储器操作数寻址mem第2章习题:数据表示和寻址2.1简答题(2、3、4、7、8)2.2
判断题(2、4、8、9、10)2.3
填空题(1、2、3、8、9)2.10、2.14、2.15、2.17第3章通用数据处理指令3.1数据传送类指令3.2算术运算类指令3.3位操作类指令第3章通用数据处理指令熟悉IA-32处理器通用的基本指令:数据传送指令、算术运算指令逻辑运算和移位操作指令掌握指令功能和编程应用81学习指令的注意事项指令的功能——该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等823.1数据传送类指令数据传送把数据从一个位置传送到另一个位置计算机中最基本的操作程序设计中最常使用的指令除标志寄存器传送指令外,均不影响标志位全面而准确地理解每条指令的功能和应用是编写汇编语言程序的关键也是理解处理器如何进行数据处理的核心833.1.1通用数据传送指令提供方便灵活的通用数据传送操作主要有传送MOV和交换XCHG指令源操作数src目的操作数dest30H30H被传送的数据MOV指令的功能841.传送指令MOV(move)MOVreg/mem,immMOVreg/mem/seg,regMOVreg/seg,memMOVr16/m16,seg把一个字节、字或双字的操作数 从源位置传送至目的位置段寄存器通用寄存器立即数主存储器禁止85IA-32指令支持3种数据长度8位(字节)数据,byte类型
moval,20016位(字)数据,word类型
mov
ax,[ebx]32位(双字)数据,dword类型
mov
eax,[dvar]32位通用寄存器:EAXEBXECX…16位通用寄存器:AXBXCXDX…8位通用寄存器:AHALBHBL…16位段寄存器:DSCSSSES…
86寄存器reg 为目的操作数
moval,200 ;8位立即数i8
movax,200 ;16位立即数i16
moveax,200 ;32位立即数i32立即数传送MOVreg/mem,imm存储器mem 为目的操作数
mov[bvar],byte
ptr200 ;8位立即数i8
mov[ebx],word
ptr200 ;16位立即数i16
mov[esi+8],dwordptr200 ;32位立即数i3287MOVreg/mem/seg,reg存储器mem 为目的操作数
mov[bvar],cl ;8位通用寄存器r8
mov[ebx],cx ;16位通用寄存器r16
mov[esi+8],edi ;32位通用寄存器r32寄存器传送寄存器reg 为目的操作数
mov
al,ah ;8位通用寄存器r8
mov
ax,bx ;16位通用寄存器r16
mov
eax,edx ;32位通用寄存器r32段寄存器seg为目的操作数
mov
ds,bx88存储器传送MOVreg/seg,mem寄存器reg 为目的操作数
mov
dl,[bvar] ;8位储存器m8
mov
dx,[ebx] ;16位存储器m16
mov
edx,dvar[edi] ;32位存储器m32段寄存器seg 为目的操作数
mov
ds,[wvar] ;16位存储器m16
mov
es,[ebx] ;16位存储器m16
movss,[ebp+8] ;16位存储器m1689(16位)段寄存器传送MOVr16/m16,seg寄存器r16 为目的操作数
mov
ax,ds
mov
dx,es
mov
si,fs
mov
di,gs存储器m16 为目的操作数
mov[wvar],ds
mov[ebx],ss
mov[esi-8],cs
mov[ebp+8],cs90传送指令MOV把一个字节、字或双字的操作数从源位置传送至目的位置MOVreg/mem,immMOVreg/mem/seg,regMOVreg/seg,memMOVreg/mem,seg并非任意传送!无法翻译就出错!段寄存器通用寄存器立即数主存储器禁止91注意1:双操作数必须类型一致MOVESI,DL ;错误:类型不一致
;ESI为32位寄存器,DL为8位寄存器
movesi,edx ;正确:两个32位寄存器传送MOVAL,050AH ;错误:类型不一致
;050AH超过了寄存器AL范围
moveax,050ah ;正确:双字量数据传送92注意2:操作数必须有明确的类型MOV[EBX],255
;错误:无明确类型
movbyteptr[ebx],255 ;正确:BYTEPTR说明是字节操作
movwordptr[ebx],255 ;正确:WORDPTR说明是字操作
movdwordptr[ebx],255 ;正确:DWORDPTR说明是双字操作93注意3:双操作数不允许都是主存单元
;假设dbuf1和dbuf2是两个双字变量MOV[DBUF2],[DBUF1] ;错误:两个操作数都是存储单元
moveax,[dbuf1] ;正确:EAX=DBUF1(将DBUF1内容送EAX)
mov[dbuf2],eax
;正确:DBUF2=EAX(将EAX内容送DBUF2)94注意4:不可随意操作专用寄存器MOVDS,@DATA ;错误:立即数不能直接传送段寄存器
;(@DATA是数据段地址)
mov
ax,@data
mov
ds,ax ;正确:通过AX间接传送给DS952.交换指令XCHG将源操作数和目的操作数内容交换
XCHGreg,reg/mem
XCHGreg/mem,reg通用寄存器与通用寄存器之间通用寄存器或存储器之间空操作指令NOP(=XCHGEAX,EAX)处理器执行空操作该指令,需要化费时间,在主存中也要占用一个字节空间实现短时间延时临时占用代码空间xchg
esi,edixchg
esi,[edi]xchg
al,[var]963.1.2堆栈操作指令“先进后出FILO”存取的存储区域,只有一个数据出入口,即当前栈顶(不断变化)两种基本操作数据压进堆栈PUSH数据弹出堆栈操作POPSS指向堆栈段的起始位置ESP指定栈顶数据进入堆栈,ESP逐渐减小数据依次弹出、ESP逐渐增大Word1Word2Word3Word4Word5StackPUSHPOP示意图97IA-32处理器堆栈操作返回981.进栈指令PUSH
PUSHr16/m16/i16/seg ①ESP=ESP-2②SS:[ESP]=r16/m16/i16/seg
PUSHr32/m32/i32 ①ESP=ESP-4②SS:[ESP]=r32/m32/i32先将ESP减小作为当前栈顶后将源操作数(立即数、通用寄存器和段寄存器内容或存储器操作数)传送到当前栈顶以字或双字为单位操作进栈双字量数据时,ESP减4进栈字量数据时,ESP减2pusheax示意图99进栈操作返回1002.出栈指令POP POPr16/m16/seg ①r16/m16/seg=SS:[ESP]②ESP=ESP+2
POPr32/m32 ①r32/m32=SS:[ESP]②ESP=ESP+4
先将栈顶数据传送到目的操作数(通用寄存器、存储单元或段寄存器)后ESP增加作为当前栈顶以字或双字为单位操作出栈双字量数据时,ESP加4出栈字量数据时,ESP加2popeax示意图101出栈操作返回102〔例3-1〕堆栈操作程序
;数据段ten equ10dvar dd67762000h,12345678h ;代码段
moveax,[dvar+4]
;EAX=12345678H
pusheax
;将EAX内容压入堆栈
pushdwordptrten
;将立即数以双字量压入堆栈
pushdwordptr[dvar] ;变量DVAR第一个数据入堆
popeax
;栈顶数据弹出到EAX
popdwordptr[dvar+4] ;栈顶数据弹出到DVAR+4
movebx,[dvar+4]
;EBX=000000AH
popecx
;栈顶数据弹出到ECX1033.堆栈的应用堆栈不可或缺,被很多指令使用:堆栈操作指令子程序调用CALL和返回RET,中断调用INT和返回IRET等内部异常、外部中断等也利用堆栈堆栈可用来临时存放数据,以便随时恢复它们常利用堆栈基址指针EBP,随机读写堆栈数据利用堆栈实现主、子程序间传递参数堆栈还常用于子程序的寄存器保护和恢复注意入栈和出栈的数据要成对,保持堆栈平衡1043.1.3其他传送指令针对特定需要设计的专用传送指令地址传送指令换码指令标志传送指令……PUSHADPOPADPUSHFDPOPFD……LEA
LDSLES……XLATCLCSTCCMC……1051.地址传送指令地址传送指令获取存储器操作数的地址LEAr16/r32,mem
;r16/r32←mem的有效地址EA(不需类型一致)LEA指令类似的地址操作符OFFSET的作用LEA指令在指令执行时计算出偏移地址OFFSET操作符在汇编阶段取得变量的偏移地址OFFSET无需在执行时计算、指令执行速度更快LEA指令能获取汇编阶段无法确定的偏移地址leaesi,varmov
edi,offsetvar106〔例3-2〕地址传送程序
;数据段dvar dd41424344h ;代码段
moveax,[dvar]
;EAX=41424344H
leaesi,dvar
;ESI指向DVAR
movebx,[esi]
;EBX=41424344H
movedi,offsetdvar
;EDI指向DVAR
movecx,[edi]
;ECX=41424344H
leaedx,[esi+edi*4+100h]
;EDX=ESI+EDI×4+100H1072.换码指令XLAT指令功能:AL←[EBX+AL]将EBX指定的缓冲区中AL指定的位移处的一个字节数据取出赋给AL换码指令执行前:在主存建立一个字节量表格,内含要目的代码表格首地址存放于EBXAL存放相对表格首地址的位移量换码指令执行后:将AL寄存器的内容转换为目标代码xlat108〔例3-3〕换码显示程序-1
;数据段num db6,7,7,8,3,0,0,0 ;被转换数字 countequ$-num ;count等于数字个数tab db'0123456789' ;代码表 ;代码段 movecx,count movesi,offsetnum movebx,offsettab ;EBX指向代码表again: moval,[esi] ;AL=要转换的数字
xlat ;换码
calldispc ;显示
addesi,1 ;指向下一个数字
loopagain ;循环使用XLAT指令109〔例3-3〕换码显示程序-2 ;代码段 movecx,count movesi,offsetnum movebx,offsettab ;EBX指向代码表again: moveax,0 ;EAX=0
moval,[esi] ;AL=要转换的数字
addeax,ebx ;EAX=EAX+EBX,指向对应的字符
moval,[eax] ;换码
calldispc ;显示
addesi,1 ;指向下一个数字
loopagain ;循环不使用XLAT指令110〔例3-3〕换码显示程序-3 ;代码段 movecx,count movesi,offsetnumagain: moveax,0 ;EAX=0
moval,[esi] ;AL=要转换的数字
moval,tab[eax] ;换码
calldispc ;显示
addesi,1 ;指向下一个数字
loopagain ;循环寄存器相对寻址67783000运行结果1113.标志传送指令直接操作标志寄存器标志位操作指令:直接改变CF、DF、IF标志指令功能CLC复位进位标志:CF←0STC置位进位标志:CF←1CMC求反进位标志:原为0变为1,原为1变为0CLD复位方向标志:DF←0,串操作后地址增大STD置位方向标志:DF←1,串操作后地址减小CLI复位中断标志:IF←0,禁止可屏蔽中断STI置位中断标志:IF←1,允许可屏蔽中断1123.2算术运算类指令算术运算对数据进行加减乘除基本的数据处理方法加减运算有“和”或“差”的结果外,还有进借位、溢出等状态标志,也是结果的一部分注意算术运算类指令对标志的影响掌握:加法和减法指令熟悉:乘法和除法指令理解:零位扩展和符号扩展+-*/+-×÷1133.2.1状态标志状态标志是处理器最基本的标志一方面:作为加减运算和逻辑运算的辅助结果另一方面:构成各种条件,实现程序分支8086的标志OF111512DF10IF9TF8SF7ZF605AF403PF211CF0114进位标志CF(CarryFlag)当加减运算结果的最高有效位有进位(加法)或借位(减法)时,进位标志置1,即CF=1;否则CF=0针对无符号整数,判断加减结果是否超出表达范围N个二进制位表达无符号整数的范围:0~2N-18位:0~+25516位:0~+6553532位:0~+232-1115进位标志CF:举例8位二进制数相加:
00111010+01111100=10110110十六进制表达:3A+7C=B6转换成十进制数:58+124=182没有产生进位:CF=08位二进制数相加:
10101010+01111100=[1]00100110十六进制表达:AA+7C=[1]26转换成十进制数:170+124=294=256+38产生进位:CF=10<182<255进位1表达256116溢出标志OF(OverflowFlag)有符号数加减结果有溢出,则OF=1;否则OF=0针对有符号整数,判断加减结果是否超出表达范围N个二进制位(补码)表达有符号整数的范围:-2N-1~2N-1-18位:-128~+12716位:-32768~+3276732位:-231~+231-1杯中水已满,再加就溢出!117溢出标志OF:举例8位二进制数相加:
00111010+01111100=10110110十六进制表达:3A+7C=B6转换成十进制数:58+124=182超出范围:OF=18位二进制数相加:
10101010+01111100=[1]00100110十六进制表达:AA+7C=[1]26转换成十进制数:-86+124=38没有超出范围:OF=0182>127补码AAH表达-86118进位和溢出的区别进位标志反映无符号整数运算结果是否超出范围有进位,加上进位或借位后运算结果仍然正确溢出标志反映有符号整数运算结果是否超出范围有溢出,运算结果已经不正确处理器按照无符号整数求得结果设置进位标志CF设置溢出标志OF程序员决定操作数是无符号数,关心进位操作数是有符号数,注意溢出119溢出标志的判断处理器硬件判断规则最高位和次高位同时有进位或同时无进位,无溢出;最高位和次高位进位状态不同,有溢出人工判断的简单规则只有当两个相同符号数相加(含两个不同符号数相减),而运算结果的符号与原数据符号相反时,产生溢出;其他情况下,不会产生溢出
00111010+01111100
10110110正数正数负数最高位次高位120零标志ZF(ZeroFlag)运算结果为0,则ZF=1,否则ZF=0结果是0,ZF标志不是0!举例8位二进制数相加:
00111010+01111100=10110110
结果不是0,ZF=08位二进制数相加:
10000100+01111100=[1]00000000
结果是0,ZF=1结果进位121符号标志SF(SignFlag)运算结果最高位为1,则SF=1;否则SF=0举例8位二进制数相加:
00111010+01111100=10110110
最高位=1:SF=18位二进制数相加:
10000100+01111100=[1]00000000
最高位=0:SF=0结果进位最高位=符号位=SF122奇偶标志PF(ParityFlag)当运算结果最低字节中“1”的个数为零或偶数时,PF=1;否则PF=0举例8位二进制数相加:
00111010+01111100=10110110
“1”的个数为5个:PF=08位二进制数相加:
10000100+01111100=[1]00000000
“1”的个数为0个:PF=1结果进位仅最低8位“1”的个数1233.2.2加法指令加法指令
ADD带进位加法指令
ADC增量指令INC除INC不影响进位标志CF外其他指令按定义影响全部状态标志位按照运算结果相应设置各个状态标志为0或为1数据传送类指令不影响(=不改变)状态标志加法和减法指令根据结果按定义改变状态标志1241.加法指令ADD目的操作数加上源操作数,和送到目的操作数
ADDreg,imm/reg/mem ;reg←reg+imm/reg/mem
ADDmem,imm/reg ;mem←mem+imm/reg按照定义影响6个状态标志位moveax,0aaff7348h ;EAX=AAFF7348Haddal,27h;EAX=AAFF736FH,OF=0,SF=0,ZF=0,PF=1,CF=0addax,3fffh;EAX=AAFFB36EH,OF=1,SF=1,ZF=0,PF=0,CF=0addeax,88000000h;EAX=32FFB36EH,OF=1,SF=0,ZF=0,PF=0,CF=11252.带进位加法指令ADC两个操作数相加,再加CF,结果送目的操作数ADCreg,imm/reg/mem ;reg←reg+imm/reg/mem+CFADCmem,imm/reg ;mem←mem+imm/reg+CF用于与ADD指令相结合实现多精度数的加法先将两个操作数的低32位相加(用ADD指令)再加高位部分、并将进位加到高位(用ADC指令)〔例3-4〕64位数据相加程序mov
eax,dword
ptr[qvar1] ;取低32位add
eax,dword
ptr[qvar2] ;加低32位,设置CFmov
edx,dword
ptr[qvar1+4] ;取高32位adc
edx,dword
ptr[qvar2+4] ;加高32位,同时加CF1263.增量指令INC只有一个操作数:寄存器或存储单元对操作数加1(增量)再将结果返回原处INCreg/mem
;加1:reg/mem←reg/mem+1用于计数器和地址指针的调整不影响进位CF标志,影响其他状态标志位例如incecxincdword
ptr[ebx]incword
ptr[wvar]1273.2.3减法指令减法指令SUB带借位减法指令SBB减量指令DEC求补指令
NEG比较指令CMP除DEC不影响CF标志外其他按定义影响全部状态标志位数据传送类指令不影响(=不改变)状态标志加法和减法指令根据结果按定义改变状态标志1281.减法指令SUB目的操作数减去源操作数,差送到目的操作数
SUBreg,imm/reg/mem ;reg←reg-imm/reg/mem
SUBmem,imm/reg ;mem←mem-imm/reg按照定义影响6个状态标志位
moveax,0aaff7348h
;EAX=AAFF7348H
subal,27h;EAX=AAFF7321H,OF=0,SF=0,ZF=0,PF=1,CF=0
subax,3fffh;EAX=AAFF3322H,OF=0,SF=0,ZF=0,PF=1,CF=0
subeax,0bb000000h;EAX=EFFF3322H,OF=0,SF=1,ZF=0,PF=1,CF=11292.带借位减法指令SBB目的操作数减去源操作数,再减CF,结果送目的操作数SBBreg,imm/reg/mem ;reg←reg-imm/reg/mem-CFSBBmem,imm/reg ;mem←mem-imm/reg-CF用于与SUB指令相结合实现多精度数的减法先将两个操作数的低32位相减(用SUB指令)然后减高位部分、并减去借位(用SBB指令)1303.减量指令DEC只有一个操作数:寄存器或存储单元对操作数减1(减量)再将结果返回原处
DECreg/mem
;减1:reg/mem←reg/mem-1用于计数器和地址指针的调整不影响进位CF标志,影响其他状态标志位例如dec
cxdecbyteptr[ebx]decwordptr[wvar]131〔例3-5〕大小写字母转换程序
;数据段msg byte'welcome',0 countequ$-msg ;count等于字符个数 ;代码段
mov
ecx,count-1 ;ECX等于字符串长度
movebx,0 ;EBX=0指向头一个字母again: submsg[ebx],'a'-'A' ;小写字母减20H转换为大写
incebx ;指向下一个字母
cmpebx,ecx ;指向下一个字母
jbeagain ;循环大写=小写-20H小写=大写+20H1324.求补指令NEG对操作数执行求补运算,即用零减去操作数
NEGreg/mem ;reg/mem←0-reg/mem对标志的影响与用零作减法的SUB指令一样可用于对负数求补码或由补码求其绝对值movax,0ff64hnegal
;AX=FF9CH,OF=0,SF=1,ZF=0,PF=1,CF=1subal,9dh ;AX=FFFFH,OF=0,SF=1,ZF=0,PF=1,CF=1negax
;AX=0001H,OF=0,SF=0,ZF=0,PF=0,CF=1decal
;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=1negax
;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=01335.比较指令CMP将目的操作数减去源操作数,差值不回送目的操作数,按照减法结果影响状态标志
CMPreg,imm/reg/mem ;reg-imm/reg/mem
CMPmem,imm/reg ;mem-imm/reg根据标志状态获知两个操作数的大小关系给条件转移等指令使用其形成的状态标志SUB与CMP?ADD与ADC?INC与DEC?SUB与SBB?ADD与SUB?ADC与SBB?DEC与NEG?1343.2.4乘法和除法指令IA-32处理器的乘法和除法指令比较特殊针对无符号数和有符号数有各自的指令有符号数指令前用I(sIgned)表示隐含使用EAX(和EDX)寄存器加减指令只进行无符号数运算利用CF和OF区别无符号数和有符号数1351.乘法指令无符号数乘法指令MUL有符号数乘法指令IMUL计算二进制数乘法:A5H×64H用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年海口货运从业资格证模拟考试答案大全
- 2025还未签订劳动合同时遇纠纷可找仲裁
- 2025金融租赁资金信托合同
- 2025年贵港a2货运从业资格证考试
- 上海视觉艺术学院《电分析化学》2023-2024学年第一学期期末试卷
- 上海师范大学天华学院《材料现代测试技术》2023-2024学年第一学期期末试卷
- 公司述职报告范文个人
- 课题申报书:供需匹配视角下数据要素协同优化的机制与路径研究
- 课题申报书:高职院校“双师型”教师专业发展的制度环境优化研究
- 课题申报书:辅导员对大学生高质量就业的作用机制发挥研究-基于就业观念塑造的视角
- 蓝色商务风汽车行业商业计划书模板
- 苏州大学《高等数学一》2022-2023学年第一学期期末试卷
- 运河镇江段航道疏浚工程环评资料环境影响
- 2024年心理咨询师考试题库【典型题】
- 第一单元知识提纲(填空版) -2024-2025学年统编版道德与法治七年级 上册
- 医疗机构纠纷处理
- 2023-2024学年上海中学高二(上)期末物理试卷含答案
- 智研咨询-2025年中国二手奢侈品行业市场全景调查、投资策略研究报告
- 预防性侵害预防安全教育课件
- 中学生常见病预防措施
- 2024年中国气体净化器市场调查研究报告
评论
0/150
提交评论