软件-汇编语言程序设计_第1页
软件-汇编语言程序设计_第2页
软件-汇编语言程序设计_第3页
软件-汇编语言程序设计_第4页
软件-汇编语言程序设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

软件——汇编语言程序设计从底层原理到系统级编程的完整技术体系Contents课程目录汇编语言程序设计课程的五大核心模块,从基础理论到系统级应用,构建完整的底层编程知识体系。01汇编语言基础理论02指令系统与寻址方式03程序设计基本方法04高级汇编技术05系统功能调用与实际应用CHAPTER01汇编语言基础理论从机器语言到汇编语言的演进历程与计算机体系结构基础ASSEMBLYLANGUAGE汇编语言的由来与特点汇编语言是介于机器语言与高级语言之间的低级语言,它用助记符替代二进制机器码,在保持直接操作硬件能力的同时显著提升了程序可读性。尽管高级语言已成为主流开发工具,汇编语言在系统级编程、性能优化和底层安全研究领域仍具有不可替代的地位。语言演进历程机器语言由二进制0/1组成,计算机可直接执行但人类难以阅读编写,极易出错且调试困难汇编语言用ADD、MOV等助记符替代机器码,需通过汇编器翻译成机器语言才能执行高级语言如C/Java更接近自然语言,具有跨平台能力,但仍需编译为机器指令运行核心优势直接操作硬件寄存器和内存地址,精确控制底层资源,实现极致性能优化目标代码执行效率极高,在实时系统和嵌入式开发中对时序要求严格的场景不可或缺是理解计算机体系结构、操作系统原理和编译技术的必要基础应用领域与局限主要应用于操作系统内核开发、设备驱动程序、嵌入式系统、逆向工程和安全漏洞分析等领域与特定CPU架构紧密绑定,程序可移植性差,编写复杂应用时代码量大、开发效率低于高级语言学习曲线陡峭,需要深入理解处理器指令集、内存管理和硬件接口等底层知识ARCHITECTURE微型计算机系统结构微型计算机采用冯·诺依曼"存储程序"体系结构,由CPU、存储器和I/O设备三大核心部件通过总线互联组成。存储程序原理:程序和数据以二进制形式统一存储在内存中,CPU按顺序取指执行CPU组成:运算器执行算术逻辑运算,控制器负责从内存取指令、分析指令并产生控制信号存储层次:内存直接与CPU交换数据速度快但容量有限,外存容量大但需通过I/O接口访问总线体系:数据总线传输数据、地址总线指定内存单元、控制总线协调各部件工作时序IBMPC·8086:20位地址总线可寻址1MB空间,16位数据总线一次传输2字节数据Intel8086处理器·IBMPC核心芯片ProcessorArchitectureIntel8086/8088处理器内部结构Intel8086处理器通过14个16位寄存器组织实现对CPU状态的完整控制,并采用独特的内存分段机制解决了16位寄存器寻址1MB物理空间的难题。'段地址×16+偏移地址'的物理地址计算方式是8086汇编编程的核心基础。寄存器组织内存分段机制通用寄存器AX/BX/CX/DX用于存放操作数和地址,可拆分为AH/AL等8位寄存器灵活使用AX·BX·CX·DX段寄存器CS/DS/SS/ES分别指向代码段、数据段、堆栈段和附加段,是内存分段机制的核心CS·DS·SS·ES地址总线寻址20位地址总线可寻址1MB空间,寄存器仅16位只能表示64KB,分段机制解决了这一矛盾1MB指令指针IPIP存放下一条要执行指令的偏移地址,与CS配合确定当前执行位置CS:IP物理地址计算逻辑地址格式为"段地址:偏移地址",物理地址=段地址×16+偏移地址2000H:1000H→21000H段大小约束每个段最大64KB,段地址必须能被16整除(末位为0),段与段之间可以重叠或相邻64KB/段AssemblyDataFundamentals计算机中的数据表示汇编语言编程需要直接处理二进制数据,掌握数制转换、补码表示和字符编码是进行底层程序设计的基础。数制与转换二进制与十六进制二进制是计算机内部数据表示基础,4位二进制对应1位十六进制,简化书写与阅读。4bit→1hex数制与转换数制转换方法十进制转二进制用"除2取余法",二进制转十进制用"按权展开求和法"。Divide&Expand数制与转换BCD码用4位二进制表示1位十进制数,便于十进制运算和显示输出场景。4bit/digit有符号数与字符编码补码表示法正数补码等于原码,负数补码等于反码加1,使加减法统一为加法运算。~X+1有符号数与字符编码补码范围与溢出8位补码表示−128~+127,16位为−32768~+32767,运算需注意溢出判断。−128~+127有符号数与字符编码ASCII编码7位表示128个字符,'0'~'9'为30H~39H,'A'~'Z'为41H~5AH,大小写差20H。7bit·128charsCHAPTER02指令系统与寻址方式8086处理器的指令集架构与操作数定位方法详解ADDRESSINGMODES8086寻址方式详解从立即寻址到基址变址寻址,灵活度递增而执行效率递减——选择合适方式是汇编编程的核心前提01立即寻址操作数直接包含在指令中,如MOVAX,1234H,执行速度最快但操作数固定不可变MOVAX,1234H02寄存器寻址操作数在CPU寄存器中,如MOVAX,BX,无需访问内存,执行效率高MOVAX,BX03直接寻址指令中给出操作数的偏移地址,如MOVAX,[2000H],适用于访问固定内存单元MOVAX,[2000H]04寄存器间接寻址用BX/SI/DI/BP存放偏移地址,如MOVAX,[BX],适用于遍历数组和数据结构MOVAX,[BX]05基址变址寻址基址寄存器加变址寄存器定位,如MOVAX,[BX+SI],适用于二维数组和复杂数据结构MOVAX,[BX+SI]06相对基址变址寻址在基址变址基础上加位移量,灵活性最高但指令编码最长[BX+SI+10H]ASSEMBLYINSTRUCTIONS数据传送类指令数据传送指令在寄存器、内存与I/O间移动数据,MOV最核心但有限制,PUSH/POP在子程序调用中起关键保护作用。基本传送指令MOV

·格式MOV目的,源,实现寄存器与内存间数据传送,不能在两个内存单元间直接传送,不影响标志位XCHG

·交换两个操作数的内容,如XCHGAX,BX,适用于需要临时交换数据的场景LEA

·取有效地址送入寄存器,如LEABX,[SI+10H],传送的是偏移地址而非内容MOV·XCHG·LEA堆栈操作指令PUSH

·将操作数压入堆栈,SP先减2再存入数据,用于子程序调用前保存现场POP

·从堆栈弹出数据到操作数,取出数据后SP加2,与PUSH配合实现现场恢复LIFO原则

·堆栈遵循后进先出,SS:SP指向栈顶,PUSH和POP必须成对使用以保证堆栈平衡PUSH·POP·LIFO其他传送指令XLAT

·查表转换指令,用AL作为索引从表中取出对应字节,适用于代码转换和字符映射IN/OUT

·实现CPU与I/O端口间数据传送,IN从端口读入数据,OUT向端口输出数据MOVS

·串传送指令,用于内存块之间的批量数据移动,常与REP前缀配合使用实现高效复制XLAT·IN/OUT·MOVSINSTRUCTIONSET算术运算类指令算术运算指令涵盖加减乘除四大基本运算,运算结果影响标志寄存器,直接影响程序分支走向ADD/SUB指令加减法运算,支持寄存器与内存、立即数操作,影响全部状态标志位基础运算ADC/SBB指令带进位加法和带借位减法,用于多字节运算如32位数在16位机器分次计算多字节运算MUL/IMUL指令无符号与有符号乘法,隐含使用AL/AX,结果存AX或DX:AX隐含操作数DIV/IDIV指令无符号与有符号除法,被除数用AX或DX:AX,商存AL/AX余数存AH/DX商余分离CMP指令比较两操作数执行减法但不保存结果,仅影响标志位,条件分支基础条件分支标志位应用CF判断无符号进位,OF判断有符号溢出,ZF判断相等,SF判断符号CF·OF·ZF·SFLOGIC&SHIFTINSTRUCTIONS逻辑运算与移位指令逻辑运算指令通过位级操作实现数据掩码与位设置,移位指令高效完成2的幂次乘除法,XOR自清零是优化代码大小的经典手法。逻辑运算指令AND·按位与清除特定位或检测位状态,如ANDAL,0FH保留低4位OR·按位或设置特定位为1,如ORAL,80H将最高位置1XOR·按位异或经典清零XORAX,AX比MOVAX,0编码更短移位与循环指令SHL/SAL·左移左移n位等效乘以2ⁿ,是高效的乘法替代方案SHR/SAR·右移SHR高位补0,SAR补符号位,适用于有符号数除法ROL/ROR·循环移位移出位从另一端送回;RCL/RCR带进位,CF参与循环ASSEMBLYINSTRUCTIONS串操作与控制转移指令串操作指令配合REP前缀能高效处理连续内存数据,是字符串处理和内存块操作的利器;控制转移指令通过改变指令指针IP的值实现程序流程控制,包括无条件转移、条件转移、子程序调用和循环控制,是构建分支、循环等程序结构的基石。串操作指令五类串操作指令:MOVS/CMPS/SCAS/LODS/STOS,分别实现传送、比较、扫描、装入和存储操作REP前缀使指令自动重复执行CX次,如REPMOVSB实现整块内存拷贝,效率远高于逐字节循环方向标志DF控制地址变化方向:CLD使DF=0地址递增,STD使DF=1地址递减控制转移指令JMP无条件转移:直接修改IP值跳转,支持段内直接、段内间接、段间直接和段间间接四种方式条件转移:根据标志位状态决定是否跳转,如JE/JZ(ZF=1)、JNE/JNZ(ZF=0)、JG(大于跳转)CALL/RET子程序调用与返回:CALL将返回地址压栈后跳转,RET从栈中弹出返回地址恢复执行LOOP循环:自动将CX减1,若CX不为0则跳转到指定标号,是循环程序的核心控制指令CHAPTER03程序设计基本方法从顺序结构到模块化设计的汇编程序构建方法论SourceProgramFormat汇编语言源程序格式汇编语言源程序由代码段、数据段和堆栈段等逻辑段组成,通过伪指令组织程序结构。理解源程序格式和伪指令是编写正确汇编程序的前提。SECTION01程序段结构01代码段(CODE):存放可执行指令,用SEGMENT/ENDS定义,ASSUMECS:CODE关联段寄存器02数据段(DATA):存放变量和常量,ASSUMEDS:DATA关联,需手动用MOVAX,DATA和MOVDS,AX装载03堆栈段(STACK):为堆栈操作提供内存空间,大小根据PUSH/POP使用频率设定,ASSUMESS:STACK关联SECTION02常用伪指令01DB/DW/DD:定义字节/字/双字变量,如COUNTDW100定义一个字变量并初始化为10002EQU/=:定义常量符号,如BUFFER_SIZEEQU256,程序中可用符号名代替数值03ORG:设置位置计数器,指定后续代码或数据的起始偏移地址,如ORG100H04ASSUME:告知汇编器段寄存器与逻辑段的对应关系,不产生机器码,仅用于汇编阶段SECTION03程序入口与结束01END伪指令:标记源程序结束,可指定入口标号如ENDSTART,汇编器据此设置起始执行地址02返回DOS:调用INT21H的4CH号功能,MOVAH,4CH和INT21H两条指令完成正常退出完整程序结构需包含段定义、ASSUME、初始化、主程序体和正常返回,确保程序正确加载和执行程序框架示例:STACKSEGMENT→DATASEGMENT→CODESEGMENT→ENDSTARTASSEMBLYLANGUAGE顺序与分支程序设计顺序程序按指令书写顺序依次执行,适用于线性处理任务;分支程序通过CMP指令配合条件转移指令实现流程判断,正确设置条件逻辑和跳转目标是设计关键。顺序程序设计指令按书写顺序依次执行,适用于无条件和循环的线性计算任务,如数制转换和简单公式计算设计要点:明确输入输出、理清中间变量、确保操作数类型匹配、注意运算结果的存放位置典型实例:将两位压缩BCD码转换为二进制数,需分离各位数字后按权求和分支程序设计单分支结构CMP比较后接条件转移指令,如CMPAX,BX和JG实现条件判断逻辑双分支结构条件转移到一个分支,JMP跳过另一分支,实现if-else逻辑多分支结构用跳转表实现,将各分支入口地址存入表中,根据索引计算偏移后间接跳转注意事项条件判断要覆盖所有情况,跳转目标标号要准确,避免遗漏默认处理分支Chapter04·LoopDesign循环程序设计循环程序由初始化、循环体、修改和控制四部分组成,是处理批量数据的核心编程结构。8086提供LOOP指令实现简单的计数循环,复杂条件循环则需CMP配合条件转移指令。循环四要素初始化设置变量初值,循环体处理核心逻辑,修改更新变量,控制判断终止条件。四个部分紧密配合,构成完整的循环结构。4PartsLOOP指令自动将CX寄存器减1,当CX≠0时跳转到目标地址继续执行,适用于已知循环次数的计数循环场景,简化代码编写。CX→0条件控制循环CMP比较指令后接条件转移指令,适用于循环次数不确定、依赖运行时条件判断的场景,实现更灵活的流程控制。CMP+Jcc嵌套循环处理外层循环计数器通过PUSH指令保存到堆栈,内层循环结束后POP恢复,保证各层循环独立计数互不干扰。PUSH/POP冒泡排序实例双重循环结构:外层控制排序轮数,内层进行相邻元素比较交换,总比较次数为n(n-1)/2,是经典嵌套循环应用。n(n-1)/2循环优化技巧移位指令代替乘除运算,REP前缀配合串操作指令,减少循环体内内存访问次数,提升程序执行效率。REP/ShiftAssembly·Subroutine子程序设计与参数传递子程序通过CALL/RET机制实现代码复用和模块化设计,是构建复杂汇编程序的基础。01·STRUCTURE子程序基本结构CALL/RET:CALL将返回地址压栈后跳转入口,RET从栈中弹出恢复执行现场保护:入口PUSH保存寄存器,出口POP恢复,保证现场完整NEAR/FAR:NEAR同段仅压IP;FAR跨段压CS和IP,适用多段结构CALL/RET02·PARAMETERS参数传递方式寄存器:参数放入约定寄存器,速度最快,适用少于4个参数的简单子程序内存:参数存放约定内存变量,子程序直接访问,适用大量数据但耦合度高堆栈:调用前PUSH入栈,通过BP加偏移量访问,最灵活且支持递归3种方式03·PRINCIPLES设计原则功能单一:每个子程序只完成一个明确功能,接口清晰,便于测试和复用可重入性:避免全局变量,参数和局部变量通过堆栈管理,支持中断和递归文档规范:子程序需包含功能说明、入口出口条件、寄存器影响等完整注释模块化CHAPTER04高级汇编技术宏定义、结构记录与条件汇编等提升开发效率的高级特性ASSEMBLY·CHAPTER20宏汇编技术宏在汇编时展开,执行快但代码膨胀;子程序在运行时调用,节省空间但有调用开销宏定义与调用MACRO/ENDM定义宏体,可带形参;调用时用实参替换形参汇编时宏调用处自动展开为宏体代码,每次生成独立副本,无运行时开销LOCAL声明局部标号,汇编器自动替换为唯一编号,避免展开冲突MACRO宏与子程序对比优势:无调用开销执行快,参数传递灵活,适合短小频繁的代码片段劣势:每次调用展开一份代码,多次调用导致体积膨胀,调试难追踪选择:少于5条指令且调用频繁用宏,代码较长用子程序,兼顾效率与体积VS高级宏技术宏嵌套:宏体内可调用其他宏,实现分层代码生成,复杂I/O可由多个基础宏组合完成条件汇编:IF/ELSE/ENDIF在宏内根据参数值生成不同代码,实现编译期的分支逻辑重复汇编:REPT/IRP/IRPC实现代码块的循环展开,批量生成相似指令序列IF/ELSECHAPTER21结构、记录与条件汇编结构(STRUCT)和记录(RECORD)为汇编语言提供了复合数据类型定义能力,使数据组织更接近高级语言;条件汇编通过IF/IFDEF等指令在汇编阶段决定代码取舍,实现编译期的条件分支。这些高级特性显著提升了大型汇编程序的可读性、可维护性和跨平台适应能力。结构与记录STRUCT·RECORD01STRUCT/ENDS定义结构类型,可包含不同类型的字段,如STUDENTSTRUCT包含NAMEDB和SCOREDW等字段02用结构名声明变量后,通过"变量名.字段名"访问成员,如STU1.SCORE访问学生成绩,提高代码可读性03RECORD定义位域记录,如FLAGSRECORDF1:1,F2:3,F3:4将一个字分为1位、3位、4位三个字段04记录常用于硬件寄存器映射,将控制寄存器的各个功能位定义为独立字段,便于位操作条件汇编IF·IFDEF·IFNDEF01IF/ELSE/ENDIF:根据表达式值决定汇编哪段代码,如IFTYPEVAREQ2汇编字操作否则汇编字节操作02IFDEF/IFNDEF:判断符号是否已定义,常用于调试代码开关,如IFDEFDEBUG包含调试输出代码03条件汇编在编译期执行,不影响运行时性能,适用于跨平台适配和功能模块的可选编译CHAPTER05系统功能调用与实际应用DOS/BIOS中断调用机制与输入输出、文件操作等实用编程技术汇编语言·系统调用中断机制与DOS功能调用中断机制使CPU能够响应外部事件和系统请求,软件中断INT指令是调用DOS/BIOS系统服务的入口。中断机制基础DOS功能调用方法01CPU暂停当前程序转去处理紧急事件,处理完毕后通过IRET返回原程序断点继续执行。这是实现多任务和实时响应的核心机制。02硬件中断由外部设备触发(键盘、定时器),软件中断由INTn指令主动触发。两者共享同一套中断处理框架。03中断向量表位于00000H~003FFH,存放256个服务程序入口地址(每个4字节:IP+CS)。系统通过中断类型号快速定位处理程序。256VECTORS·IRET·中断向量表01调用格式:AH=功能号,其他寄存器放参数,执行INT21H,结果返回在AX等寄存器。这是汇编程序访问系统服务的标准方式。02常用功能:01H键盘输入·02H显示字符·09H显示$结尾字符串·4CH程序终止。涵盖基本输入输出控制。03文件操作:3CH创建·3DH打开·3FH读·40H写·3EH关闭。通过句柄管理文件,实现数据持久化存储。INT21H·功能号AH·寄存器传参INT21H·FUNCTIONCALLSDOS字符输入输出功能DOS提供多种字符I/O功能调用,单字符输入可选带回显(01H)或不回显(07H/08H)模式,输出(02H)直接显示DL中字符;字符串输入(0AH)需预定义缓冲区,输出(09H)以'$'结尾。字符输入功能AH=01H从键盘读入字符并回显,字符ASCII码返回在AL中,是最常用的单字符输入方式AH=07H直接控制台输入不回显,适用于密码输入等需要隐藏输入内容的场景AH=0AH缓冲区输入字符串,需定义缓冲区格式——首字节最大长度、次字节实际长度、后续存放字符字符输出功能AH=02H显示单字符,DL中存放要显示字符的ASCII码,输出后光标自动后移一位AH=09H显示字符串,DX指向字符串首地址,字符串必须以'$'字符结尾,遇'$'停止显示CONTROLCHARS输出控制字符可实现特殊效果:0DH回车、0AH换行、08H退格、07H响铃,组合使用可控制显示格式Assembly·BIOSInterruptBIOS功能调用BIOS是固化在ROM中的底层系统程序,通过INT10H/16H/13H等中断提供直接的硬件控制能力,比DOS更底层、更快、功能更强。视频服务INT10H01AH=00H设置显示模式,如AL=03H设置80×25彩色文本模式,AL=12H设置640×480图形模式02AH=02H设置光标位置,DH=行号、DL=列号、BH=页号,可将光标移动到屏幕任意位置03AH=09H在光标处显示字符并设置属性,AL=字符、BL=属性字节(高4位背景色、低4位前景色)、CX=重复次数INT10H键盘服务INT16H01AH=00H从键盘读入字符,AH返回扫描码、AL返回ASCII码,支持功能键和组合键的识别02AH=01H检测键盘缓冲区是否有按键,ZF=1表示无按键,不阻塞程序执行,适用于非阻塞式键盘检测03AH=02H读取Shift状态字节,AL各位分别表示Ctrl、Alt、Shift、CapsLock等修饰键的当前状态INT16H32-BITASSEMBLY·WINDOWSPROGRAMMING32位汇编与Windows编程32位处理器将寄存器扩展到32位、地址空间扩展到4GB,保护模式取代实模式实现更安全的内存管理。Windows下的汇编编程通过调用API函数实现功能,不再直接操作硬件。0132位寄存器扩展—EAX/EBX/ECX/EDX等通用寄存器可处理更大数据,ESI/EDI用于32位地址寻址02保护模式内存管理—段描述符与页表机制,4GB虚拟地址空间,各进程独立互不干扰03WindowsAPI编程—调用kernel32.dll、user32.dll等动态链接库函数实现窗口创建与消息处理04MASM32开发环境—提供ml.exe汇编器和link.exe链接器,支持32位Windows程序编译链接05实际应用价值—操作系统内核开发、设备驱动程序、病毒分析、逆向工程和安全漏洞研究MASM32汇编开发环境实景ASSEMBLY×HIGH-LEVELLANGUAGE汇编与C/C++混合编程混合编程的核心挑战在于接口约定:调用约定规定参数传递方式和堆栈清理责任,命名约定确保符号正确链接。METHODS混合编程方式01内嵌汇编:在C/C++代码中用__asm关键字插入汇编指令,编译器自动处理寄存器分配02独立模块:汇编代码单独编写并生成OBJ文件,与C/C++的OBJ文件链接03选择原则:少量优化用内嵌汇编,复杂功能或需复用的代码用独立模块__asmINTERFACE接口约定01CDECL:参数从右到左入栈,调用者清理堆栈,C语言默认约定,支持可变参数02STDCALL:参数从右到左入栈,被调用者清理堆栈,WindowsAPI使用此约定03命名约定:C函数名加下划线前缀(_func),C++需extern"C"CDECL/STDCALLREGISTERS寄存器保护01调用者保存:EAX、ECX、EDX在调用后可能被修改,如需保留应由调用者事先保存02被调用者保存:EBX、ESI、EDI、EBP

温馨提示

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

评论

0/150

提交评论