




已阅读5页,还剩99页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章80 x86汇编语言程序设计 第一节汇编语言概述第二节汇编语言语句的组成第三节汇编语言的语句第四节宏汇编指令第五节编写完整的汇编语言程序第六节汇编语言程序设计 第一节汇编语言概述 DATASEGMENTSTRINGDB HELLOWORLD 0DH 0AH DATAENDSCODESEGMENTASSUMECS CODE DS DATABEGIN MOVAX DATAMOVDS AX 初始化数据段的段地址MOVAH 09HLEADX STRING 输出字符串INT21HMOVAH 4CHINT21H 调用4CH号系统功能返回DOSCODEENDSENDBEGIN 数据段 代码段 一个简单的8086系统下的汇编语言程序 第二节汇编语言语句的组成 汇编语言程序的语句中包含的元素 字符集保留字与标识符常量 变量与标号表达式及运算符 一 字符集 允许使用的字符 字母 包括大写字母A Z和小写字母a z 数字 包括0 9 特殊字符 包括 及空格 制表符 回车 换行等 注意 除了字符串 字母都是不区分大小写一系列相连的空格 制表符效果相当于一个空格一系列相连的回车换行相当于一次回车换行分号 后一直到行尾的内容都是注释字符 若用于某行的开头 则表示该行是上一行的续行 二 保留字与标识符 1 保留字在汇编语言中有特定意义的词 可分为 指令助记符及指令前缀如 MOV ADD REP等寄存器名如 AX EBX CL等伪指令助记符如 DB SEGMENT等其他保留字 包括运算符 操作符等如 EQ LT OFFSET SEG等 2 标识符 标识符是程序员自己起的名字 如变量名 标号 段名 过程名等标识符的命名规则 标识符必须由字母 数字和几个特殊字符 包括 组成 而且第一个字符不能是数字 否则可能与16进制的数字混淆 标识符不能与某个保留字相同 以免混淆尽量用有意义的英文单词或缩写来命名 以增加程序的可读性 三 常量 变量与标号 1 常量数字常量二进制 以B结尾 如10101010B八进制 以Q结尾 如123Q 67Q十进制 以D结尾 D 可省略 如1234D 5678十六进制 以H结尾 A F开头的数须在前面加 0 如 1234H 0FFFFH字符串常量用单引号或双引号引起来的一个或多个ASCII字符每个字符的值等于其ASCII码值例 A 41H一个字节 12 31H 32H两个字节 2 变量 变量是存放在存储器中的操作数可通过变量的名字来访问变量变量具有三个属性 段属性 即变量所在的段的基地址 偏移量属性 即变量相对于段的起始地址的偏移量 类型属性 包括BYTE 字节 WORD 字 DWORD 双字 FWORD 6字节 QWORD 四字 TBYTE 10字节 等 3 标号 标号是一条指令性语句的起始地址变量具有三个属性 段属性 即变量所在的段的基地址 偏移量属性 即变量相对于段的起始地址的偏移量 类型属性 包括NEAR 近程 即段内 FAR 远程 即段间 四 表达式及运算符 由常量 变量 标号和一些运算符 操作符构成的式子表达式的值在汇编的过程中就已经被汇编程序计算出来运算符的分类 算术运算符逻辑运算符关系运算符属性运算符数值返回操作符 1 算术运算符 五种算术运算 加 减 乘 除 模 MOD合法地址表达式 地址 地址 处在同个段中 地址 常数ADDR1 ADDR2 假设两个地址处在同个段中 ADDR1 1ADDR2 2非法地址表达式 地址 地址 地址 地址 地址 地址 常量 地址 地址 地址 处在不同段中 ADDR1 ADDR2ADDR1 ADDR2ADDR1 2100 ADDR1SEG1 A SEG2 B 假设两个地址处在不同段中 2 逻辑运算符 五种算术运算 与AND 或OR 异或XOR 非NOT 逻辑左移SHL 逻辑右移SHR只用于数字表达式中例 MOVAL 10101010BAND11001100B AL 10001000BMOVAL 10001000BOR01000100B AL 11001100BMOVAX 1000100010001000BXOR1100110011001100B AX 0100010001000100BMOVAX NOT1010101010101010B AX 0101010101010101B 3 关系运算符 六种关系运算符 EQ Equal 相等 NE NotEqual 不等 LT LessThan 小于 LE LessthanorEqual 小于或等于 GT GreatThan 大于 GE GreatthanorEqual 大于或等于 运算结果 关系为真 则运算结果为0FFFFH关系为假 则运算结果为0 4 属性运算符 1 型重新指定操作符PTR功能 临时指定或修改存储器操作数的数据类型属性或地址类型属性格式 类型PTR表达式例 VAR WDW1234HMOVAX VAR W AX 1234HMOVAL BYTEPTRVAR W AL 34H PTR与EQU连用作用 定义与表达式类型不同的新变量名或新标号 但不分配新的存储单元例 数据段定义 DATA BDB1 2 3 4DATA WEQUWORDPTRDATA B代码段 MOVAL DATA B AL 1MOVAX WORDPTRDATA B AL 0201HMOVAX DATA W AL 0201H 第2 3条指令等价 2 类型指定操作符THIS 功能 指定或说明变量或标号的类型例1 DATA WEQUTHISWORDDATA BDB1 2 3 4MOVAL DATA B AL 1MOVAX WORDPTRDATA B AL 0201HMOVAX DATA W AL 0201H例2 ADDR FEQUTHISFARADDR N MOVAX 1JMPADDR F 等价于 JMPFARPTRADDR N 3 短转移操作符SHORT 功能 一般用在JMP指令告诉汇编程序该JMP指令是一个短程转移指令例 JMPSHORTLAB LAB 5 数值返回操作符 1 SEG OFFSET功能 SEG操作符用于求一个标号或变量所在段的基地址OFFSET操作符则用于求标号或变量在段中的地址偏移量例如 对于代码段中的一条指令 2000H 1234HADDR INCCX 段地址 2000H 偏移量 1234H则有 MOVAX SEGADDR AX 2000HMOVAX OFFSETADDR AX 1234H 与指令 LEAAX ADDR 等价 2 TYPE LENTH SIZE 功能 TYPE 求变量的数值类型属性 即变量具有的字节数BYTE 返回1 WORD 返回2 DWORD 返回4 FWORD 返回6 QWORD 返回8 TBYTE 返回10 NEAR 返回0FFH FAR 返回0FEHLENGTH 求变量所占用的内存单元数用于由重复操作符DUP 定义的存储器变量对于其他变量 LENGTH的返回值都是1SIZE 计算变量所占存储器的总字节数关系 SIZE LENGTH TYPE 例 DATA1DW1234HDATA2DB HELLO DATA3DD100DUP 0 表示定义100个值为0的双字MOVAL TYPEDATA1 AL 2MOVAL TYPEDATA2 AL 1MOVAL TYPEDATA3 AL 4MOVBL LENGTHDATA1 BL 1MOVBL LENGTHDATA2 BL 1MOVBL LENGTHDATA3 BL 100MOVCL SIZEDATA1 CL 2 1 2MOVCL SIZEDATA2 CL 1 1 1MOVCL SIZEDATA3 CL 4 100 400 3 字节分离运算符HIGH LOW 功能 HIGH 分离一个字常量或一个地址表达式的高字节LOW 分离一个字常量或一个地址表达式的低字节例 只能用于常量或结果为常量的表达式ADDR1 MOVAL HIGH1234H AL 12HMOVAL LOWADDR1 AL 上一指令 地址偏移量的低8位不能用于变量或寄存器MOVBL HIGHAX 6 运算符的优先级 表达式计算顺序 先处理优先级别高的运算符对于优先级相等的运算符 则按从左至右的顺序进行处理优先级顺序 优先级最高 LENGTH SIZEPTR THIS SEG OFFSET TYPEHIGH LOW MOD SHL SHR EQ NE LT LE GT GENOTANDOR XORSHORT 优先级最低 第三节汇编语言的语句 一 指示性语句格式 里的内容可选 名字 伪指令符操作数 操作数 注释 名字 变量名 段名等 与指令地址无关 后面不能加冒号伪指令符 指定汇编程序要完成的具体操作操作数 常量 变量或表达式等注释 说明 解释当前语句的作用 常用伪指令 处理器选择伪指令数据定义伪指令 包括DB DW DD DF DQ DT符号定义伪指令 包括EQU 段定义伪指令SEGMENT ENDS段组定义伪指令GROUP假定伪指令ASSUME地址对准伪指令ORG EVEN ALIGN定义符号名伪指令LABEL过程定义伪指令PROC ENDP源程序结束伪指令END高级数据结构定义伪指令 1 处理器选择伪指令 功能 处理器的工作模式分类 8086 选择8086指令系统 缺省方式 286 选择80286指令系统 286P 选择80286指令系统 且系统工作在保护模式下 386 选择80386指令系统 386P 选择80386指令系统 且系统工作在保护模式下 486 选择80486指令系统 486P 选择80486指令系统 且系统工作在保护模式下 586 选择Pentium指令系统 586P 选择Pentium指令系统 且系统工作在保护模式下 8087 287 387 选择协处理器 2 数据定义伪指令 功能 为变量分配存储空间格式 变量名 伪指令符操作数 操作数 注释 六种数据定义伪指令 DB 字节定义 每个操作数占1个字节DW 字定义 每个操作数占1个字 即2个字节DD 双字定义 每个操作数的长度为双字 即4个字节DF 6字节定义 每个操作数的长度为6个字节DQ 四字定义 每个操作数的长度为四字 即8个字节DT 10字节定义 每个操作数的长度为10个字节 例 可同时定义多个数据 NUMDW12H 1 定义2个字STRINGDB HELLO 0DH 0AH 定义字符串省略变量名 BUFDB1 10 100DB1 省略变量名 但该数据仍可通过 BUF 3 访问无初始化数据定义 用问号 代替操作数BUFFERDB2 定义4个字节 其中后3个字节不初始化 DUP操作符 格式 重复的次数DUP 重复的内容 例 ARRAYDB3DUP 1 2 等价于 ARRAYDB1 2 1 2 1 2BUF WDW100DUP 定义100个字 但不初始化DUP的嵌套使用 ARRAY2DB2DUP 1 3DUP 0 等价于 ARRAY2DB1 0 0 0 1 0 0 0 地址表达式作为操作数 只能用DW DD定义DW 变量 标号的偏移量DD 变量 标号的段地址和偏移量例 DATA1DWADDR1 1 把ADDR1偏移量加1后存放到DATA1对应的存储单元中DATA2DDDATA1 把DATA1的偏移量和段地址存放到DATA2对应的存储单元中 其中偏移量放低地址 段地址放高地址 地址计数器 表示到目前为止该段已经使用的地址空间例1 设VAR1地址偏移量为1000H 则 VAR1DB100HDUP 之后 1100H 因此 ADDR1DW 等价于 ADDR1DW1100H 也等价于 ADDR1DWADDR1 例2 STRINGDB ABC LENDW STRING LEN的值为STRING的长度 3 符号定义伪指令 1 等价伪指令EQU格式 符号名EQU表达式功能 为常量 表达式及其他各种符号定义一个别名例 NUMEQU12 给数值定义符号名NUM2EQUNUM 10 给12 10 22定义符号名ADDREQUDS BX SI 给寻址表达式定义符号名COUNTEQUCX 给寄存器CX定义符号名CLEAREQUXORAX AX 给指令定义符号名 2 解除伪指令PURGE格式 PURGE符号名 符号名 作用 EQU伪指令不能直接对一个符号名重定义 必须先用PURGE解除例 COUNTEQUCXPURGECOUNTCOUNTEQUCL 3 等号 伪指令格式 符号名 表达式功能 为常量 表达式及其他各种符号定义一个等价的符号名允许对符号名多次重复定义 且以最后一次定义的值为准例 CONST 1 给数值1定义符号名CONSTADDR BP DI 给寻址表达式定义符号名ADDRCONST 0 重定义CONST 4 段定义伪指令SEGMENT ENDS 格式 段名SEGMENT 定位方式 组合方式 使用类型 类名 段中的内容段名ENDS功能 定义一个段例 DATASEGMENTVARDB DATAENDS得到段地址的两种方法 MOVAX DATAMOVAX SEGVAR 1 定位方式作用 设置该段在存储器中的起始边界分类 BYTE 可从任意的绝对地址开始 如12345H WORD 可从偶地址开始 如12346H DWORD 可以任何一个双字的边界开始 如12348H PARA 缺省方式 必须从存储器的16字节的边界开始 如12340H 最后一位为0 PAGE 起始地址必须能被256整除 如12300H 2 类名用单引号括起来的字符串连接定位时 具有相同类名的逻辑段会被组合在一起 3 使用类型 386以上 USE16 缺省类型 表示该段采用16位寻址方式 段基址和段内偏移量都是16位USE32 表示该段采用32位寻址方式 段选择子为16位 段内偏移量则是32位 4 组合方式作用 指定同类名段的组合方法分类 PRIVATE 缺省方式 不组合PUBLIC 同类名段按照前后次序连接在一起COMMON 与其他模块中的同类名段有相同的起始物理地址STACK 与其他模块中的同类名段用覆盖的方式连接 从高地址开始覆盖MEMORY 该段必须放在同类名的各个段中的最后AT表达式 直接指定该段的段地址 5 段组定义伪指令GROUP 功能 把几个不同段名的段 合并成一个段组 并为该段组命名 段组名可代表所有成员的段地址 格式 段组名GROUP段名 段名 例 定义两个数据段 DATA1SEGMENTDATA2SEGMENTADB BDB DATA1ENDSDATA2ENDS进行段组合 DATAGROUPGROUPDATA1 DATA2段地址初始化 MOVAX DATAGROUPMOVDS AX直接访问变量A和B MOVAL A MOVAH B 6 假定伪指令ASSUME 格式 ASSUME段寄存器 段名 段寄存器 段名 功能 告诉汇编程序段与段寄存器的对应关系例 DATASEGMENTVAR1DB DATAENDSCODESEGMENTASSUMECS CODE DS DATABEGIN ASSUME指令 假定CS为代码段 DS为数据段 7 地址对准伪指令 1 ORG格式 ORG数值表达式功能 用于指定下一个指令或数据在段内的起始地址例 LAB1 PUSHAXORG2000HLAB2 MOVAL 34则LAB2的地址偏移量为2000H 2 EVEN功能 使下一个指令或数据的偏移量为偶数例 ORG0101HEVENDATADB100DUP 起始地址为0102H 3 ALIGN功能 使下一个指令或数据的偏移量为n 2i的倍数例 ORG0101HALIGN4DATADB100DUP 起始地址为0104H ALIGN2 EVEN 8 定义符号名伪指令LABEL 格式 变量名或标号LABEL类型属性功能 为当前的存储单元定义一个符号名 并指定其类型属性例 DATA WLABELWORDDATA BDB100DUP 则以下两个语句等效 MOVAX DATA WMOVAX WORDPTRDATA B LABEL EQUTHIS 9 过程定义伪指令PROC ENDP 功能 定义一个过程格式 过程名PROC 过程属性 返回指令RET过程名ENDP过程属性 NEAR 缺省属性 表示段内调用 返回FAR 表示段间调用 返回 10 源程序结束伪指令END 格式 END标号标号的地址必须是程序的入口地址 即第一条可执行语句功能 告诉汇编程序 源程序到此已经结束告诉汇编程序 源程序的入口地址是多少例 CODESEGMENTASSUMECS CODEBEGIN MOVAX 0 第一条指令语句 CODEENDSENDBEGIN 源程序到此为止 11 高级数据结构定义伪指令 1 结构类型数据定义伪指令STRUC ENDS结构的定义 结构名STRUC DB DW之类的数据定义伪指令语句序列结构名ENDS例 DATASTRUCXDW0YDB1ZDD2DATAENDS结构定义时并没有分配存储空间 结构变量的申请与赋初值结构变量名结构名例 NEW DATADATA 申请结构变量 NEW DATA 其中X 0 Y 1 Z 0 缺省的初始值表示使用定义时的预设值结构的访问结构变量名 字段名例 MOVAX NEW DATA XMOVBL NEW DATA Y 2 记录定义伪指令RECORD记录的定义记录名RECORD字段说明 字段说明 其中 字段说明的格式是 字段名 宽度 预赋值 例 RECRECORDA 8 12H B 5 10 C 3定义了一个字 其中 A占高8位 预赋值 00010010BB占接下来5位 预赋值 10000BC占低3位 预赋值 011B 记录变量的的申请与赋初值格式 记录变量名记录名例 REC VARREC申请了一个变量REC VAR 其值为 0001001000001010B预赋值12H初始化为1初始化为2 记录的访问WIDTH操作符 求记录或记录中某个字段的宽度 即位数 格式 WIDTH记录名或记录字段名记录字段名 求该字段的最低位右移到所在记录最右边所需的移位次数MASK操作符 返回一个8位或16位二进制数 这个数中 对应于指定字段的各位均是1 其余各位均是0 格式 MASK记录字段名例 MOVAX REC VAR AX 0001001000001010BMOVBL WIDTHREC VAR BL REC VAR的总宽度16MOVBH WIDTHA BH 字段A的宽度5MOVCL B CL 3MOVDX MASKC DX 0000000000000111B 二 指令性语句 格式 标号 指令助记符操作数 操作数 注释 标号 标号表示机器指令语句的存放地址 其后面必须紧跟冒号 指令助记符 指令助记符表示该语句的操作类型 如数据传送 算术运算等 操作数 操作数表示指令助记符的操作对象 不同指令的操作数个数不同 注释 与指示性语句中的注释相同 仅用于说明 解释当前语句 1 NIL指令 NIL指令并不属于80 x86的指令系统只用于宏汇编中作用 保留一个空行例 L NIL 留下一个空行 方便以后对程序的修改LOOPL等价于 L LOOPL 2 DOS系统功能的调用 将调用功能所需的入口参数存入指定的寄存器或存储单元中 在寄存器AH中存放所要调用功能的功能号 执行INT21H指令 转入中断子程序 中断子程序运行完后 从指定的寄存器或存储单元中取得出口参数 1 单字符显示 功能号 02H 功能 将指定的字符送到显示器显示例 MOVDL A 入口参数 DL存放字符的ASCII码MOVAH 02H 02H号功能调用INT21H 显示字符 A 2 单字符输入 功能号 01H 07H 功能 从键盘输入字符 AL例 MOVAH 01H 01H号键盘输入功能调用INT21H AL 输入字符的ASCII码 并显示字符07H号功能调用与01H号相似 但输入的字符没有在屏幕上显示 3 检测键盘状态 功能号 0BH 功能 检测当前时刻键盘是否有键按下 如果有 则出口参数AL 0FFH 否则AL 0 该功能不清除输入缓冲 例 循环运行程序段 直到有按键按下为止RUN 循环运行的程序段 MOVAH 0BH 0BH号功能调用INT21H 检测键盘状态CMPAL 0JZRUN AL 0表示没有键按下MOVAL 01H 没有清除缓冲 仍可读到按键INT21H 4 直接控制台I O 功能号 06H 功能 输入 输出字符 入口参数DL 0FFH 检测当前时刻键盘是否有键按下 如果有 则出口参数AL 输入的字符 ZF 0 清除输入缓冲区 如果没有 则ZF 1 入口参数DL 0FFH 将DL中的ASCII码送显示器上显示例 循环运行程序段 直到有按键按下为止RUN 循环运行的程序段 MOVAH 06H 06H号功能调用MOVDL 0FFH DL 0FFH 输入功能调用INT21H 检测键盘状态JZRUN 5 字符串显示 功能号 09H 功能 将数据段中的字符串输出到屏幕上字符串的首地址 DS DX中 字符串一定要以字符 作为结尾标志例 DATASEGMENTSTRINGDB HELLO 0DH 0AH 需以 结尾DATAENDS代码段 MOVAX DATAMOVDS AX DS 字符串所在段的段地址LEADX STRING DX 字符串首地址的偏移量MOVAH 09H 09H号功能调用INT21H 在屏幕上显示 HELLO 6 字符串输入 功能号 0AH 功能 字符串输入 回车键结束入口参数 DS DX 缓冲区首地址 DS DX 允许输入的最多字符数出口参数 DS DX 1 实际输入的字符数 不计回车 DS DX 2 开始 输入的字符串 包括回车 例 BUFDB10H 100DUP 输入字符数不超过16MOVAX DATAMOVDS AX DS 缓冲区所在段的段地址LEADX BUF DX 缓冲区首地址的偏移量MOVAH 0AH 0AH号功能调用INT21H 输入字符串若输入 123 则BUF中的内容为 10H 03H 输入3个字符 31H 32H 33H 0DH 回车 7 打印输出 功能号 05H 功能 将DL寄存器中的字符送打印机打印例 MOVDL A 需打印的字符 A MOVAH 05H 05H号功能调用INT21H 送打印机打印 8 结束调用 功能号 4CH 功能 终止当前程序 并返回到DOS中例 MOVAH 4CHINT21H 第四节宏汇编指令 一 宏操作伪指令宏定义伪指令MACRO ENDM取消宏定义伪指令PURGE重复伪指令REPT IRP IRPC局部符号伪指令LOCAL 1 宏定义伪指令MACRO ENDM格式 宏名MACRO 形式参数1 形式参数2 宏体ENDM 宏定义结束例1 OUTPUTMACROMOVAH 02HINT21HENDM则 OUTPUT等价于 MOVAH 02H INT21H 例2 OUTPUTMACROASC ASC 为形式参数MOVDL ASCMOVAH 02HINT21HENDM则 OUTPUT30H等价于 MOVDL 30HMOVAH 02HINT21H 2 取消宏定义伪指令PURGE 功能 使用MACRO定义的宏 如果不再需要 就可以用PURGE来注销格式 PURGE宏名1 宏名2 例 PURGEOUTPUT 3 重复伪指令REPT IRP IRPC REPT格式 REPT表达式 宏体ENDM功能 重复执行宏体中的语句 重复次数为表达式的值 例如 下面的宏能将AL中的值逻辑左移4位 REPT4SHLAL 1ENDM IRP格式 IRP形式参量 宏体ENDM功能 重复执行宏体 重复的次数是由参数的个数决定例 把AX BX CX DX都压入栈中 IRPREG PUSHREGENDM IRPC格式 IRPC形式参量 字符串 宏体ENDM功能 重复执行宏体 其参数列表是字符串 一个字符为一个参数例如 IRPCNUM 1234 1234 表示4个参数1 2 3 4DBNUMENDM等效于 DB1 2 3 4 4 局部符号伪指令LOCAL 格式 LOCAL标号 变量等的列表功能 将宏中的标号定义为局部符号 避免重复例 错误 IRPREG LAB PUSHREGENDM展开后 LAB PUSHAXLAB PUSHBX LAB重复使用 出错 正确 IRPREG LOCALLABLAB PUSHREGENDM展开后 0000 PUSHAX 0001 PUSHBX 二 条件汇编 格式 IFxx 条件块1 ELSE 条件块2ENDIF功能 根据某个表达式的真假 决定是否对指定的程序段进行编译 IF表达式 如果表达式的值不为0 则条件满足 IFE表达式 如果表达式值为0 则条件满足 IF1 在汇编程序的第一次扫视期间满足条件 IF2 在汇编程序的第二次扫视期间满足条件 IFDEF符号 如果指定的符号已经在程序中被定义 或被说明为EXTRN 则条件为真 IFNDEF符号 如果指定的符号在程序中未被定义 且不被说明为EXTRN 则条件为真 IFB 如变量为空 则条件为真 IFNB 如变量不为空 则条件为真 IFIDN 如字符串arg1和串arg2相同 条件为真 IFDIF 如字符串arg1和串arg2不相同 条件为真 第五节编写完整的汇编语言程序 汇编语言程序与MS DOS一般的汇编语言程序的整体框架模块化程序设计的思想利用简化段定义伪指令编写完整程序 一 汇编语言程序与MS DOS 1 DOS的装入功能确定用于存放程序的内存地址空间建立程序段前缀PSP ProgramSegmentPrefix 100H个字节 存放程序有关信息及进程间的控制信息最开始的两个字节是一条INT20H软中断指令在PSP后装入可执行程序 数据段附加段代码段堆栈段 初始化各个相关寄存器的值 DS ES PSP所在段的段地址CS IP 程序的入口地址入口地址 第一条可执行语句的段地址和偏移量这个地址是从END语句中标号的地址属性得到的SS初始化为堆栈段的段地址SP指向堆栈段的栈底 2 DOS的返回 方法一 执行PSP中的 INT20H 指令 CS PSP的段地址IP 0具体过程 程序开头 PUSHDS 开始时 DS PSP的段地址MOVAX 0PUSHAX 0 入栈程序过程 要求PUSH与POP配对程序结束 RETF CS PSP的段地址 IP 0 例 CODESEGMENTASSUMECS CODEMAINPROCFARBEGIN PUSHDS PSP的段地址入栈MOVAX 0 INT20H的偏移量为0PUSHAX 把偏移量入栈 RET IP 0 CS PSP段地址MAINENDPCODEENDSENDBEGIN 方法二 调用DOS系统的4CH功能 实现DOS返回 MOVAH 4CHINT21H例 CODESEGMENTASSUMECS CODEBEGIN MOVAH 4CH 返回DOSINT21HCODEENDSENDBEGIN 二 一般的汇编语言程序的整体框架 数据段 附加段堆栈段ASSUME伪指令代码段END伪指令注释 源程序结构框架框架一 DATASEGMENT 数据段 定义变量 缓冲区等DATAENDSSTACKSEGMENTPARASTACK STACK 堆栈段部分DBXXXXDUP 定义堆栈的长度STACKENDSCODESEGMENT 代码段部分ASSUMECS CODE DS DATA SS STACK ES DATAMAINPROCFARBEGIN PUSHDSMOVAX 0 为RET提供转移地址PUSHAX 数据段 堆栈段 MOVAX DATAMOVDS AX 初始化段寄存器DS ESMOVES AX 程序部分RET 返回DOSMAINENDPPROC 1PROCNEAR FAR 定义其他过程RETPROC 1ENDPCODEENDSENDMAIN 框架二 采用 4CH 功能返回 代码段部分 CODESEGMENT 代码段ASSUMECS CODE DS DATA SS STACK ES DATABEGIN MOVAX DATAMOVDS AX 初始化DS ESMOVES AX 程序部分MOVAH 4CH 4CH号功能调用INT21H 返回DOSCODEENDSENDBEGIN 三 模块化程序设计的思想 1 模块命名伪指令NAME TITLE格式 NAME模块名TITLE模块名作用 为模块命名 指示给连接程序进行连接用2 逻辑段与物理段编译连接时 同类逻辑段将组合成一个大的物理段 3 同类名的组合方式PRIVATE 缺省方式 不组合PUBLIC 同类名段按照前后次序连接在一起COMMON 与其他模块中的同类名段有相同的起始物理地址STACK 与其他模块中的同类名段用覆盖的方式连接 从高地址开始覆盖MEMORY 该段必须放在同类名的各个段中的最后AT表达式 直接指定该段的段地址 4 模块之间的通信PUBLIC与EXTRN 格式 PUBLIC标识符 标识符 EXTRN标识符 属性 标识符 属性 功能 PUBLIC 说明模块中某些标识符可以被其它模块访问EXTRN 说明本模块中哪些标识符是外部的 以及这些标识符的属性是什么 例 模块1 NAMEMOD1PUBLICVAR1 公用标识符VAR1DATA1SEGMENTPARAPUBLIC DATA VAR1DB 字节变量VAR1DATA1ENDS模块2 NAMEMOD2EXTRNVAR1 BYTE 说明VAR1是字节CODE2SEGMENTPARAPUBLIC CODE MOVAL VAR1 访问MOD1中的字节变量VAR1 四 简化段定义伪指令 1 定义内存模式伪指令 MODEL格式 MODEL存储模式 高级语言接口 操作系统 堆栈距离 存储模式 TINY 最小模式 代码和数据同段SMALL 小模式 一个代码段 一个数据段MEDIUM 中模式 一个数据段 多个代码段COMPACT 压缩模式 多个数据段 一个代码段LARGE 大模式 多个代码段 多个数据段HUGE 巨模式 多个代码段 多个数据段 允许 64KB 高级语言接口 汇编程序可以作为一个过程 供其他高级语言调用可选的语言有C BASIC FORTRAN PASCAL操作系统 指明程序运行的操作系统可选的操作系统 OS DOS OS OS2两种默认OS DOS堆栈距离 指明堆栈段是否与数据段合并在同个段组中 选项 NEARSTACK 与数据段同组 FARSTACK 堆栈段单独作为一段 不与数据段合并 默认的堆栈距离为NEARSTACK 2 简化段定义伪指令 CODE 定义代码段 DATA 定义已初始化的数据段 DATA 定义未初始化的数据段 FARDATA 定义远程已初始化的数据段 FARDATA 定义远程未初始化的数据段 CONST 定义常数数据段 STACK 定义堆栈段 3 等价名的概念 CODE 代表代码段等价的段名 DATA 代表由 DATA DATA CONST STACK等所定义的段所在的段组名 FARDATA 代表 FARDATA所定义的数据段 FARDATA 代表 FARDATA 所定义的数据段 4 指定段序伪指令 ALPHA 根据各个段的段名 按字母顺序排序 SEQ 缺省 按照各个段在程序中出现的顺序进行排序DOSSEG 按照DOS系统对段序的定义进行排序 其排序的规则是 首先是类名为 CODE 的段 其次是类名不是 CODE 且不是段组DGROUP成员的段 最后是属于DGROUP的段 第六节汇编语言程序设计 一 程序设计基本方法分析实际问题 确定基本思路及程序算法绘制程序流程图根据流程图编写程序调试程序 1 流程图起止框 表示程序的开始和结束工作框 说明该步骤的功能判断框 说明判断的条件调用框 说明调用过程的名字 参数等连线 表示程序的走向 2 程序的基本结构形式顺序结构按直线顺序执行程序分支结构含判断语句 根据判断结果选择分支例 CMPAL BLJZL1 相等L2 不等JMPNEXTL1 NEXT 3 循环结构初始化部分循环体部分循环条件判断部分例 MOVCX 100 初始化部分L 循环体开始 DECCX 修改循环变量JNZL 循环条件判断 4 子程结构在程序中需要多次出现的程序段 可定义为一个子程序 在主程序需要的时候就可以直接调用它寄存器的保护与恢复主程序与子程序之间的参数传递子程序可嵌套调用 二 程序设计举例 显示二进制数的ASCII码形式DATASEGMENTNUMDB12H 34H 0ABH 0CDH 需显示的字节COUNTEQU NUM 字节数AFTERDB B 0DH 0AH B 回车换行DATAENDSCODESEGMENTASSUMECS CODE DS DATAMAINPROCFARPUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AX LEASI NUM 数据的地址M
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地理山水测试题及答案
- 党史测试题简答及答案
- 苍蝇钓鱼测试题及答案
- 道服专员考试题及答案
- 地铁人物测试题及答案
- 茶叶包装考试题及答案
- 2025年工程法规考试基础试题及答案分析
- 领导力提升与团队建设计划
- 班级互动活动的创意设计计划
- 2025年工程法规考试知识巩固试题及答案
- 经济与社会如何用决策思维洞察生活尔雅答案
- GB/T 18238.1-2024网络安全技术杂凑函数第1部分:总则
- 荆州市国土空间总体规划(2021-2035年)
- BIM5D+智慧工地整体解决方案
- 2024年4月南京市鼓楼区九年级中考语文一模试卷附答案解析
- 《猜数字算法设计》 教学设计教学设计教学设计
- 建筑工程合同管理与索赔论文2024年
- 载人航天器生命保障系统
- 售后服务合同范本英文
- 《大学生创业基础系列课程》课件-第6课-创业机会-2学时
- 通信线路高风险作业施工安全操作须知样本
评论
0/150
提交评论