




已阅读5页,还剩99页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 汇编语言的特点 汇编语言是一种以处理器指令系统为基础的低级程序设计语言 它采用助记符表达指令操作码 采用标识符号表示指令操作数利用汇编语言编写程序的主要优点是可以直接 有效地控制计算机硬件 因而容易创建代码序列短小 运行快速的可执行程序在有些应用领域 汇编语言的作用是不容置疑和无可替代的汇编程序设计的过程是与其他高级语言程序设计大致相同 第4章 教学重点 汇编语言源程序格式与开发常量 变量和标号汇编语言程序设计方法顺序程序设计分支程序设计循环程序设计子程序设计 第4章 4 1汇编语言源程序格式 完整的汇编语言源程序由段组成一个汇编语言源程序可以包含若干个代码段 数据段 附加段或堆栈段 段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段 并指示程序执行的起始点 一个程序只有一个起始点所有的可执行性语句必须位于某一个代码段内 说明性语句可根据需要位于任一段内通常 程序还需要一个堆栈段 源程序由语句序列构成 第4章 汇编语言的语句格式 执行性语句 执行性语句用于表达处理器指令 也称为硬指令 汇编后对应一条指令代码 由处理器指令组成的代码序列是程序设计的主体标号 硬指令助记符操作数 操作数 注释 说明性语句 说明性语句用于表达伪指令 指示源程序如何汇编 变量怎样定义 过程怎么设置等名字伪指令助记符参数 参数 注释 第4章 硬指令与伪指令 硬指令 Instruction 使CPU产生动作 并在程序执行时才处理的指令硬指令就是第3章学习的处理器指令 与具体的处理器有关 与汇编程序无关伪指令 Directive 不产生CPU动作 在程序执行前由汇编程序处理的说明性指令伪指令与具体的处理器类型无关 但与汇编程序有关 不同版本的汇编程序支持不同的伪指令 硬指令和伪指令采用易于记忆的符合表达 这就是助记符 第4章 标号 名字与标识符 标号是反映硬指令位置 逻辑地址 和属性的标识符 后跟一个冒号分隔名字是反映伪指令位置 逻辑地址 和属性的标识符 后跟空格或制表符分隔 没有冒号标识符 Identifier 一般最多由31个字母 数字及规定的特殊符号 如 组成 不能以数字开头 默认情况下 汇编程序不区别标识符中的字母大小写一个源程序中 每个标识符的定义是唯一的 还不能是汇编语言采用的保留字 第4章 保留字 保留字 ReservedWord 是汇编程序已经利用的标识符 也称为关键字 主要有 硬指令助记符 例如 MOV ADD伪指令助记符 例如 DB DW操作符 例如 OFFSET PTR寄存器名 例如 AX CS预定义符号 例如 data 汇编语言大小写不敏感 第4章 操作数和参数 处理器指令的操作数可以是立即数 寄存器和存储单元伪指令的参数可以是常数 变量名 表达式等 可以有多个 参数之间用逗号分隔 第4章 注释 语句中由分号 开始的部分为注释内容 用以增加源程序的可读性必要时 一个语句行也可以由分号开始作为阶段性注释汇编程序在翻译源程序时将跳过该部分 不对它们做任何处理 第4章 分隔符 语句的4个组成部分要用分隔符分开标号后用冒号 注释前用分号操作数之间和参数之间使用逗号分隔其他部分通常采用空格或制表符多个空格和制表符的作用与一个相同MASM支持续行符 第4章 例4 1在屏幕上显示一段信息 数据段 定义要显示的字符串 stringdb Hello Assembly 0dh 0ah 代码段 显示字符串的程序 movdx offsetstringmovah 9int21h Hello Assembly 第4章 简化段定义格式 modelsmall 定义程序的存储模式 小型模式 stack 定义堆栈段 默认是1KB空间 data 定义数据段 数据定义 code 定义代码段start movax data 程序起始点movds ax 设置DS指向用户定义的数据段 程序代码movax 4c00hint21h 程序结束点 返回DOS 子程序代码endstart 汇编结束 同时指明程序起始点start 第4章 第一个源程序文件sample01 asm sample01 asm modelsmall stack datastringdb Hello Assembly 0dh 0ah codestart movax datamovds axmovdx offsetstringmovah 9int21hmovax 4c00hint21hendstart 第4章 汇编语言程序的开发过程 附录B 源程序 文件名 asm 目标模块 文件名 obj 可执行文件 文件名 exe 错误 开发过程1 源程序的编辑 源程序文件要以ASM为扩展名源程序文件的形成 编辑 可以通过任何一个文本编辑器实现 DOS中的全屏幕文本编辑器EDIT其他程序开发工具中的编辑环境Windows中的记事本NotepadEDITsample01 asm 开发过程2 源程序的汇编 MASM6 x 汇编是将源程序翻译成由机器代码组成的目标模块文件的过程MASM6 x提供的汇编程序是ML EXE ML csample01 asm如果源程序中没有语法错误 MASM将自动生成一个目标模块文件 sample01 obj 否则MASM将给出相应的错误信息 这时应根据错误信息 重新编辑修改源程序后 再进行汇编 开发过程2 源程序的汇编 MASM5 x MASM5 x提供的汇编程序是MASM EXE MASMsample01 asm 如果利用分号 结尾命令 则汇编程序不再提示输入模块文件名 列表文件名等 直接采用默认的文件名 默认采用源程序文件相同的主文件名 扩展名则是相应类型文件的扩展名 例如模块文件 obj 和列表文件 lst 等 开发过程2 源程序的汇编 生成列表文件 汇编过程中 可以通过参数选择生成列表文件 LST 列表文件是一种文本文件 含有源程序和目标代码 对我们学习汇编语言程序设计和发现错误很有用汇编程序ML EXE和MASM EXE都可带其他参数 为了生成列表文件 各自的命令是 ML Flsample01 asmMASM lsample01 asm 该命令除产生模块文件sample01 obj 和可执行文件sample01 exe 外 还将生成列表文件sample01 lst 开发过程3 目标模块的连接 连接程序能把一个或多个目标文件和库文件合成一个可执行程序 EXE COM文件 LINKsample01 obj 如果没有严重错误 LINK将生成一个可执行文件 sample01 exe 否则将提示相应的错误信息 这时需要根据错误信息重新修改源程序文件后再汇编 链接 直到生成可执行文件ML EXE汇编程序 MASM6 x 可自动调用LINK连接程序 实现汇编和连接的依次进行MLsample01 asm 开发过程4 可执行程序的调试 经汇编 连接生成的可执行程序在操作系统下只要输入文件名就可以运行 sample01操作系统装载该文件进入主存 并开始运行如果出现运行错误 可以从源程序开始排错 也可以利用调试程序帮助发现错误采用DEBUG EXE调试程序 DEBUGsample01 exe 第4章 1 存储模式 MemoryModel 存储模式决定了一个程序的规模 也确定了子程序调用 指令转移和数据访问等的缺省属性当使用简化段定义的源程序格式时 必须有存储模式 MODEL语句 且位于所有简化段定义语句之前 其格式为 MODEL存储模式 MODEL语句确定了程序采用的存储模式 MASM有7种可以选择 如表4 1所示 本课程学习过程中 均采用小型模式SMALL 第4章 2 逻辑段的简化定义 STACK 大小 堆栈段定义伪指令 STACK创建一个堆栈段 段名是 STACK 可选的 大小 参数指定堆栈段所占存储区的字节数 默认是1KB 1024 400H字节 DATA 数据段定义伪指令 DATA创建一个数据段 段名是 DATA 数据段名可用 DATA预定义标识符表示 CODE 段名 代码段定义伪指令 CODE创建一个代码段 可选的 段名 参数指定该代码段的段名 如果没有给出段名 则采用默认段名 一个段的开始自动结束前面的一个段简化段定义伪指令之前 需有存储模式语句 第4章 3 程序开始 为了指明程序开始执行的位置 需要使用一个标号 例题中采用了start标识符 连接程序会根据程序起始点正确地设置CS和IP值 根据程序大小和堆栈段大小设置SS和SP值连接程序没有设置DS和ES值 程序如果使用数据段或附加段 必须明确给DS或ES赋值大多数程序需要数据段 程序的执行开始应是 start movax data data表示数据段的段地址movds ax 设置DS 第4章 4 程序终止 应用程序执行结束 应该将控制权交还操作系统汇编语言程序设计中 有多种返回DOS的方法 但一般利用DOS功能调用的4CH子功能实现 它需要的入口参数是AL 返回数码 通常用0表示程序没有错误 于是 应用程序的终止代码就是 movax 4c00hint21h 第4章 5 汇编结束 汇编结束表示汇编程序到此结束将源程序翻译成目标模块代码的过程源程序的最后必须有一条END伪指令END 标号 可选的 标号 参数指定程序开始执行点 连接程序据此设置CS和IP值 例题中采用了start标识符 不要糊涂 程序终止和汇编结束是两码事 第4章 第一个源程序文件sample01 asm sample01 asm modelsmall stack datastringdb Hello Assembly 0dh 0ah codestart movax datamovds axmovdx offsetstringmovah 9int21hmovax 4c00hint21hendstart 第4章 简化段定义的源程序格式 modelsmall 小型模式存储模式 stack 1KB空间堆栈段 data 数据段 数据定义 code 代码段start movax data 起始点movds ax 设置DS 程序代码movax 4c00hint21h 结束点 返回DOS 子程序代码endstart 汇编结束 第4章 完整段定义格式 完整段定义利用SEGMENT和ENDS一对伪指令定义逻辑段同时需要配合ASSUME伪指令指明逻辑段是代码段 堆栈段 数据段还是附加段完整段定义的优势是可以指明逻辑段的定位 组合 类别等属性 而简化段定义只能采用系统默认的属性完整段定义和简化段定义的实质是一致的 第4章 可执行程序的结构 DOS操作系统支持两种可执行程序结构1 EXE程序程序可以有多个代码段和多个数据段 程序长度可以超过64KB通常生成EXE结构的可执行程序2 COM程序只有一个逻辑段 程序长度不超过64KB需要满足一定条件才能生成COM结构的可执行程序 MASM6 x需要采用TINY模式 第4章 4 2常量 变量和标号 汇编语言的数据可以简单分为常量和变量常量可以作为硬指令的立即数或伪指令的参数 变量主要作为存储器操作数汇编语言语句中的名字和标号具有逻辑地址和类型属性 主要用做地址操作数 也可以作为立即数和存储器操作数本节将详细讨论语句中的参数和操作数 名字和标号 并引出相关的伪指令和操作符 第4章 常量 常量表示一个固定的数值 它又分成多种形式常数字符串符号常量数值表达式 第4章 1 常数 指由10 16 2和8进制形式表达的数值 各种进制的数据以后缀字母区分 默认不加后缀字母的是十进制数 第4章 2 字符串 字符串常量是用单引号或双引号括起来的单个字符或多个字符其数值是每个字符对应的ASCII码值例如 d 等于64H AB 等于4142H Hello Assembly 第4章 3 符号常量 符号常量使用标识符表达一个数值MASM提供等价机制 用来为常量定义符号名符号定义伪指令有 等价EQU 和 等号 符号名EQU数值表达式符号名EQU MASM5 x不支持符号名 数值表达式EQU用于数值等价时不能重复定义符号名 但 允许有重复赋值 例如 X 7 等效于 Xequ7X X 5 XEQUX 5 是错误的 第4章 4 数值表达式 数值表达式一般是指由运算符连接的各种常量所构成的表达式汇编程序在汇编过程中计算表达式 最终得到一个确定的数值 所以也是常量表达式的数值在程序运行前的汇编阶段计算 所以组成表达式的各部分必须在汇编时就能确定汇编语言支持多种运算符我们经常使用的是加减乘除 例如 movax 3 4 5 等价于 movax 17 第4章 变量 变量实质上是指内存单元的数据 虽然内存单元地址不变 但其中存放的数据可以改变变量需要事先定义才能使用变量定义 Define 伪指令为变量申请固定长度为单位的存储空间 并可以同时将相应的存储单元初始化定义后的变量可以利用变量名等方法引用其中的数据 即变量的数值 第4章 1 变量的定义 变量定义的汇编语言格式为 变量名伪指令初值表变量名为用户自定义标识符 表示初值表首元素的逻辑地址 常称为符号地址 变量名也可以没有初值表是用逗号分隔的参数 主要由常量 数值表达式或 组成 其中 表示未赋初值多个存储单元如果初值相同 可以用复制操作符DUP进行定义 重复次数DUP 重复参数 变量定义伪指令有DB DW DD等 表3 5 第4章 字节变量的定义DB DefineByte DB伪指令用于分配一个或多个字节单元 并可以将它们初始化为指定值初值表中每个数据一定是字节量 存放一个8位数据 可以是0 255的无符号数或是 128 127带符号数也可以是字符串常数 实例 字节变量定义实例 数据段Xdb a 5db2dup 100 Ydb ABC 应用 第4章 字节变量的应用 moval X 此处X表示它的第1个数据 故AL a decX 1 对X为始的第2个数据减1 故成为 6movY al 现在Y这个字符串成为 aBC 第4章 字变量的定义DW DefineWord DW伪指令用于分配一个或多个字单元 并可以将它们初始化为指定值初值表中每个数据是字量 一个字单元可用于存放任何16位数据 一个段地址一个偏移地址两个字符0 65535之间的无符号数 32768 32767之间的带符号数 字变量定义实例 数据段countdw8000h AB maxintequ64hnumberdwmaxintarraydwmaxintdup 0 第4章 双字变量的定义DD DefineDoubleword DD伪指令用于分配一个或多个双字单元 并可以将它们初始化为指定值初值表中每个数据是一个32位的双字量 可以是有符号或无符号的32位整数也可以用来表达16位段地址 高位字 和16位的偏移地址 低位字 的远指针varddDD0 12345678hfarpointDD00400078h 第4章 2 变量的应用 变量具有存储单元的逻辑地址程序代码中通过变量名引用其指向的首个数据通过变量名加减位移量存取以首个数据为基地址的前后数据 例题3 2变量的定义和应用 第4章 例题2变量的定义 数据段bvar1db100 01100100b 64h d 字节变量 不同进制表达同一个数值 内存中有4个64Hminint 5 符号常量 minint数值为5 不占内存空间bvar2db 1 minint minint 5 内存中数值依次为FFH 5 0AHdb 2dup 20h 预留一个字节空间 重复定义了2个数值20Hwvar1dw2010h 4 4 字变量 两个数据是2010H 0010H 共占4个字节wvar2dw wvar2是没有初值的字变量 第4章 例题2变量的定义 续 dvardd12347777h 87651111h 双字变量 2个双字数据 一个双字空间abcdb a b c 定义字符 实际是字节变量maxintequ0ah 符号常量 maxint 10stringdb ABCDEFGHIJ 定义字符串 使用字节定义DB伪指令crlfsdb13 10 回车符0DH 换行符0AH和字符 24Harray1dwmaxintdup 0 10个初值为0的字量 可以认为是数组arraydb2dup 2 3 2dup 4 6个字节内容依次为 0203040402030404 第4章 例题2变量的应用 代码段movdl bvar1 DL 100decbvar2 1 bvar2 1 4movabc 3 dl abc abcd movax wordptrdvar 0 取双字到DX AXmovdx wordptrdvar 2 addax wordptrdvar 4 加双字到DX AXadcdx wordptrdvar 6 movwordptrdvar 8 ax 保存双字的求和结果movwordptrdvar 10 dx 第4章 例题2变量的应用 续 movcx maxint CX 10movbx 0 BX 0again addstring bx 3 string每个数值加3incbxloopagain 循环leadx abc 从abc开始movah 9 09H号DOS功能调用int21h 显示结果 abcdDEFGHIJKLM 第4章 3 变量的定位 汇编程序按照指令的先后顺序一个接着一个分配存储空间 按照段定义伪指令规定的边界定位属性确定每个逻辑段的起始位置 包括偏移地址 定位伪指令ORG控制数据或代码所在的偏移地址ORG参数ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址 例如 ORG100h 从100H处安排数据或程序ORG 10 偏移地址加10 即跳过10个字节空间汇编语言程序中 符号 表示当前偏移地址值 第4章 名字和标号的属性 名字和标号是用户自定义的标识符 名字指向一条伪指令 标号指向一条硬指令 名字和标号一经使用便具有两类属性 逻辑地址 名字和标号对应存储单元的逻辑地址 含有段地址和偏移地址 类型 变量名的类型可以是BYTE 字节 WORD 字 和DWORD 双字 等 标号 段名 子程序名的类型可以是NEAR 近 和FAR 远 分别表示段内或段间调用汇编程序提供有关的操作符 以便获取这些属性值 第4章 1 地址操作符 地址操作符取得名字或标号的段地址和偏移地址 第4章 2 类型操作符 类型操作符对名字或标号的类型属性进行设置类型名PTR名字 标号其中可以是BYTE WORD DWORD 依次表示字节 字 双字 等 或者是NEAR FAR 分别表示近 远 还可以是由结构 记录等定义的类型对变量 LENGTHOF操作符获知某变量名指向多少个数据项SIZEOF操作符获知它共占用多少字节空间 第4章 顺序程序设计 没有分支 循环等转移指令的程序 会按指令书写的前后顺利依次执行 这就是顺序程序顺序结构是最基本的程序结构完全采用顺序结构编写的程序并不多见 例题3 4顺序程序设计实例采用查表法 实现一位16进制数转换为ASCII码显示 第4章 例4数据段 数据段ASCIIdb30h 31h 32h 33h 34h 35h 36h 37h 38h 39h 对应0 9的ASCII码db41h 42h 43h 44h 45h 46h 对应A F的ASCII码hexdb04h 0bh 假设两个数据 第4章 例4代码段 代码段movbx offsetASCII BX指向ASCII码表moval hex AL取得一位16进制数 恰好就是ASCII码表中的位移andal 0fh 只有低4位是有效的 高4位清0 xlat 换码 AL DS BX AL XLAT 第4章 例4代码段 续 movdl al 入口参数 DL ALmovah 2 02号DOS功能调用int21h 显示一个ASCII码字符moval hex 1 转换并显示下一个数据andal 0fhxlatmovdl almovah 2int21h XLAT 第4章 分支程序设计 分支程序根据条件是真或假决定执行与否判断的条件是各种指令 如CMP TEST等执行后形成的状态标志转移指令Jcc和JMP可以实现分支控制分支结构有单分支结构双分支结构多分支结构 第4章 单分支结构 条件成立跳转 否则顺序执行分支语句体注意选择正确的条件转移指令和转移目标地址 实例 求绝对值 第4章 计算AX中有符号数的绝对值 cmpax 0jgenonneg 条件满足 AX 0 转移negax 条件不满足 求补nonneg movresult ax 条件满足 不恰当的分支cmpax 0jlyesneg 条件满足 AX 0 转移jmpnonnegyesneg negax 条件不满足 求补nonneg movresult ax 条件满足 第4章 双分支结构 条件成立跳转执行第2个分支语句体 否则顺序执行第1个分支语句体注意第1个分支体后一定要有一个JMP指令跳到第2个分支体后 实例 显示BX的最高位 第4章 显示BX的最高位 shlbx 1 BX最高位移入CF标志jcone CF 1 即最高位为1 转移movdl 30h CF 0 即最高位为0 DL 30H 0 jmptwo 一定要跳过另一个分支体one movdl 31h DL 31H 1 two movah 2int21h 显示 可以用JNC替换JC 第4章 显示BX的最高位 续 shlbx 1 BX最高位移入CF标志jncone CF 0 即最高位为0 转移movdl 31h CF 1 即最高位为1 DL 31H 1 jmptwo 一定要跳过另一个分支体one movdl 30h DL 30H 0 two movah 2int21h 显示 转换为单分支结构 第4章 显示BX的最高位 另解 movdl 0 DL 30H 0 shlbx 1 BX最高位移入CF标志jnctwo CF 0 即最高位为0 转移movdl 1 CF 1 即最高位为1 DL 31H 1 two movah 2int21h 显示 编写分支程序 需留心分支的开始和结束 第4章 显示BX的最高位 无分支 movdl 0shlbx 1 BX最高位移入CF标志adcdl 30h CF 0 DL 0 30h 0 30H 0 CF 1 DL 0 30h 1 31H 1 two movah 2int21h 显示 第4章 例题5显示压缩BCD码 无前导0 数据段BCDdb04h 代码段movdl BCDtestdl 0ffh 如果BCD码为0 显示0jzzero 双分支结构testdl 0f0h 如果BCD码高位为0 不显示0jzone 单分支结构 第4章 例题5显示压缩BCD码 无前导0 续 movcl 4 处理高位shrdl clordl 30h 转换为ASCII码movah 2 显示高位int21hmovdl BCDanddl 0fhone ordl 30h 处理低位jmptwozero movdl 0 two movah 2int21h 第4章 大小写字母转换 参例题3 6 如果DL是一个小写字母 则转换为大写cmpdl a 小于小写字母a 不需要处理jbdispcmpdl z 大于小写字母z 也不需要处理jadispsubdl 20h 是小写字母 则转换为大写disp 转换原理 第4章 多分支结构 多分支结构是多个条件对应各自的分支语句体 哪个条件成立就转入相应分支体执行 orah ah cmpah 0jzfunction0decah cmpah 1jzfunction0decah cmpah 2jzfunction0 第4章 循环程序设计 循环程序结构是满足一定条件的情况下 重复执行某段程序循环结构的程序通常有3个部分 循环初始部分 为开始循环准备必要的条件 如循环次数 循环体需要的数值等循环体部分 指重复执行的程序部分 其中包括对循环条件等的修改程序段循环控制部分 判断循环条件是否成立 决定是否继续循环 关键是什么 第4章 循环控制 循环结构程序的设计关键是循环控制部分循环控制可以在进入循环之前进行 也可以在循环体后进行 于是形成两种结构 先判断 后循环 结构 先循环 后判断 结构循环结束的控制可以用循环次数 还可以用特定条件等 于是又有 计数控制循环条件控制循环 图示 第4章 先循环后判断的循环结构 第4章 计数控制循环 计数控制循环利用循环次数作为控制条件易于采用循环指令LOOP和JCXZ实现初始化 将循环次数或最大循环次数置入CX循环体循环控制 用LOOP指令对CX减1 并判断是否为0 第4章 用二进制显示BL内容 参例3 8 movcx 8 CX 8 循环次数 again shlbl 1 左移进CF 从高位开始显示movdl 0 MOV指令不改变CFadcdl 30h DL 0 30H CF CF若是0 则DL 0 CF若是1 则DL 1 movah 2int21h 显示loopagain CX减1 如果CX未减至0 则循环 计数控制循环先循环后判断 第4章 例9求数组元素的最大值和最小值 数据段arraydw10 假设一个数组 其中头个数据10表示元素个数dw 3 0 20 900 587 632 777 234 34 56 这是一个有符号字量元素组成的数组maxaydw 存放最大值minaydw 存放最小值 初始化 循环次数 元素个数 1循环体 逐个比较求最大 小值循环控制 比较完所有数据 第4章 例9代码段 代码段leasi arraymovcx si 取得元素个数deccx 减1后是循环次数addsi 2movax si 取出第一个元素给AX AX用于暂存最大值movbx ax 取出第一个元素给BX BX用于暂存最小值 初始化 第4章 例9代码段 续 maxck addsi 2cmp si ax 与下一个数据比较jleminckmovax si AX取得更大的数据jmpnextminck cmp si bxjgenextmovbx si BX取得更小的数据next loopmaxck 计数循环movmaxay ax 保存最大值movminay bx 保存最小值 循环体 第4章 条件控制循环 条件控制循环需要利用特定条件判断循环是否结束条件控制循环用条件转移指令判断循环条件转移指令可以指定目的标号来改变程序的运行顺序 如果目的标号指向一个重复执行的语句体的开始或结束 便构成了循环控制结构 第4章 显示以0结尾的字符串 数据段stringdb Letushaveatry 0 代码段movbx offsetstringagain movdl bx cmpdl 0jzdone 为0结束movah 2 不为0 显示int21hincbx 指向下一个字符jmpagaindone 条件控制循环先判断后循环 第4章 例11记录某个字存储单元数据中1的个数 数据段numberdw1110111111100100B 代码段movbx numberxordl dl 循环初值 DL 0again testbx 0ffffh 也可以用cmpbx 0jzdone 全部是0就可以退出循环 减少循环次数shlbx 1 用指令shrbx 1也可以adcdl 0 利用ADC指令加CF的特点进行计数jmpagain 条件控制循环先判断后循环 第4章 例11十进制显示 0 16数值 done cmpdl 10 判断1的个数是否小于10jbdigit 1的个数小于10 转移pushdxmovdl 1 1的个数大于或等于10movah 2 则要先显示一个1int21hpopdxsubdl 10digit adddl 0 显示个数movah 2int21h 单分支结构 第4章 串操作类指令 8086的串操作类指令能对内存中一个连续区域的数据 如数组 字符串等 进行传送 比较等操作 指令有 传送数据串 MOVS STOS LODS检测数据串 CMPS SCAS重复前缀 REP REPZ REPNZ串操作指令采用了特殊的寻址方式利用循环程序也可以实现串操作指令的功能 第4章 子程序设计 把功能相对独立的程序段单独编写和调试 作为一个相对独立的模块供程序使用 就形成子程序子程序可以实现源程序的模块化 可简化源程序结构 可以提高编程效率主程序 调用程序 需要利用CALL指令调用子程序 被调用程序 子程序需要利用RET指令返回主程序 第4章 过程定义和子程序编写 汇编语言中 子程序要用一对过程伪指令PROC和ENDP声明 格式如下 过程名PROC NEAR FAR 过程体过程名ENDP可选的参数指定过程的调用属性 没有指定过程属性 则采用默认属性 第4章 子程序编写注意事项 子程序要利用过程定义伪指令声明 子程序最后利用RET指令返回主程序 主程序执行CALL指令调用子程序 子程序中对堆栈的压入和弹出操作要成对使用 保持堆栈的平衡 子程序开始应该保护使用到的寄存器内容 子程序返回前相应进行恢复 子程序应安排在代码段的主程序之外 最好放在主程序执行终止后的位置 返回DOS后 汇编结束END伪指令前 也可以放在主程序开始执行之前的位置 第4章 例15源程序 sample15 asm modelsmall stack codestart movax datamovds axmoval 主程序提供显示字符calldpchar 调用子程序movax 4c00hint21h 主程序部分 本程序不需要数据段 第4章 例15源程序 续 dpcharproc 过程定义 过程名为dpcharpushax 顺序入栈 保护寄存器pushbxmovbx 0movah 0eh 显示器0EH号输出一个字符功能int10hpopbx 逆序出栈 恢复寄存器popaxret 子程序返回dpcharendp 过程结束endstart 子程序安排在主程序执行终止后的位置 第4章 子程序编写注意事项 续 子程序允许嵌套和递归 子程序可以与主程序共用一个数据段 也可以使用不同的数据段 注意修改DS 还可以在子程序最后设置数据区 利用CS寻址 子程序的编写可以很灵活 例如具有多个出口 多个RET指令 和入口 但一定要保证堆栈操作的正确性 处理好子程序与主程序间的参数传递问题 提供必要的子程序说明信息 第4章 参数传递 主程序与子程序间一个主要问题是参数传递入口参数 输入参数 主程序调用子程序时 提供给子程序的参数出口参数 输出参数 子程序执行结束返回给主程序的参数参数的具体内容传数值 传送数据本身传地址 传送数据的主存地址常用的参数传递方法寄存器共享变量堆栈 第4章 用寄存器传递参数 最简单和常用的参数传递方法是通过寄存器 只要把参数存于约定的寄存器中就可以了由于通用寄存器个数有限 这种方法对少量数据可以直接传递数值 而对大量数据只能传递地址采用寄存器传递参数 注意带有出口参数的寄存器不能保护和恢复 带有入口参数的寄存器可以保护 也可以不保护 但最好能够保持一致 dpchar dpstri HTOASC 第4章 用共享变量传递参数 子程序和主程序使用同一个变量名存取数据就是利用共享变量 全局变量 进行参数传递如果变量定义和使用不在同一个源程序中 需要利用PUBLIC EXTREN声明如果主程序还要利用原来的变量值 则需要保护和恢复利用共享变量传递参数 子程序的通用性较差 但特别适合在多个程序段间 尤其在不同的程序模块间传递数据 第4章 用堆栈传递参数 参数传递还可以通过堆栈这个临时存储区 主程序将入口参数压入堆栈 子程序从堆栈中取出参数 子程序将出口参数压入堆栈 主程序弹出堆栈取得它们采用堆栈传递参数是程式化的 它是编译程序处理参数传递 以及汇编语言与高级语言混合编程时的常规方法 第4章 宏 Macro 汇编 宏是具有宏名的一段汇编语句序列宏需要先定义 然后在程序中进行宏调用由于形式上类似其他指令 所以常称其为宏指令宏指令实际上是一段代码序列的缩写 在汇编时 汇编程序用对应的代码序列替代宏指令因为是在汇编过程中实现的宏展开 所以常称为宏汇编 第4章 1 宏定义 宏定义由一对宏汇编伪指令MACRO和ENDM来完成 格式如下 宏名MACRO 形参
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年环保产业项目可行性研究评估报告
- 成人教育终身学习体系构建与平台运营中的远程教育技术发展趋势报告
- 工业互联网平台数字签名技术规范与工业互联网平台数据治理报告
- 社会实践自我鉴定总结范文
- 大型公司办公室管理制度
- 泵站配电安全管理制度
- 2025年四川省遂宁市中考生物真题(原卷版)
- 土溪镇三公经费管理制度
- 加装电梯出入口管理制度
- 分公司劳务派遣管理制度
- 2019年盲样考核方案汇总
- 天医门符法修炼与祝由移病法
- 义务教育科学课程标准(2022年版)
- 美国CLIA88质量要求
- 货物运输托运单
- 年公开选拔副科级领导干部试题及答案
- 喉镜使用简单介绍PPT课件
- 赴美国自由行旅行英文行程单模板(面签)
- 不停车称重系统
- 中国重汽集团章丘工业园简介-12页word资料
- 检验科生物安全审批记录
评论
0/150
提交评论