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

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

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

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

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

汇编语言复习资料天津大学王建荣

第一章基本概念

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

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

当前位置:首页 > 小学教育 > 数学

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

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