第4章 汇编语言.ppt_第1页
第4章 汇编语言.ppt_第2页
第4章 汇编语言.ppt_第3页
第4章 汇编语言.ppt_第4页
第4章 汇编语言.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计 第四章汇编语言程序设计 汇编语言介绍 第4 1节汇编语言介绍一 汇编语言种类绝对汇编 只能将助记符转换成机器码符号汇编 增加了段的定义 可用符号表示变量 常数 地址等宏汇编 增加了宏指令 结构 记录等高级功能二 伪指令编译后不产生代码 仅在编译时起控制或指示作用 如 OFFSET三 宏指令将常用的一系列指令定义成一条宏指令 编译时先对宏指令进行预处理 宏展开 再对展开之后的程序进行编译 四 汇编程序开发过程 汇编语言介绍 1 编辑 编辑后形成源程序文件 asm 以ASCII码形式存盘2 编译 对源程序 asm进行编译 形成 obj文件 以二进制形式存盘编译工具 masm tasm例 masmauto asm3 连接 将1个或多个 obj文件进行连接 形成 exe或 com文件连接工具 link tlink例 linkauto obj4 调试 对程序进行调试 调试工具 TD exe或debug exe COM文件与 EXE文件的区别 COM文件是内存映像文件 直接装入内存即可执行 其中代码 数据 堆栈 扩展4个段完全重合 程序不超过64KB 装入执行较快 EXE文件不是内存映像文件 执行时需要把代码段 数据段 堆栈段等重新定位 然后才能执行 装入执行速度相对较慢 COM或 EXE文件装入内存时都会产生一个256字节的程序段前缀PSP ProgramSegmentPrefix 包含程序运行的基本信息 存放在程序开始的0 FFH处 具体格式如下 程序段前缀说明PSP 0H处存放了一条指令 是用于结束程序的DOS中断 即INT20HPSP 2H处是程序可用的内存空间 以小段为单位 每小段为16字节PSP 5H处是DOS功能调用INT21H的入口地址 PSP 0AH 0DH是INT22H的入口IP和CSPSP 0EH 11H是INT23H的入口IP和CSPSP 12H 15H是INT24H的入口IP和CSPSP 2CH处是环境块地址 汇编语言介绍 参数传递早期的DOS支持格式化参数 例 COPYA file1 asmC file2 asm将A file1 asm格式化参数1存于PSP 5CH处 格式为 将B file2 asm格式化参数2存于PSP 6CH处非格式化参数存于PSP 80H处 汇编语言格式 五 汇编语言格式1 段的定义 由SEGMENT和ENDS定义段seg nameSEGMENT align type combine type class 中的参数为可选参数seg nameENDS例 data1segmentparapublic data 数据段定义stringdb Hello 7 data1ends1 段名seg name代表了所定义段的起始地址2 align type表明该段起始位置在内存中的对齐类型para指定该段从一个小段 16字节 的边界开始 byte指定该段从任一位置开始 word指定该段从一个字边界开始page指定该段从一个页 256字节 的边界开始 汇编语言格式 3 combine type指出不同程序模块中具有相同段名的分段的连接类型public表示该段在连接时 将与有相同名字的其他分段连接在一起 且仅有一个起始地址 common表示该段连接时将与其他同名分段重叠 也只有一个起始地址 不同分段会产生覆盖 stack表示该段是堆栈段 连接时不同模块中的堆栈段连接在一起4 class 类别 连接时用于组成段组名当连接两个源模块时 具有相同 class 名的两个段在存储器中的位置是紧靠在一起的 但两个段并不会合并成一个段 汇编语言格式 例1combine type连接类型举例 两个模块定义如下 sourcemodule1 sourcemodule2 data segsegmentcommondata segsegmentcommon data segendsdata segendsss segsegmentstackss segsegmentstackdw20dup dw30dup ss segendsss segendscode segsegmentpubliccode segsegmentpublic code segendscode segends两个模块独立编译 再一起连接 最后形成的装入模块的存储区分配情况如下所示 汇编语言格式 汇编语言格式 例2 class 类别举例 两个模块定义如下 sourcemodule1 两个模块独立编译 统一连接 data1segment data 形成的装入模块的存储区分配情况 如下图所示 data1endscode1segment code code1ends sourcemodule2 data2segment data data2endscode2segment code code2ends 汇编语言格式 2 过程 子程序 的定义 由PROC和ENDP定义过程例 mainprocfarsub1procnearcallsub1 retmainendpsub1endp1 far near 过程类型说明符近过程 属于段内调用 near可省略远过程 属于段间调用 主程序必须定义为远过程2 过程名代表了一个子程序的起始地址 入口地址 3 assume指示了段与段寄存器之间的对应关系 但并不将段名所代表的段起始地址赋给段寄存器 具体赋值应在程序中完成例 my codesegment 代码段定义assumecs code1 ds data1 ss ss stackmainprocfar mainendp 使用格式assume段寄存器名 段名 汇编语言标记 六 汇编语言中的标记1 变量名vardb10 变量名代表了所分配存储单元的起始地址2 标号A MOVal 1 标号代表了所跟指令的起始地址3 过程名sub1proc 过程名表示了程序的起始地址 入口地址 sub1endp4 段名data1segment 段名表示了所定义段的起始地址data1ends说明 1 汇编语言中的标记不能以数字开头 但数字可以出现在标记名中间2 以上标记所代表的地址应包括2个属性 偏移地址和段地址3 变量名 过程名还包括第3个属性 即相应的类型变量名代表的类型为 DBDWDD等过程名代表的类型为 farnear 汇编语言伪指令 七 伪指令常用ASM 8086伪指令如下 1 数据定义伪指令 DB DW DD DQ DT分别以字节 字 双字 8个字节 10个字节为单位定义数据 例 vardw100H 200H 表示以字为单位定义2个数据strdb Hello 给出带单引号的字符等于给出了字符的ASCII码addr1dwstr 将变量str所代表的偏移地址赋给变量addr1addr2ddstr 将变量str所代表的偏移地址和段地址赋给addr22 偶地址对齐伪指令 EVEN用于判断当前存储单元是否为偶地址 若是则无操作 否则让下一个数据或代码从偶地址开始存放3 指定起始位置伪指令 ORGORG20H 指定下一个数据或代码从0020H开始存放4 重复表达式伪指令 DUPbufdb10dup 表示以字节为单位定义数据 重复10次 即定义10个数据 表示重复的内容 表示只分配存储单元 但不赋初值 汇编语言伪指令 5 赋值伪指令 EQU类似于C语言中的define 不分配存储单元AEQU10 以符号A表示数据10 编译时把程序中所有出现 A的地方用10替换 也可用A 10表示BEQUA 用符号B表示另一个符号A6 段定义及程序定义伪指令 segment endproc endpfar near7 程序结束伪指令 END表示整个程序结束8 类型说明伪指令 byteptr wordptr dwordptr nearptr farptr9 其他伪指令 OFFSET 析取变量 标号和过程名的偏移量SEG 析取变量 标号和过程名的段地址TYPE 析取变量 标号和过程名的类型 取值 DB1 DW2 DD4 DQ8 DT10 NEAR 1 FAR 2 返回操作系统方法 主程序退出返回操作系统的三种方法 A 利用INT20H结束程序codesegmentmainprocfar int20hmainendpcodeendsendmain B 利用DOS功能调用4CH退出codesegmentmainprocfar movax 4C00hint21hmainendpcodeendsendmain C 利用程序段前缀PSP返回codesegmentmainprocfarpushdsxorax ax 将AX清0pushax retmainendpcodeendsendmain 程序装入内存后 系统将CS IP SS SP分别指向代码段和堆栈段起始位置 而DS ES指向PSP 0处 程序结束时 RET指令返回PSP 0H处执行INT20H指令 释放程序占用的存储器空间 并返回操作系统 汇编语言程序设计 第4 2节汇编语言程序设计常用DOS功能调用通常把DOS提供的INT21H中断服务程序称为DOS功能调用 调用时根据AH的值来选择子功能 AH 1键盘键入并回显 输入字符的ASCII码在AL中返回例 MOVAH 1INT21HAH 2显示输出字符 输出字符的ASCII码放入DL中例 MOVAH 2MOVDL A INT21HAH 7键盘输入无回显 输入字符的ASCII码在AL中返回例 MOVAH 7INT21H DOS功能调用 AH 9显示字符串 字符串以 结束 开始位置用DS DX指示例 MOVAX MY DATAMOVDS AXLEADX StringMOVAH 9INT21HAH 4C程序运行结束 返回操作系统 返回码由AL给出例 MOVAX 4C00HINT21H 程序设计实例包括6部分顺序结构程序设计分支结构程序设计循环结构程序设计子程序设计字符串程序设计数码转换程序设计 顺序结构程序设计 顺序结构程序设计例1从键盘输入一个小写字母 转换成大写字母输出datasegmentparastr1db Pleaseinput a z str2db0dh 0ah Theresultis dataends ss segsegmentstackdw100dup 0 ss segendscodesegmentassumecs code ss ss seg ds datamainprocfarmovax data 对数据段赋值movds axleadx str1 ds dx指向str1movah 9 显示提示符1int21h movah 1 输入小写字符int21hsubal 20h 得到大写字母ASCIIpushax 放入堆栈保存leadx str2 ds dx指向str2movah 9 显示提示符2int21hpopax 从堆栈恢复AX值movah 2 输出大写字符movdl alint21hmovAX 4c00h 返回DOSint21hmainendpcodeendsendmain a z61H 7AHA Z41H 5AH 顺序结构程序设计 例2以16进制形式显示存储器中一个字节的无符号数VAR 例 11010101显示D5方法 将一个字节分为高4位和低4位 先显示高4位 后显示低4位 datasegmentparavardb100dataendsss segsegmentstackdw100dup 0 ss segendscodesegmentassumecs code ds data ss ss segmainprocfarmovax datamovds axmoval varmovdh almovcl 4 shral clcallbin2asccallpcharmoval dhcallbin2asccallpchar 显示al中一个字符pcharprocmovah 02hmovdl alint21hretpcharendpcodeendsendmain movax 4c00hint21hmainendp bin2ascprocandal 0fhaddal 30hcmpal 9 jbeasc1addal 7asc1 retbin2ascendp 将AL的低4位转换 为ASCII码 顺序结构程序设计 例3从键盘输入1 5之间的一个数 在屏幕上显示one five 如输入5 则显示fivedatasegmentparastr1db one str2db Two str3db Three str4db four str5db five tabdwstr1 str2 str3 str4 str5dataendsssgsegmentstackdw256dup ssgendscodesegmentparaassumecs code ss ssg ds datamainprocfar movax datamovds axmovah 1 键盘输入int21hcallasc2binmovbl almovbh 0decbxmovdx tab bx 2 movah 9int21hmovax 4c00hInt21hmainendp 将ASCII转换为二进制数 入口 AL存放ASCII 出口 转换后数值在ALasc2binprocsubal 30hcmpal 9jbenextsubal 7next retasc2binendpendmain 分支结构程序设计 分支结构程序设计 二分支结构例4在数据段中有两个16位二进制无符号数data1和data2 找出其中较小数 并存于MIN中datasegmentdata1dw2000hdata2dw3f80hmindw dataendsss segsegmentstackdw100dup 0 ss segendscodesegmentassumecs code ds data ss ss seg mainprocfarmovax datamovds axmovax data1cmpax data2jbnextmovax data2next movmin axmovax 4c00hint21hmainendpcodeendsendmain 分支结构程序设计 三分支机构例5判断16位有符号数var的值 若为正数 在result中存入1 为负数 在result中存入 1 为零 在result中存入0datasegmentvardw2000hresultdw dataendsss segsegmentstackdw100dup 0 ss segendscodesegmentassumecs code ds data ss ss segmainprocfarmovax datamovds axmovax var cmpax 0jllessjggreatmovax 0jmpnextless movax 1jmpnextgreat movax 1next movresult axmovax 4c00hint21hmainendpcodeendsendmain 分支结构程序设计 多分支机构例6根据字节变量var被置位的情况控制程序转移到8个子程序中的一个datasegmenttabdwsubr1 subr2 subr3 subr4dwsubr5 subr6 subr7 subr8vardb04hdataendsss segsegmentstackdb100dup 0 ss segendscodesegmentassumecs code ds data ss ss segmainprocfarmovax datamovds ax moval varcmpal 0jzexitleabx tabgetbit shral 1jcsubraddbx 2jmpgetbitsubr call bx exit movax 4c00hint21hmainendp subr1proc retsubr1endp subr8proc retsubr8endpcodeendsendmain 循环结构程序设计 循环程序设计单重循环例7以buf单元开始存放8个16位有符号数请找出最大数存于max单元datasegmentbufdw 10 300 528 222dw426 923 223 36countequ buf 2maxdw dataendsss egsegmentstackdw100dup 0 ss segendscodesegmentassumecs code ds data ss ss seg mainprocfarmovax datamovds axmovcx count 1movbx 0movax buf bx circle addbx 2cmpax buf bx jgenextmovax buf bx next loopcirclemovmax axmovax 4c00hint21hmainendpcodeendsendmain 循环结构程序设计 例8将5个有符号字节数相加 结果保存在sum中datasegmentparabufdb 100 127 112 99 10sumdw0dataendsss segsegmentstackdw100dup 0 ss segendscodesegmentparaassumecs code ss ss seg ds datamainprocfarmovax datamovds axmovcx 5movdx 0 movbx 0circle moval buf bx cbw 字扩展 AL AXadddx ax 16位加法 防止溢出incbxloopcirclemovsum dxmovax 4c00hint21hmainendpcodeendsendmain 循环结构程序设计 多重循环 举例 冒泡法排序 例9以buf单元开始连续存放10个16位有符号数 请按由小到大排序datasegmentbufdw 10 30 52 2 92dw22 36 31 63 44countequ buffer 2dataendsss segsegmentstackdw100dup 0 ss segendscodesegmentassumecs code ds data ss ss segmainprocfarmovax datamovds axmovsi count 1 circle1 movbx 0 外循环pushcxcircle2 movax buf bx 内循环cmpax buf bx 2 比较数据jlenextxchgax buf bx 2 交换数据movbuf bx axnext addbx 2loopcircle2popcxloopcircle1movax 4c00hint21h mainendpcodeendsendmain 循环结构程序设计 冒泡法第二种实现datasegmentbufdw 10 30 52 2 92dw22 36 31 63 44countequ buffer 2dataendsss segsegmentstackdw100dup 0 ss segendscodesegmentassumecs code ds data ss ss segmainprocfarmovax datamovds axmovsi count 1 circle1 movbx 0movdx 0pushcxcircle2 movax buf bx cmpax buf bx 2 jlenextxchgax buf bx 2 movbuf bx axmovdx 1 表示发生交换next addbx 2loopcircle2popcxcmpdx 0jzexitloopcircle1 exit movax 4c00hint21hmainendpcodeendsendmain 子程序设计 子程序设计 如何进入子程序 如何返回调用程序调用时 CALLTAGET 将返回地址压入堆栈返回时 RET 从堆栈中弹出返回地址赋给CS和IP子程序中使用堆栈 应保持动态平衡 子程序参数传递方法寄存器传递全局变量传递堆栈传递代码段传递 子程序描述子程序功能描述入口参数描述出口参数描述 子程序设计 1 寄存器传递参数 将0 F转换为ASCII码 入口参数 要转换的数值放入AL低4位 出口参数 转换后的ASCII放入AL返回 moval 3callbin2asc bin2ascprocandal 0FHaddal 30Hcmpal 9 jbeasc1addal 7asc1 retbin2ascendp 2 全局变量传递参数 将2个无符号字数据相加xdw ydw 调用前将参数赋给全局变量movx 8movy 7calladd sr add srprocmovax xaddax yret 返回时 结果在AL中add srendp 子程序设计 3 堆栈传递参数 高级语言多采用该方法例 将2个无符号字数据相减 调用前将参数压入堆栈movax 8pushaxmovax 7pushaxcallsub sr 子程序中如何访问堆栈中参数 BP间接寻址默认堆栈段sub srprocpushbpmovbp spmovax bp 4 8addax bp 6 7popbpret4 返回后 将SP 4 保 持堆栈平衡sub srendp 子程序设计 4 代码段传递参数例10在数据段中有一个16位二进制无符号数var 计算var 10 600的值 并把结果存于result单元中 试编程 datasegmentvardw32767resultdd dataendsssgsegmentstackdw100dup ssgendscodesegmentassumecs code ds data ss ssgstartprocfarmovax datamovds ax movax varcallfuncA dw10dw600B leabx resultmov bx axmov bx 2 dxmovax 4c00hint21hstartendpfuncprocpushbpmovbp sppushsi pushbxmovbx bp 2 600movsi cs bx 10mulsi var 10addax cs 2 bx adcdx 0addbx 4mov bp 2 bxpopbxpopsipopbpretfuncendpcodeendsendstart 字符串程序设计 字符串程序设计例11显示一个字符串 结束符为NULL字符datasegmentstr1db Welcome 0dataendsssgsegmentstackdw100dup 0 ssgendscodesegmentassumecs code ds data ss ssgmainprocfarmovax datamovds axleasi str1callpstrmovax 4c00h movax 4c00hint21hmainendppstrproccldpstr1 lodsb 从串中取字符cmpal 0 判断结束符jzpstr2callpchar 显示字符jmppstr1pstr2 retprtstrendp pcharprocmovah 02hmovdl alint21hretpcharendpcodeendsendmain 字符串程序设计 例12拷贝字符串 strcpy asm 把字符串str1拷贝到字符串str2 入口 si存放str1起始地址 di存放str2起始地址 出口 str1内容被拷贝到str2 ax为str2起始地址strcpyprocmovax dsmoves axmovdi dx es di指向串2movdx di 保存串2地址repmovsbmovdi si es di指向串1movax dxxoral alretmovcx 0ffffhstrcpyendpcldrepnzscasbnotcx cx为含0源串长度 数码转换程序设计 数码转换程序设计1 二进制转换为十进制ASCII码例13以10进制格式显示一个无符号字数据分析 1 存储时用二进制 书写时用16进制或10进制如 127存储 01111111b书写 FFH2 二进制如何转换为10进制 即得到万位 千位 个位如 127 每次除以10 保留余数7 37H2 32H1 31H注 0 9 30H 39H3 显示时 使用ASCII码 AH 2DOS功能调用输出字符 数码转换程序设计 vardw7FH 数据定义bufdb5dup 初始化为空格 movbx 4movsi 10movdx 0movax vardivsi DX AX 10adddl 30h 得到个位movbuf bx dl movdx 0divsiadddl 30h 得到十位decbxmovbuf bx dl movdx 0divsiadddl 30h 得到百位decbxmovbuf bx dl 可继续得到千位 万位 显示十进制数movbx 0movdl buf bx movah 2int21h 显示百位 incbxmovdl buf bx movah 2int21h 显示十位 数码转换程序设计 circle1 movdx 0divsi 除以10adddl 30hmovbuf bx dldecbxloopcircle1movcx 5 显示5位数据movbx 0circle2 movdl buf bx movah 2int21hloopcircle2movax 4c00hint21hmainendpcodeendsendmain 优化后的完整汇编程序datasegmentvardw7F00Hbufdb5dup dataendsssgsegmentstackdw100dup 0 ssgendscodesegmentassumecs code ds data ss ssgmainprocfarmovax datamovds axmovcx 5movbx 4movsi 10movax var 数码转换程序设计 例14以10进制格式显示一个有符号字数据 datasegmentdatdw900Ahbufdb6dup dataendsssgsegmentstackdw100dup 0 ssgendscodesegmentassumecs code ds data ss ssgmainprocfarmovax datamovds axmovbuf cmpvar 0jgenext movbuf negvarnext movcx 5movbx 4movsi 10movax varcircle1 movdx 0divsiadddl 30hmovbuf bx dldecbxloopcircle1movcx 6movbx 0 circle2 movdl buf bx movah 2int21hincbxloopcircle2movax 4c00hint21hmainendpcodeendsendmain 数码转换程序设计 2 BCD码转换为二进制数例15将一个 位压缩BCD码数 转化为二进制数分析 vardw1024H看作压缩BCD码 表示十进制数 大小应为1024因此转换成二进制数后 在存储器中应该存放为0400H方法 转换后数据 千位 1000 百位 100 十位 10 个位采用循环实现数据 千位 10 百位 10 十位 10 个位数据 BCD3 10 BCD2 10 BCD1 10 BCD01024 1H 10 0H 10 2H 10 4H第1次 ax 1H 10 0H第2次 ax ax 10 2H第3次 ax ax 10 4H 数码转换程序设计 rolvar clmovax varandax 000fh 得到1cirlce mulsi 乘以10rolvar clmovbx varandbx 000fh 得到0 2 4addax bxdecch 循环次数是否到 jnzcirclemovvar ax 将结果再存回varmovax 4C00hint21hmainendpcodeendsendmain datasegmentparavardw1024hdataendsssgsegmentstackdb100dup 0 ssgendscodesegmentassumecs code ds data ss ssgmainprocfarmovax datamovds axmovsi 10movch 3 循环3次movcl 4 数码转换程序设计 movax 0cirl

温馨提示

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

评论

0/150

提交评论