收藏 分销(赏)

汇编语言程序设计课程研讨清华大学计算机系-毛希平.pptx

上传人:a199****6536 文档编号:4224353 上传时间:2024-08-26 格式:PPTX 页数:111 大小:1.04MB 下载积分:20 金币
下载 相关 举报
汇编语言程序设计课程研讨清华大学计算机系-毛希平.pptx_第1页
第1页 / 共111页
汇编语言程序设计课程研讨清华大学计算机系-毛希平.pptx_第2页
第2页 / 共111页


点击查看更多>>
资源描述
汇编语言程序设计汇编语言程序设计课程研讨课程研讨清华大学计算机系清华大学计算机系 毛希平毛希平汇编汇编语言语言1 1课程定位课程定位1 1课程定位课程定位 课程建设的基本情况课程建设的基本情况 课程定位与教学目标课程定位与教学目标 课程内容与教学方式课程内容与教学方式 课程重点与难点解析课程重点与难点解析 实验设置与考核方式实验设置与考核方式 个人体会与大家交流个人体会与大家交流汇编汇编语言语言PDP11 汇编语言程序设计汇编语言程序设计(82年年)IBM PC 汇编语言程序设计汇编语言程序设计(87年年)80 x86 汇编语言程序设计汇编语言程序设计 课程建设的基本情况课程建设的基本情况982年计算机系在国内率先开设。汇编汇编语言语言课程定位课程定位:计算机专业基础课:计算机专业基础课 专业课程的先导课专业课程的先导课 课程定位与教学目标课程定位与教学目标汇编汇编语言语言以下高级语言中的问题你可能不能给出(正确的)答案:以下高级语言中的问题你可能不能给出(正确的)答案:程序是怎么开始和结束的?程序是怎么开始和结束的?指令是怎么执行的?指令是怎么执行的?代码和数据是如何分布的?代码和数据是如何分布的?全局变量和局部变量是怎样存储的?全局变量和局部变量是怎样存储的?循环和分支结构循环和分支结构是怎样实现的?是怎样实现的?子程序子程序的调用和返回是如何进行的?参数是怎么传递的?的调用和返回是如何进行的?参数是怎么传递的?在学习汇编之前:在学习汇编之前:汇编汇编语言语言更微观的问题还有:更微观的问题还有:for、while、dowhile循环的实现效率有什么不同吗?循环的实现效率有什么不同吗?条件分支条件分支ifelse与与switchcase呢?呢?乘法和除法是怎么做的?乘法和除法是怎么做的?溢出是怎么回事?堆栈是什么?溢出是怎么回事?堆栈是什么?带符号整数(带符号整数(int)和无符号整数()和无符号整数(unsigned int)在运)在运 算上有什么差别?算上有什么差别?C/C+中的指针是什么?中的指针是什么?汇编汇编语言语言学生关于汇编语言的疑问:学生关于汇编语言的疑问:什么是汇编语言(什么是汇编语言(Assembly Language)?)?汇编语言与高级语言的关系?汇编语言与高级语言的关系?汇编语言的地位汇编语言的地位?重要性?重要性?汇编语言的应用?汇编语言的应用?汇编汇编语言语言C/C+源程序源程序 反汇编代码反汇编代码 汇编汇编语言语言摘自摘自CMU教学计划教学计划 汇编汇编语言语言计算机系统计算机系统硬硬 件件汇编语言是汇编语言是完整理解计算机系统完整理解计算机系统的最佳起点和最有效途径的最佳起点和最有效途径。操作系统操作系统高级语言程序高级语言程序汇编语言程序汇编语言程序理理 解解感感 知知汇编汇编语言语言 学习一种编程语言,使学生获得在计算机学习一种编程语言,使学生获得在计算机低层编程的经验;低层编程的经验;建立建立计算机系统的整体概念计算机系统的整体概念 (机器与程序机器与程序 时间与空间时间与空间 ),为后续课程打好基础;,为后续课程打好基础;培养分析问题和实际解决问题的能力。培养分析问题和实际解决问题的能力。教学目标教学目标:汇编汇编语言语言 课程内容与教学方式课程内容与教学方式注重基础、实用注重基础、实用体现发展、更新体现发展、更新汇编汇编语言语言教材:教材:IBM-PC 汇编语言程序设计汇编语言程序设计(第第2版版),沈美明沈美明 温冬婵温冬婵 清华大学出版社清华大学出版社系列教材:系列教材:IBM-PC 汇编语言程序设计汇编语言程序设计IBM-PC 汇编语言程序设计实验教程汇编语言程序设计实验教程每学期每学期8080学时:学时:原来原来64(课堂教学课堂教学)+16(上机上机)目前目前48(课堂教学课堂教学)+32(上机上机)汇编汇编语言语言第一章第一章 基础知识基础知识 4学时学时1.1 进位计数制与不同基数的数之间的转换进位计数制与不同基数的数之间的转换1.2 二进制数和十六进制数运算二进制数和十六进制数运算1.3 计算机中数和字符的表示计算机中数和字符的表示1.4 几种基本的逻辑运算几种基本的逻辑运算第二章第二章 80 x86计算机组织计算机组织 4学时学时2.1 计算机系统构成计算机系统构成2.2 80 x86微处理器(微处理器(CPU)2.3 存储器和外部设备存储器和外部设备2.4 基本操作模式(实模式基本操作模式(实模式,保护模式保护模式,V86模式)模式)汇编汇编语言语言第三章第三章 指令系统和寻址方式指令系统和寻址方式 12学时学时3.1 80 x86的寻址方式的寻址方式3.2 机器语言指令概况机器语言指令概况3.3 80 x86指令系统指令系统第四章第四章 汇编语言程序格式汇编语言程序格式 4学时学时4.1 汇编程序功能汇编程序功能4.2 伪操作伪操作4.3 汇编语言程序格式汇编语言程序格式4.4 汇编语言程序的上机过程汇编语言程序的上机过程第五章第五章 循环与分支程序循环与分支程序 4学时学时5.1 循环程序设计循环程序设计5.2 分支程序设计分支程序设计汇编汇编语言语言第六章第六章 子程序结构子程序结构 6学时学时6.1 子程序的设计方法子程序的设计方法6.2 嵌套与递归子程序嵌套与递归子程序6.3 子程序举例子程序举例第七章第七章 高级汇编语言技术高级汇编语言技术 4学时学时7.1 宏汇编宏汇编7.2 重复汇编重复汇编7.3 条件汇编条件汇编汇编汇编语言语言第八章第八章 I/O程序设计程序设计 4学时学时8.1 I/O设备的数据传送方式设备的数据传送方式8.2 程序直接控制程序直接控制I/O方式方式8.3 中断方式中断方式8.4 保护模式下的中断处理保护模式下的中断处理第九章第九章 BIOS和和DOS中断中断 2学时学时9.1 键盘键盘I/O9.2 显示器显示器I/O9.3 打印机打印机I/O9.4 串行通信口串行通信口I/O图形与发声系统的程序设计图形与发声系统的程序设计自学自学 磁盘文件存取技术磁盘文件存取技术自学自学汇编汇编语言语言第十章第十章 模块化程序设计模块化程序设计 4学时学时10.1 汇编程序概述汇编程序概述10.2 连接程序及连接对程序设计的要求连接程序及连接对程序设计的要求10.3 汇编语言程序与高级语言程序的连接汇编语言程序与高级语言程序的连接10.4 模块化程序设计概述模块化程序设计概述汇编汇编语言语言 体现研究型教学理念体现研究型教学理念 创新、新颖、生动、交互式、多样化创新、新颖、生动、交互式、多样化 注重系统性和完整性,要突出重点注重系统性和完整性,要突出重点 有意识地引入后续课程中的问题,为学生做有意识地引入后续课程中的问题,为学生做理论和技术上的准备,也提高了学习兴趣。理论和技术上的准备,也提高了学习兴趣。通过自学培养学生学习的主动性通过自学培养学生学习的主动性 强化实验环节,重视实验指导强化实验环节,重视实验指导 多元化考核保证教学质量多元化考核保证教学质量 教学方式:教学方式:汇编汇编语言语言 课程重点与难点解析课程重点与难点解析 汇编课对于学生来说是一门全新的课程,尽管在此之汇编课对于学生来说是一门全新的课程,尽管在此之前他们大多学过一门或两门高级语言,有一定的编程经历前他们大多学过一门或两门高级语言,有一定的编程经历和程序设计能力。和程序设计能力。汇编这种低级语言比较独特,从形式到结构与高级语汇编这种低级语言比较独特,从形式到结构与高级语言有很大不同,它不像高级语言那样容易言有很大不同,它不像高级语言那样容易“入门入门”,学生,学生在学习过程中尤其在课程的前半段充满了疑惑,几乎每一在学习过程中尤其在课程的前半段充满了疑惑,几乎每一章都有难点,这就要求我们在教学方法上狠下功夫。章都有难点,这就要求我们在教学方法上狠下功夫。学生遇到的难点主要分两种:一是基本概念方面的,学生遇到的难点主要分两种:一是基本概念方面的,对这些概念和基础知识正确而清晰的理解非常重要;二是对这些概念和基础知识正确而清晰的理解非常重要;二是应用和编程方面的(主要体现在程序格式或结构上)。应用和编程方面的(主要体现在程序格式或结构上)。汇编汇编语言语言第一章第一章 基础知识基础知识 熟悉并习惯二进制、特别是十六进制数熟悉并习惯二进制、特别是十六进制数进制之间的转换进制之间的转换 算术运算和逻辑运算算术运算和逻辑运算有符号数和无符号数有符号数和无符号数机器数的补码表示、补码的加减法、溢出机器数的补码表示、补码的加减法、溢出字符和汉字的表示字符和汉字的表示 ASCII码表码表汇编汇编语言语言关于溢出:关于溢出:汇编汇编语言语言第二章第二章 80 x86计算机组织计算机组织 寄存器的名称和用途寄存器的名称和用途(通用通用/专用专用)内存单元的地址和内容内存单元的地址和内容 寄存器与存储器的比较寄存器与存储器的比较实模式下实模式下段段的概念的概念物理物理地址和地址和逻辑逻辑地址地址(段地址和偏移地址段地址和偏移地址)实模式与保护模式的含义实模式与保护模式的含义汇编汇编语言语言80 x86的寄存器结构:的寄存器结构:AH AX AL BH BX BL CH CX CL DH DX DL SP BP SI DI IP FLAGS CS DS SS ES8086/8088/80286 寄寄 存存 器器EAXEBXECXEDXESPEBPESIEDIEIP EFLAGS FSGS80 x86的程序可见寄存器组的程序可见寄存器组通用寄存器通用寄存器专用寄存器专用寄存器段寄存器段寄存器 汇编汇编语言语言OFOF DFDF IFIF TFTF SFSF ZFZF AFAF PFPF CFCF 8086/8088OFOF DFDF IFIF TFTF SFSF ZFZF AFAF PFPF CFCF IOPLIOPLNTNT 80286 RFRF OFOF DFDF IFIF TFTF SFSF ZFZF AFAF PFPF CFCF IOPLIOPLNTNTVMVM 80386 RFRF OFOF DFDF IFIF TFTF SFSF ZFZF AFAF PFPF CFCF IOPLIOPLNTNTVMVMACAC 80486 RFRF OFOF DFDF IFIF TFTF SFSF ZFZF AFAF PFPF CFCF IOPLIOPLNTNTVMVMACACIDID VIPVIPVIFVIF31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 031 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0Pentium80 x86的标志寄存器的标志寄存器汇编汇编语言语言汇编汇编语言语言寄寄 存存 器器 存存 储储 器器 在在CPU内部内部 在在CPU外部外部访问速度快访问速度快 访问速度慢访问速度慢容量小,成本高容量小,成本高 容量大,成本低容量大,成本低用名字表示用名字表示 用地址表示用地址表示没有地址没有地址 地址可用各种方式形成地址可用各种方式形成汇编汇编语言语言第三章第三章 指令系统和寻址方式指令系统和寻址方式 篇幅大,内容多,需要精心组织篇幅大,内容多,需要精心组织什么是什么是寻址寻址(数据数据 代码代码)各种寻址方式的适用场合、所用寄存器的限制、各种寻址方式的适用场合、所用寄存器的限制、扩展后寻址方式扩展后寻址方式(比例因子比例因子)的新特征的新特征eaxebxecxedxespebpesiedieaxebxecxedxespebpesiedi+1248*+None8-bit16-bit32-bitOffset=BaseIndexscaledisplacement汇编汇编语言语言访问存储器的方式访问存储器的方式 偏移地址偏移地址 默认的默认的段寄存器段寄存器可跨越的可跨越的段寄存器段寄存器取指令取指令 CS 无无 IP堆栈操作堆栈操作 SS 无无 SP一般数据访问一般数据访问 DS CS ES SS EABP 作为基址的寻址作为基址的寻址 SS CS DS ES BP串操作的源操作数串操作的源操作数 DS CS ES SS SI串操作的目的操作数串操作的目的操作数 ES 无无 DI段段 寄寄 存存 器器 的的 使使 用用 规规 定定汇编汇编语言语言指令系统分类:指令系统分类:数据传送指令数据传送指令算术指令算术指令逻辑指令逻辑指令串处理指令串处理指令控制转移指令控制转移指令处理机控制与杂项操作指令处理机控制与杂项操作指令重点关注:重点关注:指令的汇编格式指令的汇编格式指令的基本功能指令的基本功能指令支持的寻址方式指令支持的寻址方式指令的执行对标志位的影响指令的执行对标志位的影响指令的特殊要求指令的特殊要求大量练习,尽早上机大量练习,尽早上机汇编汇编语言语言指令隐含使用寄存器(乘法除法、串处理、指令隐含使用寄存器(乘法除法、串处理、IN/OUT等)等)一条指令对应多项操作(一条指令对应多项操作(PUSH/POP/CALL/RET串处理的串处理的MOVS/STOS/LODS/CMPS指令等)指令等)加、减、求补指令对加、减、求补指令对 CF/OF 的影响的影响与与 REP/REPE/REPNE 配合工作的串处理指令配合工作的串处理指令(1)如如(CX)=0 或或 ZF=0 则退出,否则转则退出,否则转(2)(2)(CX)(CX)-1(3)执行执行 CMPS /SCAS(4)重复重复(1)(3)汇编汇编语言语言循环指令循环指令LOOP/LOOPZ/LOOPNZ执行步骤:执行步骤:(1)(CX)(CX)-1 (2)是否满足测试条件是否满足测试条件汇编汇编语言语言80 x86 的指令系统:的指令系统:(1)指令集的指令集的 32 位扩展位扩展 *所有所有 16 位指令都可扩展到位指令都可扩展到 32 位位 MOV EAX,1 *可使用可使用 32 位的存储器寻址方式位的存储器寻址方式 MOV EAX,EDX(2)使用方式的扩展使用方式的扩展 *IMUL:单操作数指令:单操作数指令 双操作数指令双操作数指令/三操作数指令三操作数指令 IMUL REG,SRC *PUSH:允许使用立即数寻址方式:允许使用立即数寻址方式 PUSH 36H *移位指令:移位次数可用移位指令:移位次数可用 8 位立即数位立即数(131)(3)新增指令新增指令标号标号 指令指令 寄存器寄存器 说明程序或语句的功能说明程序或语句的功能变量变量 伪指令伪指令 标号标号 宏指令宏指令 变量变量 常数常数 表达式表达式源程序的每条语句可表示为:源程序的每条语句可表示为:名字名字 操作操作 操作数操作数 ;注释注释 标号标号/变量:变量:段值、偏移量、类型三种属性段值、偏移量、类型三种属性 表达式:表达式:数字表达式数字表达式 地址表达式地址表达式汇编汇编语言语言第四章第四章 汇编语言程序格式汇编语言程序格式实模式编程实模式编程 保护模式编程(保护模式编程(DOS编程编程 WIN32编程)编程)完整段定义完整段定义 简化段定义简化段定义完整段定义完整段定义data data segment segment ;定义数据段定义数据段 data data endsendsextra extra segmentsegment ;定义附加段定义附加段 extra extra endsendscode code segmentsegment ;定义代码段定义代码段 assume cs:assume cs:code,code,ds:ds:data,data,es:es:extraextrastart:start:mov ax,data mov ax,data mov ds,ax mov ds,ax ;段地址段地址 段寄存器段寄存器 code code endsends end end startstartPSPPSPDSDSESESSSSSCSCSEXE 程序的内存映象图程序的内存映象图装装入入模模块块文文件件头头汇编汇编语言语言code segmentcode segmentmain proc farmain proc far assume assume start:start:mov ax,4c00h mov ax,4c00h int 21h int 21hmain endpmain endpcode endscode ends end start end start几种返回形式:几种返回形式:汇编汇编语言语言code segmentcode segmentmainmain proc far proc far assume assume push ds push ds mov ax,0 mov ax,0 push ax push ax ret retmainmain endp endpcode endscode ends end end mainmaindata segmentdata segment data endsdata endsstack segment stack segment dw 100 dup(?)dw 100 dup(?)tos label word tos label wordstack endsstack endscode segmentcode segmentmain proc farmain proc far assume cs:code,ds:data,assume cs:code,ds:data,ss:stackss:stackstart:start:mov ax,stackmov ax,stack mov ss,ax mov ss,ax mov sp,offset tos mov sp,offset tos push ds push ds sub ax,ax sub ax,ax push ax push ax mov ax,data mov ax,data mov ds,ax mov ds,ax ret retmain endpmain endpcode endscode ends end start end startPSPPSPDSDSESESSSSSCSCS带堆栈段的汇编源程序:带堆栈段的汇编源程序:汇编汇编语言语言 tostos 100字字00C8H00C8H spspstack segment stack segment dw 100 dup(?)dw 100 dup(?)tos label word tos label wordstack endsstack ends mov ax,stack mov ax,stack mov ss,ax mov ss,ax mov sp,offset tos mov sp,offset tos push ds push ds sub ax,ax sub ax,ax push ax push ax堆栈段的情况:堆栈段的情况:汇编汇编语言语言PSPPSPDSDSESESSSSSCSCSdata segmentdata segment data endsdata endsstack segment stack segment stackstack dw 100 dup(?)dw 100 dup(?)tos label word tos label wordstack endsstack endscode segmentcode segmentstart:start:push ds push ds sub ax,ax sub ax,ax push ax push ax mov ax,data mov ax,data mov ds,ax mov ds,ax retretcode endscode ends end start end start汇编汇编语言语言int main()int ar0=0,1,2;int ar1=1,2,3;int ar2=2,3,4;int*p=ar0,ar1,ar2;汇编汇编语言语言C/C+中定义的局部变量中定义的局部变量(数组数组)在堆栈中的分布:在堆栈中的分布:0012FF5C 20012FF60 30012FF64 4ar20012FF68 10012FF6C 20012FF70 3ar10012FF74 00012FF78 10012FF7C 2ar00012FF50 0012FF740012FF54 0012FF680012FF58 0012FF5Cp.model small.model small.data.data.code.code.startup.startup .exit.exit 0 0end end .model small .model small .data .data .code .codestartstart:mov ax,datamov ax,data mov ds,ax mov ds,ax mov ax,4c00h mov ax,4c00h int 21h int 21h end end startstart .model small .model small .const .const .data .data .code .codestartstart:mov ax,DGROUPmov ax,DGROUP mov ds,ax mov ds,ax mov ax,4c00h mov ax,4c00h int 21h int 21h end end startstart汇编汇编语言语言简化段定义简化段定义汇编汇编语言语言完整段定义和简化段定义的区别:完整段定义和简化段定义的区别:描述信息描述信息 数据和代码的分布不同数据和代码的分布不同data segmentdata segment string1 db thamks you string1 db thamks you mass1 db match.,13,10,$mass1 db match.,13,10,$mass2 db no match!,13,10,$mass2 db no match!,13,10,$data endsdata endsextra segmentextra segment string2 db thanks you string2 db thanks youextra endsextra ends汇编汇编语言语言.data .data string1 db thamks you string1 db thamks you string2 db thanks youstring2 db thanks you mass1 db match.,13,10,$mass1 db match.,13,10,$mass2 db no match!,13,10,$mass2 db no match!,13,10,$数据定义伪操作数据定义伪操作与高级语言与高级语言(数据类型与变量定义数据类型与变量定义)类比类比 总结总结 分类分类数据类型数据类型字符和字符串字符和字符串AsciiNULL db0szMsgdb“HelloWorld!”,13,10,0szBufferdb256dup(?)lib_nameBYTE“masm32libkernel32.lib”整数和整数数组整数和整数数组dwFlagdw0ffffhval1SWORD-32768;最小的最小的16位有符号数位有符号数val2BYTE255;最大的最大的8位无符号数位无符号数MASM6.0以上的编译器专门提供了无符号数定以上的编译器专门提供了无符号数定义伪指令(义伪指令(BYTE、WORD、DWORD等)和有符号数定义等)和有符号数定义伪指令(伪指令(SBYTE、SWORD、SDWORD等)。等)。例:例:array1SDWORD1,2,3,4,5,6,7,8,9,10array2BYTE41h,42h,43h,44h,45h,46h,47h,48h,49h,4ah,4bh,4ch,4dh,4eh,4fh,50h,51h,52h,53h,54h,55h,56h,57h,58h,59h,5aharray3BYTE“ABCDEFGHIJKLMNOPQRSTUVWXYZ”array4SWORD1,0,0,0SWORD0,1,0,0SWORD0,0,1,0SWORD0,0,0,1array5SWORD1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1例:例:array3BYTE“ABCDEFGHIJKLMNOPQRSTUVWXYZ”cldmovesi,offsetarray3movedi,esimovecx,lengthofarray3again:lodsbaddal,20hstosbloopagain指针指针;定义目标数据对象定义目标数据对象val1SWORD-32768array3BYTE“ABCDEFGHIJKLMNOPQRSTUVWXYZ”;定义指针定义指针lp1DWORD val1;保护模式下用保护模式下用DWORD,实模式下用实模式下用WORDlp2DWORD array3或者:或者:lp1DWORD offsetval1lp2DWORD offsetarray3使用使用typedef操作符自定义指针类型:操作符自定义指针类型:lpSWORDtypedefPTRSWORDlpBYTEtypedefPTRBYTElp1lpSWORDval1lp2lpBYTEarray3例:例:lpBYTEtypedefPTRBYTE.dataarray3BYTE“ABCDEFGHIJKLMNOPQRSTUVWXYZ”lplpBYTEarray3.codemov edi,lpmov ecx,lengthofarray3again:add BYTEPTRedi,20hadd edi,typearray3loopagain结构结构STUDENTstruct;定义结构类型定义结构类型STUDENTidBYTE“?”;学号学号szName BYTE18dup(?);姓名姓名ageBYTE?;年龄年龄sexBYTE?;性别性别STUDENTends定义变量定义变量.datastu1 STUDENT;初始化初始化stu2 STUDENT;未初始化未初始化SYSTEMTIME struct;windows.incwYearWORD?;年年(4位数位数)wMontWORD?;月月1,12wDayOfWeekWORD?;星期星期0,6wDayWORD?;日日1,31wHourWORD?;时时0,23wMinuteWORD?;分分0,59wSecondWORD?;秒秒0,59wMilliseconds WORD?;毫秒毫秒0,999SYSTEMTIME ends.datactimeSYSTEMTIME;未初始化,存放获取的当前时间未初始化,存放获取的当前时间GetLocalTimePROTO:DWORD;带一个结构变量地址参数带一个结构变量地址参数invokeGetLocalTime,addrctime;addr用于取变量地址用于取变量地址2009(十六进制(十六进制07D9)年)年8月月8日星期六日星期六11时时01分分18秒秒906毫秒毫秒联合联合CHARTYPEunion;定义定义联合类型联合类型CHARTYPEUnicodeChar WORD?AsciiCharBYTE?CHARTYPE endschar1CHARTYPE;Ascii字符字符“a”char2CHARTYPE;Unicode字符字符“好好”IMAGE_SYMBOLstruct;定义结构类型定义结构类型IMAGE_SYMBOL unionN;结构中内嵌联合结构中内嵌联合NShortNamedb8dup(?)structName1;联合中内嵌结构联合中内嵌结构Name1Short1dd?Long1dd?endsLongNamedd2dup(?)ends Valuedd?SectionNumberdw?Type1dw?StorageClassdb?NumberOfAuxSymbolsdb?IMAGE_SYMBOLends记录记录变量定义变量定义变量名变量名:除了字母、数字(不能是首字符)和下划线,还可以使用除了字母、数字(不能是首字符)和下划线,还可以使用、$和和?全局变量全局变量 定义在定义在.data或或.data?段中,作用域是整个程序,具有静段中,作用域是整个程序,具有静态(全局)生存期。态(全局)生存期。.dataszMsgdb“HelloWorld!”,13,10,0arraySDWORD10dup(?)局部变量局部变量LOCAL变量名变量名1重复数量重复数量:类型类型,变量名变量名2重复数量重复数量:类型类型例如:例如:LOCALstr16:BYTELOCALvarLOCALctime:SYSTEMTIMELOCALlp:lpBYTE全局变量与局部变量的存储特性全局变量与局部变量的存储特性汇编汇编语言语言全局变量与局部变量的地址获取全局变量与局部变量的地址获取moveax,offsetvar1;var1是全局变量是全局变量或者:或者:leaeax,var1invokeGetMessage,ADDRmsg 对局部变量而言,由于保存在堆栈中,它们的地址与对局部变量而言,由于保存在堆栈中,它们的地址与esp或或ebp有关,只有在程序运行时才能确定下来。因此不能用有关,只有在程序运行时才能确定下来。因此不能用offset操作符,操作符,而只能用而只能用lea。在实模式下使用在实模式下使用32bit操作数操作数目的:在实模式下发挥目的:在实模式下发挥80386及其后继机型的优势及其后继机型的优势充分利用充分利用32bit字长字长32bit寄存器可用来寻址寄存器可用来寻址与比例因子有关的寻址方式可用与比例因子有关的寻址方式可用使用新增的指令使用新增的指令汇编汇编语言语言实模式下混合的实模式下混合的16bit与与32bit指令举例:指令举例:adceax,dimovdwordptrdq_data,eaxsubebx,edxmovah,byte_tableesimovword_tableesi*2,axaddeax,arrayebx*4movdwordptrresult+4ebx*8,edx汇编汇编语言语言上机环境上机环境命令行命令行PWBMASM一系列版本一系列版本MASM32VC+6.0调试工具调试工具DEBUGDEBUG32CODEVIEW中间文件中间文件LST文件文件CRF文件文件MAP文件文件汇编汇编语言语言汇编汇编语言语言汇编汇编语言语言第五章第五章 循环与分支程序循环与分支程序 从这章开始涉及编程方法与技巧,尽管所举例子可从这章开始涉及编程方法与技巧,尽管所举例子可能在高级语言中也出现过,学生并不陌生,但学生的困能在高级语言中也出现过,学生并不陌生,但学生的困难在于难在于对这种表现形式的不习惯对这种表现形式的不习惯,特别是转移指令、循,特别是转移指令、循环指令的用法。环指令的用法。高级语言的高级语言的for while if else翻译过来也是一大堆这翻译过来也是一大堆这样的形式,我们直接用汇编这样写,会比高级语言效率样的形式,我们直接用汇编这样写,会比高级语言效率更高。更高。对于处理一些特定的问题如对于处理一些特定的问题如地址表、逻辑尺地址表、逻辑尺,汇编,汇编有其独特的优势。我们也会涉及一些经典算法如有其独特的优势。我们也会涉及一些经典算法如冒泡排冒泡排序、折半查找序、折半查找,重点让学生感受汇编与高级语言在表现,重点让学生感受汇编与高级语言在表现形式上的相同与不同。形式上的相同与不同。用高级伪指令实现分支用高级伪指令实现分支和循环和循环.if/.else/.endif.while/.endw.repeat/.until.break/.continue标号的使用标号的使用:标号用来标识代码段中转移指令的目标位置标号用来标识代码段中转移指令的目标位置,它,它有两种出现形式:有两种出现形式:标号标号:目标指令目标指令;一个冒号,作用域仅限当前过程一个冒号,作用域仅限当前过程或者或者标号标号:目标指令目标指令;两个冒号,作用域是整个程序两个冒号,作用域是整个程序在默认情况下,标号后跟一个冒号,作用域是当前过程,标号仅对在默认情况下,标号后跟一个冒号,作用域是当前过程,标号仅对其所在过程内的语句可见,不同过程中的标号可以重名;其所在过程内的语句可见,不同过程中的标号可以重名;在少数情况下,后跟两个冒号的标号被声明成全局的在少数情况下,后跟两个冒号的标号被声明成全局的:mainprocstart:;全局标号,后跟两个冒号全局标号,后跟两个冒号retmainendpendstart标号的命名规范也与变量相同,除字母、数字(不能是首字符)、标号的命名规范也与变量相同,除字母、数字(不能是首字符)、下划线外,还可以使用下划线外,还可以使用、$和和?L1:cmpeax,ebxjnlL2;向前跳转向前跳转inceaxdecebxjmpL1;向后跳转向后跳转L2:movecx,0高版本的高版本的MASM支持用支持用取代标号,而不用给它们取名字:取代标号,而不用给它们取名字::cmpeax,ebxjnlF;向前跳转,向前跳转,F表示本条指令后的第一个表示本条指令后的第一个标号标号inceaxdecebxjmpB;向后跳转,向后跳转,B表示本条指令前的第一个表示本条指令前的第一个标号标号:movecx,0当需要进行较为复杂的比较(比如当需要进行较为复杂的比较(比如(ab)&(ceax;array是双字变量是双字变量(ebx=1)&(ebx=10);不能写成不能写成(1=ebx)&(ebx=10);短路求值短路求值操作符操作符!=!=&|例:例:CARRY?|ZERO?.if伪指令的实现细节伪指令的实现细节例:例:.dataszMsgBYTE“My.obj-0error(s),2warning(s)”,0.code movebx,0compare:moval,szMsgebx.ifal=0;遇到结束标志遇到结束标志jmpexit.elseifal=a&al=A&al=0&al=9incedi.elseincedx.endifaddebx,typeszMsgjmpcompareexit:ret.while条件表达式条件表达式指令块指令块.break.if退出条件退出条件.continue.endw.repeat指令块指令块.break.if退出条件退出条件.continue.until条件表达式条件表达式(.untilcxz条件表达式条件表达式)条件表达式的值为条件表达式的值为“假假”时继续循环,也就是说循环时继续循环,也就是说循环直到条件表达式的值为直到条件表达式的值为“真真”时结束。时结束。用用.while/.repeat实现循环实现循环lpBYTEtypedefPTRBYTE.dataszMsgBYTEMy.obj-0error(s),2warning(s),0lpszMsglpBYTEszMsg.codemoval,0movesi,lpszMsg.whileesi!=alincesi.endwsubesi,lpszMsg例:统计字符串的长度例:统计字符串的长度.while1.break.ifesi=alincesi.endwmovesi,lpszMsgmovecx,0decesi.repeatincecxincesi.untilBYTEPTResi=0dececx例:统计字符串的长度(换一种写法)例:统计字符串的长度(换一种写法)movesi,lpszMsgmovecx,0.whileBYTEPTResi!=0moval,esiincesi.ifalz.continue.endifincecx.en
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服