32位汇编语言程序设计 第3版 课件全套 钱晓捷 第1-9章 汇编语言基础-浮点、多媒体及64位指令_第1页
32位汇编语言程序设计 第3版 课件全套 钱晓捷 第1-9章 汇编语言基础-浮点、多媒体及64位指令_第2页
32位汇编语言程序设计 第3版 课件全套 钱晓捷 第1-9章 汇编语言基础-浮点、多媒体及64位指令_第3页
32位汇编语言程序设计 第3版 课件全套 钱晓捷 第1-9章 汇编语言基础-浮点、多媒体及64位指令_第4页
32位汇编语言程序设计 第3版 课件全套 钱晓捷 第1-9章 汇编语言基础-浮点、多媒体及64位指令_第5页
已阅读5页,还剩550页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

32位汇编语言程序设计2主教材 高等院校精品课程系列教材32位汇编语言程序设计·第3版

钱晓捷主编,穆玲玲、张行进

参编机械工业出版社

3教学内容第1章汇编语言基础 4第2章数据表示和寻址 6第3章通用数据处理指令 8第4章程序结构 10第5章模块化程序设计 8第6章Windows编程 6第7章与VisualC++的混合编程 4第8章DOS环境的程序设计 4第9章浮点、多媒体及64位指令 1第1章汇编语言基础1.1英特尔80x86处理器1.2个人计算机系统1.3汇编语言程序格式第1章汇编语言基础了解软硬件开发环境熟悉通用寄存器和存储器组织掌握汇编语言的 语句格式、程序框架和开发方法6Intel80861.1英特尔80x86处理器8038680486奔腾奔腾II奔腾4802868086奔腾III酷睿多核系列4004IA-32处理器16位80x86处理器奔腾多核系列Intel64处理器71.1.116位80x86处理器16位结构处理器8086/8088指令系统提供16位基本指令集80186/80188增加若干条实用指令8086的工作方式是实方式(RealMode)80286增加保护方式(ProtectedMode)80286引入了系统指令为操作系统等核心程序提供处理器控制功能指令系统、指令集(InstructionSet)81.1.2IA-32处理器80386引入英特尔32位指令集结构ISA兼容原16位80286指令系统全面升级为32位提供虚拟8086工作方式(Virtual8086Mode)80486集成浮点处理单元支持浮点指令Pentium系列陆续增加若干整数指令、完善浮点指令增加一系列多媒体指令(SIMD指令)IA-32(IntelArchitecture-32)91.1.3Intel64处理器引入64位英特尔指令集结构兼容32位指令系统新增64位工作方式继续丰富多媒体指令处理器集成多核(Multi-core)技术处理器进入64位多核时代Manycore101.2个人计算机系统硬件(Hardware):物理设备软件(Software):程序和文档运算器

控制器寄存器组

主存储器总线输入输出接口电路外部设备软件微处理器微型计算机微型计算机系统111.2.1硬件组成I/O接口主存储器系统总线CPU寄存器控制器运算器辅助存储器输入设备输出设备汇编语言程序员将硬件抽象为:寄存器、存储器地址和输入输出地址121.2.2寄存器(Register)处理器内部的高速存储单元用于暂时存放程序执行过程中的代码和数据透明寄存器对应用人员不可见、不能编程直接控制可编程(Programmable)寄存器具有引用名称、供编程使用通用寄存器(General-PurposeRegister)具有多种用途数量较多、使用频度较高专用寄存器各自只用于特定目的13IA-32常用寄存器8个32位通用寄存器6个16位段寄存器1个32位标志寄存器1个32位指令指针141.通用寄存器处理器最常使用的整数通用寄存器可用于保存整数数据、地址等8个32位通用寄存器EAX,EBX,ECX,EDXESI,EDI,EBP,ESP8个16位通用寄存器AX,BX,CX,DXSI,DI,BP,SP8个8位通用寄存器AH,BH,CH,DHAL,BL,CL,DL31871615AHAL0AXEAX既是一个整体又可独立使用15通用寄存器的名称EAXAccumulator累加器EBXBase基址寄存器ECXCounter计数器EDXData数据寄存器ESISourceIndex源变址寄存器EDIDestinationIndex目的变址寄存器EBPBasePointer基址指针ESPStackPointer堆栈指针162.标志寄存器标志(Flag)反映指令执行结果或控制指令执行形式用一个或多个二进制位表示一种标志用0和1的不同组合表达标志的不同状态8086支持16位标志寄存器FLAGSIA-32处理器形成32位EFLAGS标志寄存器状态标志:记录指令执行结果的辅助信息控制标志:方向标志DF,仅用于串操作指令系统标志:控制操作系统或核心管理程序的操作方式示意图17标志寄存器EFLAGS返回18处理器最基本的标志:状态标志用来记录指令执行结果的辅助信息加减运算和逻辑运算指令主要设置它们其他有些指令的执行也会相应地设置它们处理器主要使用其中5个构成各种条件,分支指令判断这些条件实现程序分支8086的标志OF111512DF10IF9TF8SF7ZF605AF403PF211CF0193.指令指针寄存器EIP保存将要执行的指令在主存的存储器地址EIP是专用寄存器顺序执行时自动增量(加上该指令的字节数),指向下一条指令分支、调用等操作时执行控制转移指令修改,引起程序转移到指定的指令执行出现中断或异常时被处理器赋值而相应改变311615IP0EIP204.段寄存器段(Segment)是用于安排相关代码或数据的一个主存区域段寄存器表明某个段在主存中的位置6个16位段寄存器:CSDSSSESFSGS应用程序主要涉及3类段代码段(CodeSegment) 存放程序中指令代码数据段(DataSegment) 存放当前运行程序所用数据堆栈段(StackSegment) 指明程序使用的堆栈区域主存空间指令段数据段堆栈段程序211.2.3存储器组织主存储器容量很大,被划分成许多存储单元每个存储单元被编排一个号码即存储单元地址称为存储器地址(MemoryAddress)每个存储单元以字节为基本存储单位即字节编址(ByteAddressable)一个字节(Byte)等于8个二进制位(Bit)二进制位是计算机存储信息的最小单位16位(2个字节)构成一个字(Word)32位(4个字节)构成一个双字(DoubleWord)示意图22数据的位格式返回D7D6D5D4D3D2D1D0字节LSBMSBD15……D1D0字LSBMSBD31……D1D0双字LSBMSB31871615高字节低字节0字双字231.存储模型物理存储器以字节为基本存储单位每个存储单元被分配一个唯一的地址这个地址就是物理地址物理地址空间从0开始顺序编排,直到处理器支持的最大存储单元8086处理器支持1MB存储器:00000H~FFFFFHIA-32处理器支持4GB存储器:00000000H~FFFFFFFFH操作系统利用存储管理单元进行存储管理,程序不直接寻址物理存储器IA-32处理器提供3种存储模型,用于程序访问存储器示意图24存储器地址空间返回FFFFFFFFH00000000H00000001H00000002H00000003H00000004H双字字节字字节字节字字节25IA-32处理器的存储模型(1)平展存储模型(FlatMemoryModel)存储器是一个连续的地址空间:线性地址空间IA-32处理器支持4GB容量线性地址空间(2)段式存储模型(SegmentedMemoryModel)存储器由一组独立的地址空间:段(Segment)每个段都可以达到4GB容量在处理器内部,所有的段都被映射到线性地址空间(3)实地址存储模型(Real-addressMemoryModel)8086处理器的存储模型段式存储模型的特例线性地址空间最大为1MB容量,段最大为64KB262.工作方式(1)保护方式(ProtectedMode)IA-32处理器固有的工作状态具有强大的段页式存储管理和特权与保护能力使用全部32条地址总线,可寻址4GB物理存储器使用平展或段式存储模型利用虚拟8086方式支持实地址8086软件(2)实地址方式(Real-addressMode)可以进行32位处理的快速8086只能寻址1MB物理存储器空间,每个段不超过64KB可以使用32位寄存器、32位操作数和32位寻址方式只能支持实地址存储模型(3)系统管理方式(SystemManagementMode)实现供节能和系统安全管理273.逻辑地址(LogicalAddress)在处理器内部、程序员编程时采用的地址逻辑地址=段基地址∶偏移地址段基地址=在主存中的起始地址偏移地址=距离段基地址的位移量某个存储单元可以有多个逻辑地址,但只有一个唯一的物理地址逻辑地址线性地址物理地址编程使用处理器转换地址总线输出示意图28逻辑地址与物理地址返回108208308106206306107207307109209309110105104103102101210205204203202201310305304303302301081828061626071727091929100504030201201514131211302524232221逻辑地址=相对地址:205(2层05号房间)物理地址=绝对地址:15(第15号房间)29基本段的逻辑地址代码段(CodeSegment)段基地址:代码段寄存器CS指示偏移地址:指令指针寄存器EIP保存数据段(DataSegment)段基地址:数据段寄存器DS指示有时也用附加段寄存器ES,段寄存器FS和GS指示偏移地址:各种存储器寻址方式计算出来堆栈段(StackSegment)段基地址:堆栈段寄存器SS指示偏移地址:堆栈指针寄存器ESP保存主存空间指令段数据段堆栈段程序304.段选择器16位段寄存器保存16位段选择器段选择器指向64位段描述符(Descriptor)段描述符包括段基地址平展存储模型:指向地址0位置段式存储模型:指向线性地址空间不同的段实地址存储模型:保存段基地址的高16位段选择器段基地址数据或指令段寄存器段描述符主存空间315.Win32的虚拟地址分配应用程序起始地址321.2.4程序设计语言机器语言(MachineLanguage)底层的计算机语言,对应机器指令形成目标(代码)程序汇编语言(AssemblyLanguage)将机器指令用助记符号代替而形成的一种语言本质上是机器语言需要汇编程序“汇编”(翻译)高级语言(HighLevelLanguage)面向问题的程序设计语言需要“编译”或“解释”后执行指令是处理器的母语moveax,100addeax,25633Instructions:LanguageoftheMachine

Tocommandacomputer'shardware,youmustspeakitslanguage.Thewordsofamachine'slanguagearecalledinstructions,anditsvocabularyiscalledaninstructionset.

为了控制计算机硬件,必须使用它的语言。机器语言的单词称为指令,它的词汇表称为指令集。“ComputerOrganization&Design --TheHardware/SoftwareInterface(2ndEdition)”byJohnL.HennessyandDavidA.PattersonMorganKaufmannPublishers,Inc.1998返回34汇编语言和高级语言的比较汇编语言与处理器密切相关,可移植性较差高级语言与具体计算机无关,便于移植汇编语言功能有限、涉及硬件细节,编写繁琐困难高级语言功能强大,语法自然,容易掌握和应用汇编语言的优势:直接、有效地控制硬件,容易产生运行速度快、指令序列短小的高效率目标程序高级语言不易直接控制计算机的各种操作,编译程序产生的目标程序往往比较庞大混合编程、取长补短?学习汇编语言的意义35汇编语言的主要应用场合程序要具有较快的执行时间,或者只能占用较小的存储容量程序与计算机硬件密切相关,程序要直接、有效地控制硬件大型软件需要提高性能、优化处理的部分没有合适的高级语言、或只能采用汇编语言的时候分析具体系统尤其是该系统的低层软件、加密解密软件、分析和防治计算机病毒等等361.2.5软件系统Windows操作系统平台MASM6.15(及NASM2.16)汇编程序硬件BIOS应用程序*.ASM,*.OBJ*.LST,*.EXE操作系统编辑程序,汇编程序连接程序,调试程序371.操作系统(OperatingSystem)操作系统管理着系统的软硬件资源为用户提供使用机器的交互界面为程序员使用资源提供可供调用的驱动程序为其他程序构建稳定的运行平台32位控制台环境%SystemRoot%\system32\cmd.exe16位模拟DOS环境%SystemRoot%\system32\32位控制台环境和16位模拟DOS环境两种基本功能和界面一致,但本质不同382.汇编程序(Assembler)将汇编语言源程序转换为机器代码微软宏汇编程序MASMMASM6.11是最后一个独立发行的MASM软件包MASM6.15来自VisualC++6.0,支持到Pentium4的SSE2指令系统VisualC++.NET2005提供支持SSE3指令的MASM8.0支持64位指令的ML64.EXE程序汇编语言程序与汇编程序是两个不同的概念393.文件路径目录(Directory):管理磁盘上文件的文件夹路径(Path):分区:\根目录\子目录\文件名绝对路径:文件的完整路径d:\masm\progs\eg0101.asm相对路径:相对当前目录的路径progs\eg0101.asm..\bin\ml.exe转换分区d:进入当前目录(CurrentDirectory)cd\masm404.内部命令和外部命令内部命令:32位控制台或DOS环境本身具有的、直接支持的命令,即驻留主存的命令使用方法:命令关键字参数选项外部命令:与其他可执行文件一样,以文件形式保存在磁盘上的命令执行方法:路径\文件名参数路径搜索顺序先当前目录后搜索路径内部命令PATH查看和设置当前的搜索路径你所执行的命令不是内部或外部命令,也不是可运行的程序或批处理文件?415.进入MASM目录的批处理文件为便于进入MASM目录,可创建批处理文件32位Windows控制台:WIN32.BAT

16位DOS环境:DOS16.BAT为便于访问其中文件,增加搜索路径:@setPATH=D:\MASM;D:\MASM\BIN;%PATH%在Windows资源管理器打开文件夹“D:\MASM”,双击该批处理文件,就可以进入MASM环境42具有搜索路径的批处理文件返回@echooff@setPATH=D:\MASM;D:\MASM\BIN;%PATH%%SystemRoot%\system32\cmd.exe@echoonWIN32.BAT@echooff@setPATH=D:\MASM;D:\MASM\BIN;%PATH%%SystemRoot%\system32\@echoonDOS16.BAT431.3汇编语言程序格式程序用程序设计语言编写,由指令构成指令由操作码和操作数(地址码)组成操作码(Opcode)表明处理器执行的操作例如数据传送、加法运算、跳转等操作。操作数(Operand)是参与操作的数据对象主要以寄存器名或地址形式指明数据的来源通常的指令都有一个或两个操作数有些指令无操作数,个别指令有3或4个操作数多数操作数需要显式指明,有些操作数隐含使用441.3.1指令的代码格式(InstructionFormat)IA-32处理器采用可变长度指令格式操作码可选的指令前缀(用于扩展指令功能)1~3字节的主要操作码操作数可选的寻址方式域(包括ModR/M和SIB字段)可选的位移量可选的立即数45使用最多、最基本的数据传送指令传送指令的助记符:MOV(取自Move)将数据从一个位置传送到另一个位置类似高级语言的赋值语句

mov

dest,src;源操作数src:被传送的数据或数据所在的位置;目的操作数dest:数据将要传送到的位置mov

eax,ebx ;机器代码:8BC3mov

eax,[ebx] ;机器代码:8B03mov

eax,[ebx+esi*4+80h] ;机器代码:8B84B3800000

00功能演示46传送指令MOV的功能演示返回源操作数src目的操作数dest30H30H被传送的数据471.3.2语句格式源程序由语句组成一个语句常占一行(MASM有续行符“\”)一个语句不超过132个字符,4个部分执行性语句:表达处理器指令(硬指令)标号:硬指令助记符

操作数,操作数 ;注释说明性语句:表达伪指令,控制汇编方式名字

伪指令助记符

参数,参数,……;注释这是MASM语法,但具有一般性481.标号与名字标号:执行性语句中冒号分隔表示处理器指令在主存中的逻辑地址指示分支、循环等程序的目的地址名字:说明性语句中空格或制表符分隔变量名、段名、子程序名等反映变量、段和子程序等的逻辑地址标号和名字是用户自定义的标识符49标识符(Identifier)最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头一个源程序中,用户定义的每个标识符必须唯一不能是汇编程序采用的保留字保留字(ReservedWord)是编程语言本身需要使用的各种具有特定含义的标识符、也称为关键字硬指令助记符:MOV伪指令助记符:BYTE操作符:OFFSET寄存器名:EAX取名原则类似高级语言MASM默认不区别大小写字母502.助记符助记符是帮助记忆指令功能的符号硬指令助记符表示处理器指令伪指令助记符表达一个汇编命令处理器指令示例:传送指令MOV伪指令示例:字节变量定义助记符:

DB(或BYTE)功能:在主存中占用若干的存储空间,用于保存变量值,该变量以字节为单位存取msg

db

'Hello,Assembly!',13,10,0513.操作数和参数处理器指令的操作数:表示参与操作的对象具体的常量保存在寄存器的数据保存在存储器中的变量逗号前常是目的操作数,逗号后常是源操作数伪指令的参数:常量、变量名、表达式等可以有多个,参数之间用逗号分隔msgdb

'Hello,Assembly!',13,10,0mov

eax,offset

msg524.注释和分隔符语句中分号后的内容是注释对指令或程序进行说明汇编程序不对它们做任何处理注释利于阅读,应养成书写注释的好习惯语句的4个组成部分要用分隔符分开标号后的冒号注释前的分号操作数间和参数间的逗号分隔其他部分采用一个或多个空格或制表符注释使用英文或中文均可分隔符都是英文标点良好的语句格式有利于编程531.3.3源程序框架;eg0000.asminWindowsConsole includeio32.inc ;包含32位输入输出文件

.data ;定义数据段

…… ;数据定义(数据待填)

.code ;定义代码段start: ;程序执行起始位置

…… ;主程序(指令待填)

exit0 ;程序正常执行结束

…… ;子程序(指令待填)

endstart ;汇编结束541.包含伪指令INCLUDE将常用的常量定义、过程说明、共享的子程序库等内容进行声明(相当于C和C++语言中,包含头文件的作用)IO32.INC是配合本书的包含文件前3个语句:.686 ;32位指令.modelflat,stdcall ;选择平展模型,标准调用规范

optioncasemap:none ;告知MASM区分用户定义标识符的大小写552.段的简化定义数据段定义伪指令.DATA创建一个数据段定义可读可写的变量等代码段定义伪指令.CODE创建一个代码段保存需要执行的可执行性语句堆栈段定义伪指令.STACK创建一个堆栈段堆栈段由Windows维护,用户可不必设置主存空间指令段数据段堆栈段程序563.程序的开始和结束程序开始执行的位置应用一个标号(例如:START)汇编结束END指令的参数应用程序执行结束语句“EXIT0”将控制权交还操作系统提供给操作系统一个返回代码通常用0表示执行正确源程序汇编结束END语句执行结束

≠汇编结束moveax,0ret57〔例1-1〕信息显示程序(使用输入输出子程序)在数据段给出这个字符串形式的信息:

;数据段msg db'Hello,Assembly!',13,10,0 ;定义要显示的字符串在代码段编写显示字符串的程序:

;代码段

mov

eax,offset

msg ;指定字符串的偏移地址

calldispmsg ;调用I/O子程序显示信息完整程序58汇编语言源程序EG0101.ASM;eg0101.asm

includeio32.inc

.data ;数据段msg db'Hello,Assembly!',13,10,0

.code ;代码段start: ;程序执行起始位置

mov

eax,offset

msg calldispmsg

exit0 ;程序正常执行结束

endstart ;汇编结束返回Hello,Assembly!运行结果对比59信息显示的C语言源程序#include<stdio.h>intmain(){

printf("Hello,world!\n"); exit(0);}返回Hello,world!运行结果604.输入输出子程序库汇编程序通常不提供任何函数或程序库必须利用操作系统的编程资源本书配套键盘输入和显示器输出的I/O子程序含IO32.INC和IO32.LIB,需要包含文件声明源程序文件开始使用包含命令声明INCLUDEIO32.INC子程序调用方法MOVEAX,入口参数CALL子程序名子程序名DISPMSG入口参数EAX=字符串地址功能说明显示字符串(以0结尾)输入子程序输出子程序61常用输出子程序返回子程序名功能说明DISPMSG显示字符串(以0结尾)DISPC显示一个字符DISPCRLF光标回车换行,到下一行首个位置DISPRD显示8个32位通用寄存器内容DISPRF显示6个状态标志的状态DISPHD以十六进制形式显示8位数据DISPUID显示无符号十进制整数DISPSID显示有符号十进制整数62常用输入子程序返回子程序名功能说明READMSG输入一个字符串(回车结束)READC输入一个字符(回显)READHD输入8位十六进制数据READUID输入无符号十进制整数(≤232-1)READSID输入有符号十进制整数(-231~231-1)635.C语言标准函数开发时需要使用导入库MSVCRT.LIB,MASM需要声明 externprintf:near,scanf:near汇编语言调用C语言函数的方法 push参数1 ;压入参数1 push参数2 ;压入参数2 … call函数名 ;调用C语言函数,返回值在EAX寄存器 addesp,4*参数个数 ;调整堆栈空间、保持堆栈平衡格式化输出intprintf(constchar*,…);格式化输入intscanf(char*,…);64〔例1-2〕信息显示程序(调用C语言函数);eg0102.asm

includeio32.inc externprintf:near

.data ;数据段msg db'Hello,Assembly!',13,10,0

.code ;代码段start: ;程序执行起始位置

push

offset

msg callprintf addesp,4

exit0 ;程序正常执行结束

endstart ;汇编结束Hello,Assembly!运行结果651.3.4开发过程661.开发软件抽取MASM6.11和VisualC++6.0集成开发环境中有关文件构造基本开发软件包MASM主目录:I/O库、包含文件及批处理文件BIN子目录:进行汇编、连接及配套程序文件默认安装到D分区的MASM目录快速开发方法

①进入MASM目录双击批处理文件WIN32.BAT

②生成可执行文件MAKE32eg0101快速开发过程67快速开发过程返回感性认识因直观而印象深刻682.源程序的编辑源程序文件是无格式文件、纯文本类型以ASM为扩展名,可使用任何文本编辑器Windows的记事本Notepad其他程序开发工具中的编辑环境专注于源程序编写的编辑软件本书配套开发软件MASM主目录提供Notepad2.exe程序本书源程序文件的命名规则EG=例题,EX=习题

前2位数字=章号,后2位数字=序号693.源程序的汇编生成目标模块文件(.OBJ)MASM6.x的汇编程序是ML.EXE

BIN\ML/c/coffeg0101.asm参数“/c”(小写字母)实现源程序的汇编参数“/coff”(小写字母)表示生成COFF格式的目标模块文件温馨提示:将源文件放在MASM目录温馨提示:ML.EXE的参数区别大小写704.目标文件的连接把一个或多个目标文件和库文件合成一个可执行文件(.EXE)32位连接程序被更名为LINK32.EXE

BIN\LINK32/subsystem:consoleeg0101.obj/libpath:bin“/libpath:bin”指明导入库文件的路径“/subsystem:console”生成Windows控制台环境的可执行文件“/subsystem:windows”生成Windows图形窗口的可执行文件温馨提示:使用批处理文件方便操作温馨提示:汇编程序只指出语法错误715.可执行文件的运行进入控制台(或模拟DOS)环境在命令行提示符下输入文件名(可以省略扩展名)、按下回车键运行

eg0101.exe运行错误,就需要静态排错:阅读分析源程序动态排错:利用调试程序温馨提示:不要在Windows下双击运行726.列表文件列表文件(.LST)含有源程序和目标代码

ML/c/coff/Fleg0101.asm“/Fl”创建列表文件(大写F、小写l,不是数字1)列表文件有两部分内容第一部分:源程序及其代码第二部分:各种标识符错误Error:比较严重的语法错误警告Warning:不太关键的语法错误737.调试程序WinDbg是微软提供的Windows调试程序WinDbg支持源程序级调试,但要在汇编、连接过程中加入参数汇编时用“/Zi”(大写Z、小写i)参数

ML/c/coff/Fl/Zieg0101.asm连接时用“/debug”参数 LINK32/subsystem:console/debugeg0101.obj源程序可执行文件目标模块文本编辑器汇编程序连接程序调试程序第1章习题:汇编语言基础1.1简答题(1、3、6、7、8)1.2

判断题(1、6、7、8、9)1.3

填空题(3、4、5、7、10)1.9、1.13、1.15、1.16第2章数据表示和寻址2.1数据表示2.2常量表达2.3变量应用2.4数据寻址方式第2章数据表示和寻址理解计算机的数据表达熟悉汇编语言的常量表达掌握汇编语言的变量定义和属性掌握处理器指令的数据寻址方式772.1数据表示数据(Data):计算机处理的对象对应指令操作的对象:操作数(Oprand)计算机中的数据要用二进制的0和1组合表示进入计算机的任何信息都要转换成0和1数码IA-32整数指令支持的基本数据类型8、16、32、64位无符号整数8、16、32、64位有符号整数ASCII字符、字符串和BCD码782.1.1数制人习惯使用十进制计数计算机使用二进制进行数据处理十六进制数便于表达二进制数二进制数用后缀字母B十六进制数用后缀字母H791.二进制便于计算机存储及物理实现特点:逢二进一,由0和1两个数码组成,基数为2,各个位权以2k表示二进制数:

anan-1…a1a0.b1b2…bm= an×2n+an-1×2n-1+…+a1×21+a0×20

+b1×2-1+b2×2-2+…+bm×2-m 其中ai,bj非0即1二进制数的算术运算:逢2进1、借1当2示意图二进制数的算术运算返回2.逻辑运算事件的假和真可用数码0和1表示事件之间的关系可以利用二进制表达数字电路的低高电平用数码0和1表示数字信号之间的关系可以利用二进制描述数码0和1仅仅代表两种状态它们的运算是逻辑运算逻辑与AND: 1101

0011=0001逻辑或OR: 1101

0011=1111逻辑非NOT:

1101=0010逻辑异或XOR: 1101

0011=11103.十六进制用于表达二进制数,相互转换简单基数16,逢16进位,位权为16k16个数码:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F十六进制数:

anan-1…a1a0.b1b2…bm= an×16n+an-1×16n-1+…+a1×161+a0×160 +b1×16-1+b2×16-2+…+bm×16-m 其中ai,bj是0~F中的一个数码十六进制数的加减:逢16进位1,借1当16减法加法十六进制数的加法运算

23D9+94BEB8979+14=23=16(carry)+713+11+1(carry)=25=16(carry)+93+4+1(carry)=82+9=11=B返回十六进制数的减法运算

A59F-62B842E715-8=716(borrow)+9-11=14=E5-2-1(borrow)=210-6=4返回854.数制之间的转换十进制二进制十六进制BCD码常用二进制位权00000002-3=0.12510001112-2=0.2520010222-1=0.5300113320=1401004421=2501015522=4601106623=8701117724=16810008825=32910019926=64101010A27=128111011B28=256121100C29=512131101D210=1024141110E215=32768151111F216=6553686二进制数或十六进制数转换为十进制数方法:按权展开二进制数转换为十进制数

0011.1010B =1×21+1×20+1×2-1+0×2-2+1×2-3 =3.625十六进制数转换为十进制数

1.2H

=1×160+2×16-1

=1.12587十进制整数转换为二或十六进制数整数部分转换:用除法十进制数整数部分不断除以基数2或16,并记下余数,直到商为0为止由最后一个余数起逆向取各个余数,则为转换成的二进制和十六进制数

126=01111110B 126=7EH示意图88十进制整数的转换返回89十进制小数转换为二或十六进制数小数部分转换:用乘法分别乘以各自的基数,记录整数部分,直到小数部分为0为止

0.8125=0.1101B 0.8125=0.DH小数转换会发生总是无法乘到为0的情况可选取一定位数(精度)将产生无法避免的转换误差示意图90十进制小数的转换返回91二进制和十六进制数的相互转换二进制和十六进制数之间具有对应关系以小数点为基准整数从左向右,小数从右向左每4个二进制位对应一个十六进制位

00111010B=3AH F2H=11110010B922.1.2数值的编码编码:用文字、符号或者数码来表示某种信息(数值、语言、操作指令、状态等)的过程二进制编码:组合0和1数码机器数:计算机用0和1数码组合表达的数值真值:现实中真实的数值数值的两种编码方式定点格式(第2章)浮点格式(第9章)931.定点整数定点格式:固定小数点的位置表达数值定点整数:小数点固定在机器数的最右侧定点小数:小数点固定在机器数的最左侧无符号整数(无符号数)只表达0和正整数的定点整数N位无符号整数表达范围:0~2N-1有符号整数(有符号数、带符号数)表达负整数、0和正整数的定点整数最高位表达数值正负符号位用0表示正数、1表示负数示意图94定点整数格式返回952.补码有符号整数在计算机中默认采用补码最高位表示符号:正数用0,负数用1正数补码:直接表示数值大小(同无符号数)负数补码:将对应正数补码取反加1 [105]补码=01101001B [-105]补码=[01101001B]取反+1 =10010110B+1=10010111B8位二进制补码的数值范围:-128~+12716位二进制补码的数值范围:-215~+215-132位二进制补码的数值范围:-231~+231-1N位二进制补码的数值范围:-2N-1~+2N-1-196负数求补负数真值“取反加1”得机器数补码负数补码“取反加1”得到负数真值补码:11100000B真值:-([11100000]求反+1)=-(00011111+1)=-00100000=-25=-32负数求补运算,等效于用带借位的0作减法真值:-8,补码:[-8]补码=00H-08H=F8H补码:11111000,真值:-(00H-F8H)=-08H=-8+8= 00001000 11110111+ 1-8= 11111000

0= 00000000-(8= 00001000)-8= 11111000973.补码运算利用无符号数加法结合补码表达,实现无符号数加法无符号数减法有符号数加法有符号数减法无符号数加减运算,需要利用进位或借位有符号数加减运算,注意避免出现溢出[X]补码+[Y]补码=[X+Y]补码[X]补码-[Y]补码=[X]补码+[-Y]补码=[X-Y]补码984.原码和反码正数的原码、反码和无符号数一样求负数的原码、反码和补码首先计算其对应正数的编码然后取反符号位(设置为1)成为原码再取反其他位得到反码最后加1就是补码真值:32,机器数:00100000B=20H真值:-32,机器数:

[-32]原码=10100000B=A0H [-32]反码=11011111B=DFH [20H]补码=11100000B=E0H992.1.3

字符的编码在计算机中,各种字符需要用若干位的二进制码的组合表示,即字符的二进制编码由于字节为计算机的基本存储单位,所以常以8个二进制位为单位表达字符0123456789English汉字1001.BCD(二进制表达的十进制)二进制编码的十进制数一个十进制数位用4位二进制编码来表示8421BCD码:低10个4位二进制编码表示0~9压缩BCD码:一个字节表达两位BCD码非压缩BCD码:一个字节表达一位BCD码(低4位表达数值,高4位常设置为0)BCD码很直观BCD码:0100100101111000.000101001001十进制真值: 4978.149BCD码便于输入输出,表达数值准确1012.ASCII(美国标准信息交换码)标准ASCII码用7位二进制编码,有128个不可显示的控制字符:前32个和最后一个回车CR:0DH

换行LF:0AH

响铃BEL:07H可显示和打印的字符:20H及以后的95个编码数码0~9:30H~39H大写字母A~Z:41H~5AH小写字母a~z:61H~7AH空格:20H扩展ASCII码:最高D7位为1,表达制表符号1023.Unicode(统一码)8位ASCII码表达英文字符16位国标码表达汉字字符汉字机内码:国标码在计算机中使用的编码国际信息交换码Unicode16位编码对世界上所有语言的大多数字符进行编码提供扩展能力Unicode兼容ASCIIUnicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论是什么语言103什么是统一码?WhatisUnicode?Unicodeprovidesauniquenumberforeverycharacter,

nomatterwhattheplatform,

nomatterwhattheprogram,

nomatterwhatthelanguage.Unicode给每个字符提供了一个唯一的数字, 不论是什么平台, 不论是什么程序, 不论是什么语言返回1042.2

常量表达1.常数十、十六和二进制形式表达的数值以后缀字母区分,十进制数可以不加以字母A~F开头的十六进制常数,要加前导02.字符和字符串英文缩略号括起来的单个字符或多个字符数值是每个字符对应的ASCII码值3.符号常量使用标识符表达一个数值符号定义伪指令:等价EQU,等号=4.数值表达式用运算符连接各种常量构成的算式算术运算符:+(加)-(减)*(乘)/(除)常量具有确定数值105〔例2-1〕数据表达程序-100000000 6464

64

64

64const1 db100,100d,01100100b,64h,'d'00000005 017F8080FFFFconst2 db1,+127,128,-128,255,-10000000B 699720E032CEconst3 db105,-105,32,-32,32h,-32h00000011 303132333435 363738396162 6378797A4142 4358595Aconst4 db'0123456789','abcxyz','ABCXYZ'106〔例2-1〕数据表达程序-200000027 0D0A00crlf db0dh,0ah,0=0000000A

minint equ10

=000000FF

maxint

equ0ffh0000002A 0A0FFAF5const5 dbminint,minint+5,maxint-5,maxint-minint0000002E 105615EBconst6 db4*4,34h+34,67h-52h,52h-67h1072.3

变量应用变量(Variable)程序运行中随之发生变化的结果保存在可读可写的主存空间实质是主存单元的数据,因而可以改变变量需要事先定义才能使用变量具有属性方便应用变量表达主存数据,即存储器操作数1082.3.1

变量定义申请存储空间,还可以进行存储单元初始化

变量名变量定义伪指令初值表变量名是用户标识符,表示首元素逻辑地址变量定义伪指令有DB(BYTE)、DW(WORD)、DD(DWORD)、DQ(QWORD)初值表是用逗号分隔的参数各种形式的常量“?”表示初值不确定,即未赋初值复制操作符DUP

重复次数DUP(重复参数)1091.变量定义伪指令助记符:DB变量类型:字节分配一个或多个字节单元;每个数据是字节量可用于定义字符串常量表示8位无符号数或有符号数,字符的ASCII码值助记符:DW变量类型:字分配一个或多个字单元;每个数据是字量、16位数据表示16位无符号或有符号数、16位段选择器、16位偏移地址助记符:DD变量类型:双字分配一个或多个双字单元;每个数据是双字量、32位数据表示32位无符号或有符号数、32位段基地址、32位偏移地址助记符:DQ变量类型:4个字分配一个或多个8字节单元;8字节量表示64位数据1102.字节量数据DB定义8位、字节量变量数据可以表达无符号整数0~255补码表示的有符号整数:-128~+127一个字符(ASCII码值)压缩BCD码:0~99非压缩BCD码:0~9……字符串定义使用字节变量定义DB111〔例2-2〕字节变量程序=0000000A minintequ1000000000 0080FF80007Fbvar1 db0,128,255,-128,0,+12700000006 01FF26DA38C8bvar2 db1,-1,38,-38,38h,-38h0000000C 00bvar3 db?0000000D 00000005[24]bvar4 db5dup('$')00000012 0000000A[00]0000000A[0A00]bvar5 dbminintdup(0),minintdup(minint,?)00000030 00000002[020300000002[04]]

db2dup(2,3,2dup(4))1123.字量数据DW定义16位、字量变量数据可以表达16位无符号和有符号整数16位段选择器,16位偏移地址16位数据含高低2个字节,占2个连续的字节存储单元小端方式(LittleEndian)低字节数据存放在低地址存储单元高字节数据存放在高地址存储单元大端方式(Big

Endian)低字节数据存放在高地址存储单元高字节数据存放在低地址存储单元113〔例2-3〕字变量程序-1=0000000A minintequ1000000000 00008000FFFF800000007FFFwvar1 dw0,32768,65535,-32768,0,+327670000000C 0001FFFF0026FFDA0038FFC8wvar2 dw1,-1,38,-38,38h,-38h00000018 0000 wvar3 dw?0000001A 20101020wvar4 dw2010h,1020h0000001E 00000005[000A0000]

dw5dup(minint,?)114〔例2-3〕字变量程序-200000032 31393832wvar6 dw3139h,3832h00000036 39313238bvar6 db39h,31h,32h,38h0000003A 00

db091289128运行结果?1154.双字量数据DD定义32位、双字量变量数据可以表达32位无符号和有符号整数32位偏移地址、线性地址或段基地址32位数据包含4个字节,以“高对高、低对低”原则占用4个连续字节空间Howtoopenanegg,fromthelittleendorthebigend?示意图116返回小端存储方式117〔例2-4〕双字变量程序-1=0000000A minintequ1000000000 0000000080000000FFFFFFFF 80000000000000007FFFFFFFdvar1 dd0,80000000h,0ffffffffh,-80000000h,0,7fffffffh00000018 00000001FFFFFFFF00000026 FFFFFFDA00000038FFFFFFC8dvar2 dd1,-1,38,-38,38h,-38h00000030 00000000dvar3 dd?00000034 0000201000001020

dd2010h,1020h118〔例2-4〕双字变量程序-20000003C 0000000A[0000000A00000000]dvar5 ddminintdup(minint,?)0000008C 38323139dvar6 dd38323139h00000090 39313238bvar6 db39h,31h,32h,38h00000094 00 db091289128运行结果!1195.变量定位:指定偏移地址变量定义的存储空间 按照书写的先后顺序一个接着一个分配“ORG参数”控制存放的偏移地址

org100h ;从偏移地址100H处安排指令代码也由汇编程序 按照语句的书写顺序安排存储空间定位伪指令也可以用于控制代码的偏移地址1205.变量定位:对齐地址边界N字节数据起始于能够被N整除的地址2字节、16位数据是被2整除的地址(偶地址)4字节、32位数据是被4整除的地址(模4地址)8字节、64位数据是被8整除的地址(模8地址)IA-32处理器允许不对齐边界存放数据,性能有下降“ALIGN

N”控制对齐N字节边界

align

4

;对齐4字节地址边界地址A对齐N字节边界AmodN=0

(能够被N整除的地址)121〔例2-5〕变量定位程序

org100h

0000010064

bvar1 db100

align2

000001020064 wvar2 dw100

align4

0000010400000000

dvar3 dd?

align4

0000010800000000

dvar4 dd?1222.3.2

变量属性变量定义分配存储空间赋初值创建变量名变量名具有两类属性:⑴地址属性:首个变量所在存储单元的逻辑地址,含有段基地址和偏移地址⑵类型属性:变量定义的数据单位字节量BYTE

字量WORD

双字量DWORD

3字量FWORD4字量QWORD10字节量TBYTE123⒈地址操作符地址操作符用于获取变量名的地址属性[]括起的表达式作为存储器地址指针$返回当前偏移地址OFFSET变量名返回变量名所在段的偏移地址SEG变量名返回段基地址(实地址存储模型)124〔例2-6〕变量地址属性程序-1

;数据段00000000 1234bvar db12h,34h00000002

000100020003000400050006 000700080009000Aarray dw1,2,3,4,5,6,7,8,9,1000000016

5678wvar dw5678h=00000016

arr_sizeequ$-array=0000000B arr_lenequarr_size/200000018 9ABCDEF0dvar

dd9abcdef0h125〔例2-6〕变量地址属性程序-2

;代码段00000000 A000000000R

moval,[bvar]00000005 8A2500000001R

movah,[bvar+1]0000000B 66|8B1D 00000022R

movbx,wvar[2]00000012 B90000000B

movecx,arr_len00000017 BA00000017R

movedx,$0000001C BE00000022R

movesi,offsetdvar126〔例2-6〕变量地址属性程序-300000021 8B3E

movedi,[esi]00000023 8B2D00000022R

movebp,[dvar]00000029 E800000000E

calldisprd运行结果127⒉类型操作符类型操作符使用变量名的类型属性类型名PTR变量名将变量名按照指定的类型使用TYPE变量名返回占用字节空间的字量数值LENGTHOF变量名返回整个变量的数据项数SIZEOF

变量名返回整个变量占用的字节数128〔例2-7〕变量类型属性程序-1

;代码段00000000 A10000000CR

moveax,dwordptr[array] ;获得数据00000005 BB00000001

movebx,typebvar

;获得字节类型值0000000A B900000002

movecx,typewvar

;获得字类型值0000000F BA00000004

movedx,typedvar

;获得双字类型值129〔例2-7〕变量类型属性程序-200000014 BE0000000A

movesi,lengthofarray

;获得数据个数00000019 BF00000014

movedi,sizeofarray

;获得字节长度0000001E BD00000016

movebp,arr_size

;获得字节长度00000023 E800000000E

calldisprd

运行结果1302.4数据寻址方式指令有两部分:操作码和操作数操作码:处理器要执行哪种操作不可缺少,用助记符表示操作数:指令执行的参与者各种操作的对象,需要通过地址指示数据寻址方式:通过地址查找数据(操作数)立即数寻址:数据在指令代码中,用常量表达寄存器寻址:数据在寄存器中,用寄存器名表示存储器寻址:数据在主存中,用存储器地址指示1312.4.1立即数寻址操作数紧跟操作码,是机器代码的一部分操作数从指令代码中立即得到,即立即数(Immediate),用常量形式直接表达立即数寻址方式只用于源操作数,常用来给寄存器和存储单元赋值例如:MOVEAX,33221100H机器代码:B800112233操作码:B8立即数:33221100示意图132立即数寻址返回133〔例2-8〕立即数寻址程序-1

;数据段=00000040 const equ64000000008749 bvar db87h,49h00000002123456780000000C dvar dd12345678h,12

;代码段00000000B012 moval,12h00000002B464 movah,'d'0000000466|BBFFFF

labl: movbx,-100000008B900000040

movecx,const134〔例2-8〕立即数寻址程序-20000000DBA00000040

movedx,const*4/typedvar00000012BE00000000R

movesi,offsetbvar00000017BF00000004R

movedi,labl0000001CC60500000000R4C

movbyteptr[bvar],01001100b00000023C70500000006R00000012

movdwordptr[dvar+4],12h1352.4.2寄存器寻址操作数存放在处理器的内部寄存器中用寄存器名表示它的内容绝大多数指令采用通用寄存器寻址部分指令支持专用寄存器,例如段寄存器寄存器寻址方式简单快捷,最常使用例如:MOVEBX,EAX32位通用寄存器:EAXEBXECXEDX……16位通用寄存器:AXBXCXDX……8位通用寄存器:AHALBHBL……136〔例2-9〕寄存器寻址程序

;代码段000000008AC4 moval,ah0000000266|8BD8 movbx,ax000000058BD8 movebx,eax0000000766|8CDA movdx,ds0000000A66|8EC2 moves,dx

movedi,sieg0209.asm(11):errorA2022:instructionoperandsmustbethesamesize出错了!1372.4.3存储器寻址操作数在主存中,通过存储器地址指示编程时,存储器地址使用包含段选择器和偏移地址的逻辑地址段选择器(段寄存器)指示段基地址默认规定:数据在DS指向的数据段;EBP或ESP作为基地址,数据在SS指向的堆栈段显式说明:使用段超越指令前缀,段寄存器名后跟英文冒号偏移地址由各种寻址方式计算常被称为有效地址EA(EffectiveAddress)1381.段寄存器的默认和超越访问存储器的方式默认可超越偏移地址取指令CS无EIP堆栈操作SS无ESP一般数据访问DSCSESSSFSGS有效地址EAEBP基址的寻址方式SSCSESDSFSGS有效地址EA串操作的源操作数DSCSESSSFSGSESI串操作的目的操作数ES无EDI主存操作数常通过变量形式引用,一般不需要使用段超越前缀指令1392.偏移地址的组成32位有效地址=基址寄存器+(变址寄存器×比例)+位移量基址寄存器:任何8个32位通用寄存器之一变址寄存器:除ESP外的任何32位通用寄存器之一比例:1,2,4或8位移量:8或32位有符号值变化出多种主存寻址方式1403.直接寻址有效地址只有位移量部分,直接包含在指令代码中常用于存取变量例如:

MOVECX,[COUNT]

;COUNT是变量

MOVECX,COUNT ;MASM支持

MOVECX,DS:[405000H]指令代码:8B0D00504000操作码和寻址方式:8B0D操作数:有效地址00405000H示意图141存储器直接寻址返回142〔例2-10〕存储器直接寻址程序-1

;数据段00000000

8749 bvar db87h,49h00000002

123456780000000C dvar dd12345678h,12

;代码段00000000

8A0D00000000R movcl,[bvar]00000006

8B1500000002R movedx,[dvar]143〔例2-10〕存储器直接寻址程序-20000000C883500000001R mov[bvar+1],dh0000001266|891500000004R movwordptr[dvar+2],dx00000019C70500000002R87654321 movdwordptr[dvar],87654321h

movdwordptr[dvar+4],dvareg0210.asm(13):errorA2070:invalidinstructionoperands出错了!1444.寄存器间接寻址有效地址存放在寄存器中(寄存器内容=偏移地址=有效地址)MASM用中括号括起寄存器可以方便地对数组的元素或字符串的字符进行操作寄存器间接寻址没有说明存储单元类型例如:movedx,[ebx]movcx,[esi]mov[edi],al145〔例2-11〕寄存器间接寻址程序-1 ;数据段srcmsg db'Tryyourbest,whynot.',0count equ$-srcmsg ;计算字符串字符个数,赋给符号常量dstmsg dbcountdup(0) ;代码段

movecx,count ;ECX=字符串字符个数

movesi,offsetsrcmsg ;ESI=源

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论