汇编语言复习资料天津大学王建荣Word下载.docx
- 文档编号:16777560
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:48
- 大小:182.27KB
汇编语言复习资料天津大学王建荣Word下载.docx
《汇编语言复习资料天津大学王建荣Word下载.docx》由会员分享,可在线阅读,更多相关《汇编语言复习资料天津大学王建荣Word下载.docx(48页珍藏版)》请在冰豆网上搜索。
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<
text>
在第一种格式中,表达式(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
movsxax,bl;
signextension
5.XCHG指令
指令交换两个操作数内容。
不接受立即操作数
除此之外,与MOV指令遵循同样规则。
var1WORD1000h
var2WORD2000h
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字节
练习题:
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
用例:
myWordWORD1000h
myDwordDWORD10000000h
incmyWord;
1001h
decmyWord;
1000h
incmyDword;
10000001h
movax,00FFh
incax;
AX=0100h
incal;
AX=0000h
myByteBYTE0FFh,0
moval,myByte;
AL=FFh
movah,[myByte+1];
AH=00h
decah;
AH=FFh
AL=00h
decax;
AX=FEFF
3.ADDandSUB指令
ADDdestination,source
Logic:
destinationdestination+source
SUBdestination,source
destinationdestination–source
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
valBBYTE-1
valWWORD+32767
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
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
CF=1,AL=FF
Overflowflag–setwhensignedvalueisoutofrange(溢出标志)
用于表示有符号数运算是否发生了溢出
moval,7Fh
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
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
CF=0OF=0
movax,0
subax,2;
CF=1OF=0
moval,-5
subal,+125;
14.数据相关的操作符和伪指令
1.OFFSET操作符:
返回数据标号的偏移地址
bValBYTE?
wValWORD?
dValDWORD?
dVal2DWORD?
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
写出目的操作数的值
varBBYTE65h,31h,02h,05h
varWWORD6543h,1202h
varDDWORD12345678h
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操作符:
返回按字节计算的变量的单个元素的大小。
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
64
30
16
6.LABEL伪指令
‧Assignsanalternatelabelnameandtypetoanexistingstoragelocation
‧LABELdoesnotallocateanystorageofitsown
‧RemovestheneedforthePTRoperator
dwListLABELDWORD
wordListLABELWORD
intListBYTE00h,10h,00h,20h
moveax,dwList;
20001000h
movcx,wordList;
movdl,intList;
00h
1.间接寻址
1间接操作数
(1)Anindirectoperandholdstheaddressofavariable,usuallyanarrayorstring.Itcanbedereferenced(justlikeapointer).
(2)UsePTRtoclarifythesizeattributeofamemoryoperand.
myCountWORD0
movesi,OFFSETmyCount
inc[esi];
ambiguous
incWORDPTR[esi];
ok
2.变址操作数:
把常量和寄存器相加以得到一个有效地址
有两种格式:
[label+reg]label[reg]
arrayWWORD1000h,2000h,3000h
movesi,0
movax,[arrayW+esi];
AX=1000h
movax,arrayW[esi];
alternateformat
addesi,2
addax,[arrayW+esi]
3.指针:
包含其他变量地址的变量
ptrWDWORDarrayW
movesi,ptrW
movax,[esi];
AX=1000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 复习资料 天津大学 王建荣