汇编语言复习资料天津大学王建荣Word下载.docx

上传人:b****5 文档编号:16777560 上传时间:2022-11-26 格式:DOCX 页数:48 大小:182.27KB
下载 相关 举报
汇编语言复习资料天津大学王建荣Word下载.docx_第1页
第1页 / 共48页
汇编语言复习资料天津大学王建荣Word下载.docx_第2页
第2页 / 共48页
汇编语言复习资料天津大学王建荣Word下载.docx_第3页
第3页 / 共48页
汇编语言复习资料天津大学王建荣Word下载.docx_第4页
第4页 / 共48页
汇编语言复习资料天津大学王建荣Word下载.docx_第5页
第5页 / 共48页
点击查看更多>>
下载资源
资源描述

汇编语言复习资料天津大学王建荣Word下载.docx

《汇编语言复习资料天津大学王建荣Word下载.docx》由会员分享,可在线阅读,更多相关《汇编语言复习资料天津大学王建荣Word下载.docx(48页珍藏版)》请在冰豆网上搜索。

汇编语言复习资料天津大学王建荣Word下载.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1