汇编语言复习资料天津大学王建荣.docx
《汇编语言复习资料天津大学王建荣.docx》由会员分享,可在线阅读,更多相关《汇编语言复习资料天津大学王建荣.docx(48页珍藏版)》请在冰豆网上搜索。
![汇编语言复习资料天津大学王建荣.docx](https://file1.bdocx.com/fileroot1/2022-11/25/a190e085-9621-43e2-94ee-e205b4e0aeea/a190e085-9621-43e2-94ee-e205b4e0aeea1.gif)
汇编语言复习资料天津大学王建荣
第一章基本概念
1.二进制数
数据位从最右边的第0位开始计算,向左依次递增,最左边的位称为最高有
效位(MSB),最右边的位称为最低有效位(LSB)。
2.整数存储的尺寸
在基于IA-32体系结构的计算机中,所有数据存储单位都是字节(byte),每个
字节包含8个位,其他存储单位还有字(word,包含2个字节)、双字(doubleword,包含4个字节)和八字节(quadword,包含8个字节)。
3.补码表示法
二进制整数的补码是惊奇各位取反然后加1得到的,例如8位二进制数字00000001的补码是11111111,计算过程如下:
初始值00000001
步骤1:
将各位取反11111110
步骤2:
第一步的结果再加111111110
+00000001
和:
补码11111111
第二章IA-32处理器体系结构
寄存器
8个32位通用寄存器:
EAX,EBX,ECX,EDX,EBP,ESP,ESI,EDI,主要用于算术运算和数据的传送。
某些16位的寄存器能按8位值寻址使用。
利用,32位的EAX寄存器的低16位称为AX,AX寄存器的高8位称为AH,低8位称为AL。
32位16位高8位低8位
EAXAXAHAL
EBXBXBHBL
ECXCXCHCL
EDXDXDHDL
其余的通用寄存器只有低16位有特别的名字,但是不能再进一步细分了。
32位16位
ESISI
EDIDI
EBPBP
ESPSP
特殊用法:
EAX在乘法和除法指令中被自动使用。
通常称为扩展累加寄存器;在某些指令中,CPU自动使用ECX作为循环计数器;ESP寻址堆栈(一种系统内存结构)上的数据,极少用于普通的算术运算和数据传送,通常称之为扩展堆栈指针寄存器;ESI和EDI由高速内存数据传送指令使用,通常称为扩展源指针和扩展目的指针寄存器;高级语言使用EBP引用堆栈上的函数参数和局部变量,除非用于高级程序设计技巧中,EBP一般不应该用于普通算术运算和数据传送,通常称为扩展帧指针寄存器。
6个16位段寄存器:
CS,SS,DS,ES,FS,GS
实地址模式下,段寄存器用于存放段的基址,段是一块预分配的内存区域。
保护模式下,段寄存器存放段描述符表的指针(索引)。
有些段存放程序的指令(代码),有些则存放变量(数据),另外还有其他的段(名为堆栈段)存放着函数的局部变量和函数参数。
标志寄存器:
EFLAGS
EFLAGS(或Flags)寄存器由控制CPU的操作或反映CPU某些运算的结果的独立二进制位构成,有些机器指令可以测试和修改单个处理器标志。
进位标志(CF):
在无符号算术运算的结果太大而目的操作数无法容纳时置位。
溢出标志(OF):
在有符号算术运算的结果太大或太小而目的操作数无法容纳时置位。
符号标志(SF):
在算术或逻辑运算的结果为负时置位。
零标志(ZF):
在算术或逻辑运算的结果为零时置位。
辅助进位标志(AC):
在算术运算导致8位操作数的位3到位4产生进位时置位。
奇偶标志(PF):
结果的最低有效字节为1的位的数目为偶数时置位,否则PF复位。
通常PF标志位用于在数据有可能被改变或丢失的情况下进行错误检验。
指令指针寄存器:
EIP
EIP(或称为指令指针)寄存器存放下一条要执行的指令的地址。
有些机器指令可以修改EIP,使程序分支转移到新的地址执行。
第三章汇编语言基础
1.内部数据类型
类型用途
BYTE8位无符号整数
SBYTE8位有符号整数
WORD16位无符号整数(也可在实地址模式下用做近指针)
SWORD16位有符号整数
DWORD32位无符号整数(也可在保护模式下用做近指针)
SDWORD32位有符号整数
FWORD48位整数(保护模式下的用做远指针)
QWORD64位整数
TBYTE80位(10字节)整数
REAL432位(4字节)IEEE短实数
REAL864位(8字节)IEEE长实数
REAL1080位(10字节)IEEE扩展精度实数
2.DUP操作符
DUP操作符使用一个常量表达式作为计数器为多个数据项分配存储空间。
在为字符串和数组分配空间的时候,DUP伪指令就十分有用。
初始化和未初始化数据均可使用DUP伪指令定义:
BYTE20DUP(0);20字节,全部等于0
BYTE20DUP(?
);20字节,未初始化
BYTE4DUP(“STACK”);20字节节,”STACKSTACKSTACKSTACK”
3.计算数组和字符串的大小
我们可以让编译器自动为我们计算ListSize的值,MASM用$运算符(当前地址计数器)返回当前程序语句的地址偏移值。
夏利中,当前地址值($)减掉list的地址偏移值就得到了ListSize值:
listBYTE10,20,30,40
ListSize=($-list)
ListSize必须紧跟在list之后。
如果数组的每个元素都是16位的字,以字节计算的数组总长度必须除以2才能得到数组元素的个数:
listWORD1000h,2000h,3000h,4000h
ListSize=($-list)/2
与此相似,双字数组的每个元素是4字节长的,因此数组的总长度必须除以4才能得到数组元素的个数:
listDWORD10000000h,20000000h,30000000h,40000000h
ListSize=($-list)/4
4.EQU伪指令
EQU伪指令将符号名同整数表达式或任意文本联系起来,有以下三种形式:
nameEQUexpression
nameEQUsymbol
nameEQU
在第一种格式中,表达式(expression)必须是有效的整数表达式;在第二种格式中,符号(symbol)必须是已用“=”或EQU定义的符号名;第三种格式中,尖括号内可以是任意文本,当汇编器在后面遇到已定义的“名字”(name)时,就用该名字代表的整数值或文本替代。
不允许重定义:
与“=”伪指令不同,用EQU定义的符号不能在同一源代码文件中重定义,这个限制能够防止已存在的符号被无意中赋了新值。
5.TEXTEQU伪指令
TEXTEQU伪指令与EQU伪指令非常相似,也可用来创建文本宏(textmacro)。
它有三种不同的使用格式:
第一种格式将文本赋给符号;第二种格式将已定义的文本宏内容赋给符号;第三种格式将整数表达式常量赋给符号。
nameTEXTEQU
nameTEXTEQUtextmacro
nameTEXTEQU%constExpr
与EQU伪指令不同的是,TEXTEQU可在程序中重定义。
第四章数据传送、寻址和算术操作
一、数据传送指令
1.操作数类型:
立即操作数、寄存器操作数、内存操作数
操作数
描述
r8
8为通用寄存器:
AH,AL,BH,BL,CH,CL,DH,DL
r16
16位通用寄存器:
AX,BX,CX,DX,SI,DI,SP,BP
r32
32位通用寄存器:
EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP
reg
任意通用寄存器
sreg
16位段寄存器
r/m8
8位操作数(可以是8位通用寄存器或内存字节)
r/m16
16位操作数(可以是8位通用寄存器或内存字节)
r/m32
32位操作数(可以是8位通用寄存器或内存字节)
(详细见书P72)
2.MOV指令
从源操作数想目的操作数复制数据。
指令运行后,目的操作数改变而源操作数内容不变。
MOVdestination,source
规则:
两个操作数尺寸必须一样
两个操作数不能同时为内存操作数
目的操作数不能是CS,EIP,IP
立即数不能直接送至段寄存器
例题:
解释一下MOV语句为什么无效?
.data
bValBYTE100
bVal2BYTE?
wValWORD2
dValDWORD5
.code
movds,45;immediatemovetoDSnotpermitted
movesi,wVal;sizemismatch
moveip,dVal;EIPcannotbethedestination
mov25,bVal;immediatevaluecannotbedestination
movbVal2,bVal;memory-to-memorymovenotpermitted
3.MOVZX指令(movewithzero-extend,零扩展传送)
指令将源操作数的内容复制到目的操作数中,并将该值零扩展至16位或32位。
该指令只适用于无符号数。
三种格式:
Movzxr32,r/m8Movzxr32,r/m16Movzxr16,r/m8
用例:
movbl,10001111b
movzxax,bl;zero-extension
4.MOVSX指令(movewithsign-extend,符号扩展传送)
指令将源操作数的内容复制到目的操作数中,并将该值符号扩展至16位或32位。
该指令只适用于有符号数。
三种格式:
Movsxr32,r/m8Movsxr32,r/m16Movsxr16,r/m8
用例:
movbl,10001111b
movsxax,bl;signextension
5.XCHG指令
指令交换两个操作数内容。
规则:
不接受立即操作数
除此之外,与MOV指令遵循同样规则。
用例:
.data
var1WORD1000h
var2WORD2000h
.code
xchgax,bx;exchange16-bitregs
xchgah,al;exchange8-bitregs
xchgvar1,bx;exchangemem,reg
xchgeax,ebx;exchange32-bitregs
xchgvar1,var2;error:
twomemoryoperands
6.直接偏移操作数
在变量名称后加上一个偏移值,可以创建直接偏移(direct-offset)操作数,可以通过它访问没有显示标号的内存地址。
字节数组,字数组,双字数组的第二个元素与第一个元素的偏移相距分别为1,2,4字节
练习题:
.data
var1SBYTE-4,-2,3,1
var2WORD1000h,2000h,3000h,4000h
var3SWORD-16,-42
var4DWORD1,2,3,4,5
下列每条指令安顺序执行后,目的操作数的值是什么?
movax,var2;1000h
movax,[var+4];3000h
movax,var3;FFF0h
movax,[var3-2];4000h
movedx,var4;00000001h
movedx,var2;00001000h
movedx,[var4+4];00000002h
movedx,var1;FFFFFFFCh
二、加法和减法
1、INC和DEC指令
Add1,subtract1fromdestinationoperand,operandmayberegisterormemory
INCLogic:
destinationdestination+1
DECLogic:
destinationdestination–1
格式:
INCreg/mem
DECreg/mem
用例:
.data
myWordWORD1000h
myDwordDWORD10000000h
.code
incmyWord;1001h
decmyWord;1000h
incmyDword;10000001h
movax,00FFh
incax;AX=0100h
movax,00FFh
incal;AX=0000h
练习题:
.data
myByteBYTE0FFh,0
.code
moval,myByte;AL=FFh
movah,[myByte+1];AH=00h
decah;AH=FFh
incal;AL=00h
decax;AX=FEFF
3.ADDandSUB指令
ADDdestination,source
Logic:
destinationdestination+source
SUBdestination,source
Logic:
destinationdestination–source
用例:
.data
var1DWORD10000h
var2DWORD20000h
.code;---EAX---
moveax,var1;00010000h
addeax,var2;00030000h
addax,0FFFFh;0003FFFFh
addeax,1;00040000h
subax,1;0004FFFFh
4.NEG指令
Reversesthesignofanoperand.Operandcanbearegisterormemoryoperand.
格式:
NEGreg
NEGmem
用例:
.data
valBBYTE-1
valWWORD+32767
.code
moval,valB;AL=-1
negal;AL=+1
negvalW;valW=-32767
5.标志位的影响
‧TheMOVinstructionneveraffectstheflags.
‧加法减法影响的几个标志位:
Zeroflag–setwhendestinationequalszero(零标志)
‧Aflagissetwhenitequals1.
‧Aflagisclearwhenitequals0.
例子:
movcx,1
subcx,1;CX=0,ZF=1
movax,0FFFFh
incax;AX=0,ZF=1
incax;AX=1,ZF=0
Signflag–setwhendestinationisnegative(符号标志)
Thesignflagisacopyofthedestination'shighestbit:
例子:
subal,1;AL=11111111b,SF=1
addal,2;AL=00000001b,SF=0
Carryflag–setwhenunsignedvalueisoutofrange(进位标志)
用于表示无符号整数运算是否发生溢出。
例子:
moval,0FFh
addal,1;CF=1,AL=00
;Trytogobelowzero:
moval,0
subal,1;CF=1,AL=FF
Overflowflag–setwhensignedvalueisoutofrange(溢出标志)
用于表示有符号数运算是否发生了溢出
例子:
moval,7Fh
addal,1;OF=1,AL=80h
**判断溢出标志的几个重要结论:
*1.符号相同的两个数相加后,和的符号和原数符号相反,则一定发生了溢出。
*2.异号的俩数相减,结果的符号和减数相同,则一定发生了溢出。
(正-负=负or负-正=正一定发生了溢出)
3.两个加数的符号不同的时候,永远不会发生溢出。
练习:
1.showthevaluesofthedestinationoperandandtheSign,Zero,andCarryflags
movax,00FFh
addax,1;AX=0100hSF=0ZF=0CF=0
subax,1;AX=00FFhSF=0ZF=0CF=0
addal,1;AL=00hSF=0ZF=1CF=1
movbh,6Ch
addbh,95h;BH=01hSF=0ZF=0CF=1
moval,2
subal,3;AL=FFhSF=0ZF=0CF=1
2.
moval,80h
addal,92h;OF=1
moval,-2
addal,+127;OF=0
movax,7FF0h
addal,10h;CF=1SF=0ZF=1OF=0
addah,1;CF=0SF=1ZF=0OF=1
addax,2;CF=0SF=1ZF=0OF=1
4.moval,-128
negal;CF=1OF=1
movax,8000h
addax,2;CF=0OF=0
movax,0
subax,2;CF=1OF=0
moval,-5
subal,+125;OF=1
14.数据相关的操作符和伪指令
1.OFFSET操作符:
返回数据标号的偏移地址
用例:
.data
bValBYTE?
wValWORD?
dValDWORD?
dVal2DWORD?
.code
movesi,OFFSETbVal;ESI=00404000
movesi,OFFSETwVal;ESI=00404001
movesi,OFFSETdVal;ESI=00404003
movesi,OFFSETdVal2;ESI=00404007
2.PTR操作符:
可以重载操作数声明的默认尺寸,在试图以不同于变量声明时所使用的尺寸属性来访问变量时非常有用。
*PTR必须和汇编器的标准数据类型联合使用:
BYTE,SBYTE,WORD,SWORD,DWORD,SDWORD,FWORD,QWORD,TBYTE
练习:
写出目的操作数的值
.data
varBBYTE65h,31h,02h,05h
varWWORD6543h,1202h
varDDWORD12345678h
.code
movax,WORDPTR[varB+2];a.0502h
movbl,BYTEPTRvarD;b.78h
movbl,BYTEPTR[varW+2];c.02h
movax,WORDPTR[varD+2];d.1234h
moveax,DWORDPTRvarW;e.12026543h
3.TYPE操作符:
返回按字节计算的变量的单个元素的大小。
.data
var1BYTE?
var2WORD?
var3DWORD?
var4QWORD?
对应的每个TYPE表达式的值
表达式
值
TYPEvar1
1
TYPEvar2
2
TYPEvar3
3
TYPEvar4
4
4、LENGTHOF操作符:
计算数组中元素的数目
.data;LENGTHOF表达式的返回值
byte1BYTE10,20,30;3
array1WORD30DUP(?
),0,0;30+2
array2WORD5DUP(3DUP(?
));5*3
array3DWORD1,2,3,4;4
digitStrBYTE"12345678",0;9
*注意:
数组的定义中使用嵌套DUP定义时,LENGTHOF将返回两个计数器的乘积
5、SIZEOF操作符:
返回值等于LENGTHOF和TYPE返回值的乘积
例子
.dataSIZEOF
byte1BYTE10,20,30;3
array1WORD30DUP(?
),0,0;64
array2WORD5DUP(3DUP(?
));30
array3DWORD1,2,3,4;16
digitStrBYTE"12345678",0;9
6.LABEL伪指令
‧Assignsanalternatelabelnameandtypetoanexistingstoragelocation
‧LABELdoesnotallocateanystorageofitsown
‧RemovestheneedforthePTRoperator
用例:
.data
dwListLABELDWORD
wordListLABELWORD
intListBYTE00h,10h,00h,20h
.code
moveax,dwList;20001000h
movcx,wordList;1000h
movdl,intList;00h
1.间接寻址
1间接操作数
(1)Anindirectoperandholdstheaddressofavariable,usuallyanarrayorstring.Itcanbedereferenced(justlikeapointer).
(2)UsePTRtoclarifythesizeattributeofamemoryoperand.
用例:
.data
myCountWORD0
.code
movesi,OFFSETmyCount
inc[esi];error:
ambiguous
incWORDPTR[esi];ok
2.变址操作数:
把常量和寄存器相加以得到一个有效地址
有两种格式:
[label+reg]label[reg]
用例:
.data
arrayWWORD1000h,2000h,3000h
.code
movesi,0
movax,[arrayW+esi];AX=1000h
movax,arrayW[esi];alternateformat
addesi,2
addax,[arrayW+esi]
3.指针:
包含其他变量地址的变量
用例:
.data
arrayWWORD1000h,2000h,3000h
ptrWDWORDarrayW
.code
movesi,ptrW
movax,[esi];AX=1000