汇编语言复习资料天津大学王建荣 联系客服

发布时间 : 星期二 文章汇编语言复习资料天津大学王建荣更新完毕开始阅读8a0ddc7f27284b73f2425022

第一章 基本概念

1.二进制数

数据位从最右边的第0位开始计算,向左依次递增,最左边的位称为最高有

效位(MSB),最右边的位称为最低有效位(LSB)。 2.整数存储的尺寸

在基于IA-32体系结构的计算机中,所有数据存储单位都是字节(byte),每个

字节包含8个位,其他存储单位还有字(word,包含2个字节)、双字(doubleword,包含4个字节)和八字节(quadword,包含8个字节)。 3.补码表示法

二进制整数的补码是惊奇各位取反然后加1得到的,例如8位二进制数字00000001的补码是11111111,计算过程如下:

初始值 00000001 步骤1:将各位取反 11111110 步骤2:第一步的结果再加1 11111110

+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位 EAX AX AH AL EBX BX BH BL ECX CX CH CL EDX DX DH DL

其余的通用寄存器只有低16位有特别的名字,但是不能再进一步细分了。

32位 16位 ESI SI EDI DI EBP BP ESP SP

特殊用法:

1

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.内部数据类型

类型 用途

BYTE 8位无符号整数 SBYTE 8位有符号整数

WORD 16位无符号整数(也可在实地址模式下用做近指针)

SWORD 16位有符号整数

DWORD 32位无符号整数(也可在保护模式下用做近指针)

2

SDWORD 32位有符号整数

FWORD 48位整数(保护模式下的用做远指针) QWORD 64位整数

TBYTE 80位(10字节)整数

REAL4 32位(4字节)IEEE短实数 REAL8 64位(8字节)IEEE长实数

REAL10 80位(10字节)IEEE扩展精度实数 2.DUP操作符

DUP操作符使用一个常量表达式作为计数器为多个数据项分配存储空间。在为字符串和数组分配空间的时候,DUP伪指令就十分有用。初始化和未初始化数据均可使用DUP伪指令定义:

BYTE 20 DUP(0) ;20字节,全部等于0 BYTE 20 DUP(?) ;20字节,未初始化 BYTE 4 DUP(“STACK”) ;20字节节,”STACKSTACKSTACKSTACK” 3.计算数组和字符串的大小

我们可以让编译器自动为我们计算ListSize的值,MASM用$运算符(当前地址计数器)返回当前程序语句的地址偏移值。夏利中,当前地址值($)减掉list的地址偏移值就得到了ListSize值:

list BYTE 10,20,30,40 ListSize = ($ - list)

ListSize必须紧跟在list之后。

如果数组的每个元素都是16位的字,以字节计算的数组总长度必须除以2才能得到数组元素的个数:

list WORD 1000h,2000h,3000h,4000h ListSize = ($ - list) / 2

与此相似,双字数组的每个元素是4字节长的,因此数组的总长度必须除以4才能得到数组元素的个数:

list DWORD 10000000h,20000000h,30000000h,40000000h ListSize = ($ - list) / 4 4.EQU伪指令

EQU伪指令将符号名同整数表达式或任意文本联系起来,有以下三种形式:

name EQU expression name EQU symbol name EQU

在第一种格式中,表达式(expression)必须是有效的整数表达式;在第二种格式中,符号(symbol)必须是已用“=”或EQU定义的符号名;第三种格式中,尖括号内可以是任意文本,当汇编器在后面遇到已定义的“名字”(name)时,就用该名字代表的整数值或文本替代。

3

不允许重定义:与“=”伪指令不同,用EQU定义的符号不能在同一源代码文件中重定义,这个限制能够防止已存在的符号被无意中赋了新值。

5.TEXTEQU伪指令

TEXTEQU伪指令与EQU伪指令非常相似,也可用来创建文本宏(text macro)。它有三种不同的使用格式:第一种格式将文本赋给符号;第二种格式将已定义的文本宏内容赋给符号;第三种格式将整数表达式常量赋给符号。

name TEXTEQU name TEXTEQU textmacro name TEXTEQU %constExpr

与EQU伪指令不同的是,TEXTEQU可在程序中重定义。

第四章 数据传送、寻址和算术操作

一、数据传送指令

1.操作数类型:立即操作数、寄存器操作数、内存操作数

(详细见书P72) 操作数 r8 r16 r32 reg sreg r/m8 r/m16 r/m32 描述 8为通用寄存器:AH,AL,BH,BL,CH,CL,DH,DL 16位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BP 32位通用寄存器:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP 任意通用寄存器 16位段寄存器 8位操作数(可以是8位通用寄存器或内存字节) 16位操作数(可以是8位通用寄存器或内存字节) 32位操作数(可以是8位通用寄存器或内存字节) 2.MOV指令

从源操作数想目的操作数复制数据。指令运行后,目的操作数改变而源操作 数内容不变。

MOV destination, source

规则:两个操作数尺寸必须一样

两个操作数不能同时为内存操作数 目的操作数不能是CS, EIP,IP 立即数不能直接送至段寄存器 例题:解释一下MOV语句为什么无效? .data

bVal BYTE 100 bVal2 BYTE ? wVal WORD 2

4