




已阅读5页,还剩134页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第4章汇编语言程序设计 2 4 1概述 机器语言汇编语言高级语言宏汇编程序及上机过程简介 3 数据段说明 堆栈段1 各段顺序无关2 除代码段外 可缺省3 可有若干个数据段 若干代码段代码段END 标号 附加段 源程序结构概览 4 汇编语言程序例 DATASEGMENTBUF1DB34HBUF2DB2AHSUMDB DATAENDS CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVAL BUF1ADDAL BUF2MOVSUM ALMOVAH 4CHINT21HCODEENDSENDSTART 5 4 1 4汇编语言源程序上机过程 源程序 asm 目标程序 obj 结果debugDOS下执行 执行 可执行程序 exe 8 二 数据定义伪指令格式 变量名 定义符操作数项表操作 为变量分配存储单元并将初值置入相应单元中 操作数项表可为 1 常数或表达式2 字符串3 表达式4 带DUP的表达式 定义符可为 DB 定义字节DW 定义字 2个字节 DD 定义双字 4个字节 DF 定义六字节DQ 定义八字节DT 定义十字节 9 操作数是常数或表达式X1DB40H 为X1分配1个字节 初值40HX2DW250 250 为X2分配2个字节 初值62500X3DD10203040H 为X3分配4个字节 初值为10203040HX4DQ 120 50 10 为X4分配8个字节 初值17X5DB10 20 30 多项定义 X5被分配3个字节 初值分别为10 20 30 地址从低到高 各个值间用逗号分开 10 操作数为字符串STRING1DB HELLO STRING2DB H E L L O 字符串用DB定义 被定义串以单引号括起来串中可包含数字符 大小写英文字母 回车符 换行符 空格 下划线 等字符串以ASCII码形式存储在存储单元中 STRING1 H 1 E 2 L 3 L 4 O 11 区分S1DB AB 与S2DW AB 它们的存储情况为 S1S2 A B B A 操作数项为 用于预留空间 不置初值Y1DB20H 定义2个字节 其中预留1个字节Y2DW 预留2个字Y3DD 预留4个字节Y4DQ 预留8个字节Y5DT 预留10个字节 12 操作数项带重复定义符DUP格式 NDUP 操作数项表 操作 以N所示次数定义操作数项表内容VAR1DW2DUP 2 4 1476HVAR2DB2DUP 2DUP A B 存储情况为 VAR102HVAR2 00H A 04H B 00H A 02H B 00H 04H A 00H B 76H A 14H B 13 操作数运算符 算术运算符逻辑运算符关系运算符数值回送运算符属性运算符运算符优先级 14 算术运算符 单目 单目 MOD 运算符格式运算 表达式取表达式正值 表达式取表达式负值 表达式1 表达式2求表达式1 表达式2之和 表达式1 表达式2求表达式1 表达式2之差 表达式1 表达式2表达式1 表达式2之积 表达式1 表达式2表达式1 表达式2之商MOD表达式1MOD表达式2取余数 说明 1 算术运算符可用于数值表达式或地址表达式2 用于地址表达式时 只有其结果有物理意义时才有效常用的是 地址 数字常量地址 数字常量 15 算术运算符示例 1 MOVAL 20 30 50 ALMOVBH 100 2 98 BHMOVCX 50 2 25 CXMOVAL 80MOD15 5 AL 3 设数据定义如下 ARRAYADW1 2 3 4 5 6 7WENDADW 将数组长度 字数 存入CX MOVCX WENDA ARRAYA 2 地址 地址 结果为一常量 2 将首地址为BLOCK的字数组的第6个字传送到DX MOVDX BLOCK 6 1 2 地址 常量 结果仍为一地址值 16 逻辑运算符 NOT AND OR XOR 运算符格式运算NOTNOT表达式按位取反AND表达式1AND表达式2按位 与 运算OR表达式1OR表达式2按位 或 运算XOR表达式1XOR表达式2按位 异或 运算逻辑运算符和逻辑运算指令的区别 逻辑运算指令逻辑运算符出现在语句的位置指令助记符操作数字段操作对象可以是寄存器或只能是整型常数存储器操作数何时计算程序运行时源程序汇编时 17 关系运算符 EQ NE LT LE GT GE 运算符格式运算EQ表达式1EQ表达式2表达式1 表达式2为真NE表达式1NE表达式2表达式1表达式2为真LT表达式1LT表达式2表达式1表达式2为真GE表达式1GE表达式2表达式1 表达式2为真 关系运算符的两个操作数必须都是常量或同一段内的符号地址 比较结果为逻辑值 如果关系成立 则返回0FFFFH 真 否则 返回0 假 18 逻辑运算符示例MOVAH NOT0F0H 0FH AHMOVBL 40HOR0B4H 0F4H BLXORBL 55HXOR48H XORBL 1DHANDCH 50HAND30H ANDCH 10H 关系运算符示例N1EQU10N2EQU20 MOVBX N1EQN2 0 BXMOVCX N1NEN2 0FFFFH CXMOVAX N1LTN2 0FFFFH AXMOVDI N1GEN2 0 DI 19 数值回送运算符 SEG OFFSET TYPE LENGTH SIZE 数值回送运算符对变量或标号进行分析 回送其地址属性值或变量特征值 1 地址回送运算符符号作用对象操作SEG变量或标号返回其所在段的段基址值OFFSET变量或标号返回其在段内的偏移量 20 2 符号特征回送运算符符号作用对象操作TYPE变量或标号用数字表示其类型属性LENGTH变量用DUP重复定义符定义的变量 返回分配的元素个数 其他形式 则返回1SIZE变量回送LENGTH TYPE之积 21 TYPE运算符类型属性运算结果变量DB1DW2DD4DQ8DT10标号NEAR 1FAR 2 22 数值回送运算符示例D SEGSEGMENTNUM1DB10DUP 10 数据定义NUM2DB10H 20H 50HNUM3DW20DUP 0 4DUP 2 NUM4DB STRING D SEGENDS MOVCL SIZENUM4 1 1 CLMOVCH SIZENUM3 20 2 CH MOVAH TYPENUM3 2 AHMOVBH LENGTHNUM3 20 BH 最外层 MOVSI OFFSETNUM1 NUM1的偏移量 SIMOVDI OFFSETNUM2 NUM2的偏移量 DI MOVAX SEGNUM1MOVBX SEGNUM2 NUM2与NUM1段基址值相同 23 属性运算符 PTR SHORT SHORT格式 JMPSHORT标号操作 转移的距离属性为短 即转移范围为 128 127字节 PTR格式 类型PTR表达式操作 对存储器表达式 类型可为BYTE WORD DWORD QWORD和TBYTE 表达式为标号时 类型可为NEAR或FAR 该运算符显式指定表达式的类型 24 PTR运算符示例 1 DATA1DB10H 20H 30HDATA2DW4023H 1A00H 数据定义 MOVAX WORDPTRDATA1 AX 2010HMOVBL BYTEPTRDATA2 BL 23HPTR运算符指明DATA1由原来的字节变量临时改变为字变量 而字变量DATA2则临时变为字节变量 所谓临时是指在当前指令语句中有效 而存储分配情况并不改变 2 MOVBYTEPTR SI 60H 字节传送SUBWORDPTR BX 36H 字数据减JMPFARPTRS1 段间转移 25 本课件涉及到的运算符优先级优先级运算符类别1LENGTH SIZE数值回送运算符2PTR OFFSET SEG TYPE 属性与数值回送运算符3 符号运算符4 MOD算术运算 移位运算符5 算术运算符6EQ NE LT LE GT GE关系运算符7NOT逻辑运算符8AND逻辑运算符9OR XOR逻辑运算符说明 优先级1最高 而优先级9最低圆括号 可改变执行顺序 26 三 段定义伪指令1 完整的段定义伪指令格式 段名SEGMENT 定位类型 组合类型 使用类型 类别名 段名ENDS操作 定义逻辑段 1 定位类型指定当前段的起始地址的性质1 PARA段起始地址的低4位为0H 即16的倍数 2 PAGE段起始地址的低8位为00H 即256的倍数3 BYTE段可从任意地址开始4 WORD当前段的起始地址为偶地址5 DWORD段的起始地址为4的倍数默认项是PARA 27 2 组合类型说明程序连接时的段合并方法1 PRIVATE为私有段 连接时不与其他模块中的同名段合并2 PUBLIC不同模块的同名段连接在一起 形成参与邻接模块所公用的物理段3 COMMON产生一个覆盖段 与其它具有该类型的同名段拥有同一起始地址 共享相同的存储区 共享存储区的长度由同名段中最大的段确定4 STACK功能同PUBLIC 但新形成的段为堆栈段默认项是PRIVATE 28 3 使用类型说明使用16位还是32位寻址方式USE16使用16位寻址方式USE32使用32位寻址方式386以下处理器默认项是USE16 386及以上处理器默认项是USE32 4 类别名 LINK程序将 类别名 相同的段依次序连续存放在内存中 如果这些段未选择PUBLIC COMMON组合类型 则这些段将各自独立缺省 类别名 作空处理 29 段定义伪指令示例D SEGSEGMENTPARA DATA NUM1DB10DUP D SEGENDSS SEGSEGMENTPARA STACK DW100DUP S SEGENDSE SEGSEGMENTPARA DATA STRINGDB HELLO E SEGENDS 30 2 指定段寄存器伪指令格式 ASSUME段寄存器 段名 段寄存器 段名 操作 明确段与段寄存器的关系 说明 1 代码段中必须至少有一个ASSUME语句2 ASSUME可以出现在源程序中的任意地方3 仅说明段与段寄存器的对应关系 除了在程序装入时将代码段和堆栈段的段基址赋值给CS和SS外 并没有把数据段和附加段的段基址值送入DS ES GS和FS寄存器中 需要在程序中显式赋值 31 ASSUME语句示例D SEGSEGMENTPARA DATA NUM1DB10DUP D SEGENDSS SEGSEGMENTPARA STACK DW100DUP S SEGENDSE SEGSEGMENTPARA DATA STRINGDB HELLO E SEGENDSC SEGSEGMENTPARA CODE ASSUMECS C SEG DS D SEG ES E SEG SS S SEGSTART C SEGENDSENDSTART这里明确D SEG段为数据段 S SEG段为堆栈段 E SEG段为附加段 C SEG为代码段 32 段寄存器的赋值 1 代码段寄存器CS 及IP 的赋值当连接程序扫描到程序结束伪指令END符号地址时 系统自动将当前代码段基址赋值给CS 同时把END后的符号地址送入IP 系统自动填入SS示例S SEGSEGMENTPARASTACK STACK DW200DUP S SEGENDS 1 系统自动填入被定义为堆栈的段选择STACK组合类型 当含有该段的目标程序被装入存储器时 系统自动取该段基址送SS 取段长度送SP 2 堆栈寄存器SS 及SP 的填入有以下两种方法 33 2 用指令填入被定义为堆栈的段在组合类型位置上缺省 在代码段中用3条MOV指令完成这个功能 用指令填入SS示例S SEGSEGMENTPARA STACK DW200DUP TOPLABLEWORDS SEGENDSC SEGSEGMENTPARA CODE ASSUMECS C SEG SS S SEG DS NOTHING ES NOTHINGSTART MOVAX S SEG 填入段基址MOVSS AXLEASP TOP 填入栈指针C SEGENDSENDSTART 34 3 数据段寄存器DS及附加段寄存器的填入用MOV传送指令填入 填入DS ES示例D SEGSEGMENTPARA DATA 数据段XDW 4000H 100DUP D SEGENDSE SEGSEGMENTPARA DATA 附加段STRINGDB EXAMPLE E SEGENDSC SEGSEGMENTPARA CODE ASSUMECS C SEG DS D SEG ES E SEG SS S SEGSTART MOVAX D SEGMOVDS AX 数据段基址 DSMOVAX E SEGMOVES AX 附加段基址 ES 35 3 存储模型与简化段定义伪指令1 模式选择伪指令MODEL格式 MODEL模式选择符功能 指明简化段所用内存模式 Tiny模式 微模式 所有数据和代码放入同一物理段内 可写成 COM文件形式Small模式 小模式 所有数据放在一个64KB的段 所有代码放在一个64KB的段Medium模式 中模式 所有数据放在一个64KB的段 代码可放在多个段Compact模式 压缩模式 所有代码放在一个64KB的段 数据可放在多个段Large模式 大模式 代码和数据都可用多个段Huge 与Large相同 但数据段大小可超过64KBFlat 允许用户用32位偏移量 36 2 简化的段定义伪指令 数据段定义伪指令格式 DATA 名字 功能 定义数据段 若有多个数据段 用名字区别 只有一个数据段时 段名为 DATA 栈段定义伪指令格式 STACK 名字 功能 定义一个栈段 并形成SS及SP的初值 SP的默认值为1024 隐含段名为 STACK 代码段定义伪指令格式 CODE 名字 功能 定义代码段 若有多个代码段 用名字区别 只有一个代码段时 段名为 CODE 37 简化段定义示例 MODELSMALL STACK100H DATA CODESTART MOVAX DATAMOVDS AX MOVAX 4C00HINT21HENDSTART 38 四 程序开始和结束伪指令1 程序开始伪指令格式1 NAME模块名操作1 用此名作为模块名如缺省则以模块的源程序文件名为模块名 模块命名伪指令示例NAMEMODE1 NAMEMODE2 TITLEEXAM 格式2 TITLE文本操作2 没有NAME时 用其前6个字符作为模块名可在列表文件中打印标题 39 2 源程序结束控制伪指令格式1 END格式2 END符号地址功能 告诉汇编程序 源程序到此结束 并将符号地址所示单元的段基址和偏移量自动装入CS和IP中 源程序结束控制伪指令示例C SEGSEGMENTPARA CODE ASSUMECS C SEG START C SEGENDSENDSTART说明 源程序从标号START处开始执行 40 五 表达式赋值伪指令 EQU 格式 名字EQU表达式名字 表达式操作 为表达式取一个名字 供以后引用说明 1 表达式可为常数 变量 标号 指令助记符 字符串2 在一个源程序中 被EQU伪指令赋值的符号不能再次赋值 而用 定义的符号名可重复定义 3 赋值语句仅在汇编源程序时 作为替代符号用 不产生目标代码 也不占有存储单元 41 赋值伪指令示例CONSTEQU100 2 定义符号常数ADDRSEQU BX 10 为地址表达式定义名字CHAREQU COMPUTER 为字符串定义名字COUNT AX 给寄存器定义名字 MOVBX CONST 引用ADDBX COUNTSUBADDRS 20 等同于MOVBX 100 2ADDBX AXSUB BX 10 20 42 六 地址计数器与对准伪指令1 地址计数器 示例1ARRAYDW1 2 4 3 4 3 ARRAY01h0074H0002h0076H007Ch0078H0003h007AH0004h007CH0081h007EH00 示例2BUFFERDB1 2 3 4 5COUNTEQU BUFFER数据定义的结果 COUNT的值即为BUFFER的长度 示例3OUT21H ALJMP 2 跳转到下一句MOVAX 0 43 2 定位伪指令格式1 ORG表达式格式2 ORG 表达式功能 将表达式的值送入程序计数器 表示程序计数器的当前值定位伪指令示例10H20HD SEGSEGMENTPARA DATA 11H30HORG10HXDB20H 30HORG 517H40HYDB40H 50H18H50HD SEGENDS 44 完整段定义结构简化段定义结构程序段前缀结构COM文件结构 汇编语言源程序结构 45 完整段定义结构 DATASEGMENT DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX MOVAH 4CHINT21HCODEENDSENDSTART 什么作用 46 简化段定义结构 MODELSMALL DATA CODEMOVAX DATAMOVDS AX MOVAH 4CHINT21HEND 47 利用程序段前缀的结构 DATASEGMENT DATAENDSCODESEGMENTASSUMECS CODE DS DATAMAINPROCFARPUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AX RETMAINENDPCODEENDSENDMAIN 48 常用的返回DOS的方法 使用DOS功能调用的4CH功能 MOVAH 4CHINT21H使用INT20H指令将主程序设计成一个属性为FAR的过程 由DOS调用该过程执行 由RET指令返回DOS 原理和使用方法见后 49 统计一个字节数据块中负元素的个数 存入变量CNTD SEGSEGMENTARRAYDB 1 10 11 7 9 4 8LENEQU ARRAYCNTDB D SEGENDS LEASI ARRAYJSU INCSIMOVCX LENLOOPLPMOVDX 0MOVCNT DLLP MOVAL SI MOVAH 4CHCMPAL 0INT21HJGEJSUINCDL 50 INT20HDS程序段前缀区程序区 程序加载结构 操作系统加载EXE程序时自动在前面加上256字节的程序段前缀 PUSHDSMOVAX 0PUSHAX把程序段前缀区第一个字节单元的地址和偏移量压栈保存 这个单元是指令INT20H 这几句一定要放在主程序开始的位置RET指令把程序段前缀区第一个字节单元的地址和偏移量弹出分别送IP和CS 转去执行INT20H 从而实现返回DOS 51 存储单元NUM中为一个16位的二进数 统计其中值为1的位的个数存入RESULTC SEGSEGMENT MAINPROCFARJZDONEPUSHDSSALAX 1MOVAX 0JNCNEXTPUSHAXINCCLMOVAX D SEGNEXT JMPLOOP1MOVDS AXDONE MOVRESULT CLMOVCX 0RETMOVAX NUMMAINENDPLOOP1 ANDAX AXC SEGENDSENDMAIN本程序采用的是用RET返回DOS的方法循环结束条件是什么 采用这样的条件有什么好处 52 COM文件结构COM文件说明 1 只有一个段 长度 64KB 无其他段 所有的代码 数据和堆栈全部在这一个段中2 第一条可执行指令位于偏移量0100H处 因为此前有256字节的PSP 3 用中断指令返回4 所有过程应定义为NEAR5 COM文件需要先汇编连接成EXE文件 再调用DOS命令exe2bin转换成COM文件 53 源程序形式如下 段名SEGMENTASSUMECS 段名 DS 段名 ES 段名ORG100H标号1 JMP标号2 数据区标号2 给DS ES置初值 主程序体MOVAH 4CH 返回操作系统INT21H段名ENDSEND标号1 54 COM文件源程序示例C SEGSEGMENTPARAASSUMECS C SEG DS C SEG ES C SEGORG100HBEGIN JMPSTARTMANDB WOMANDB NUMDB30START MOVAX CSMOVDS AXMOVES AX MOVAH 4CHINT21HC SEGENDSENDBEGIN 55 4 5宏定义 宏调用与宏展开 自学 宏定义是源程序中一段有独立功能的程序代码 将这一段程序定义为一条宏指令 并具有一个相应的宏指令名 在程序中就可以多次调用它 调用时只需要引用一个宏指令名来代替这一段程序就可以了 在汇编的时候 汇编程序会自动将这个宏指令扩展成整段程序 56 宏定义宏定义有两种格式 1 简单宏定义宏名MACRO 宏体 宏体ENDM 简单宏定义示例CRLFMACROMOVAH 02HMOVDL 0DH 回车INT21HMOVDL 0AH 换行MOVAH 02HINT21HENDM 57 带形参的宏定义示例MULTIPLYMACROOPR1 OPR2 RESULTPUSHDXPUSHAXMOVAX OPR1IMULOPR2MOVRELUST AXMOVRESULT 2 DXPOPAXPOPDXENDM 2 带形参的宏定义宏名MACRO 宏体 宏体ENDM 58 宏调用宏调用有两种格式 1 对简单的宏定义的调用 宏名2 带形参的宏定义的调用 宏名 宏调用示例CRLFMULTIPLYCX VAR XYZ BX MULTIPLY240 BX SAVE 59 宏扩展 宏展开 宏扩展 汇编程序对汇编源程序汇编时将宏体插入到宏调用处 MULTIPLY宏扩展示例 PUSHDX PUSHAX MOVAX CX IMULVAR MOVXYZ BX AX 实参替换形参 MOVXYZ BX 2 DX POPAX POPDX说明 汇编程序在所展开的指令前加 号以示区别 60 宏指令与子程序的区别子程序宏指令程序执行期间在汇编期间展开由主程序调用它只占有自身与调用次数有关 每调用一次大小的空间就把宏定义体展开一次执行时需增加时间直接执行宏体上的额外开销 61 62 宏定义的进一步讨论 1 宏定义可以无变元2 变元可以是操作码 宏定义 FOOMACROP1 P2 P3MOVAX P1P2P3ENDM宏调用 FOOWORD VAR INC AX宏展开 MOVAX WORD VAR INCAX 63 3 变元可以是操作码的一部分 必须用 作为分隔符 宏定义 LEAPMACROCOND LABJ CONDLABENDM宏调用 LEAPC THERE宏展开 JCTHERE 64 4 变元是ASCII串 宏定义 MSGGENMACROLAB NUM XYZLAB NUMDB HELLOMR XYZ ENDM宏调用 MSGGENMSG 1 TAYLOR宏展开 MSG1DB HELLOMR TAYLOR 65 5 宏定义体内允许使用标号 此时 须使用LOCAL伪操作 宏定义 ABSOLMACROOPERLOCALNEXTCMPOPER 0JGENEXTNEGOPERNEXT ENDM宏调用 ABSOLVAR ABSOLBX 宏展开 CMPVAR 0 JGE 0000 NEGVAR 0000 CMPBX 0 JGE 0001 NEGBX 0001 66 6 宏定义中可以使用宏调用 必须先定义后调用 宏定义 DIFMACROX YMOVAX XSUBAX YENDMDIFSQRMACROOPR1 OPR2 RESULTPUSHDXPUSHAXDIFOPR1 OPR2IMULAXMOVRESULT AXPOPAXPOPDXENDM 67 4 6 1程序的基本结构有三种 顺序结构 分支结构和循环结构 1 顺序结构顺序结构是最简单也是最基本的程序结构 程序按顺序执行 不发生任何转移 语句1 语句n 语句2 4 6程序的基本结构 68 2 分支结构分支结构是指计算机根据实际情况或条件 作出判断和选择 转而执行不同的程序段的一种程序结构 条件 程序段 条件 程序段A 程序段B Y N Y N 69 多路分支结构根据某个控制字的各 位 状态实行多路转移 多路条件测试 程序段1 程序段2 程序段n 70 3 循环结构任务需要重复执行某一程序段 这种情况采用循环结构来实现 初始化 循环体 修改部分 控制部分 初始化 控制部分 循环体 修改部分 N Y Y N 71 两个32位无符号数乘法程序 NUM1DD12345678HNUM2DD5A4BEF06HRESUDD2DUP MOVEAX NUM1MULNUM2MOVRESU EAXMOVRESU 4 EDX 4 6 2顺序结构程序设计 72 压缩的BCD码转化成ASCII码BCD BUFDB96HASC BUFDB2DUP BCD BUF96 MOVAL BCD BUFMOVCL 4MOVBL ALSHRAL CL 右移4位 将高4位填0ADDAL 30HMOVASC BUF ALANDBL 0FHADDBL 30HMOVASC BUF 1 BL ASC BUF 9 6 73 用直接查表法完成将键盘输入的一位10进制数 0 9 转换成对应的平方值并存放在SQRBUF单元中 SQUTABDB0 1 4 9 16 25 36 49 64 81SQRBUFDB MOVBX OFFSETSQUTABMOVAH 1INT21H DOS功能调用的1号子功能是键盘输入SUBAL 30HXLATMOVSQRBUF AL 74 把存储单元A和B中的两个单字节压缩BCD码相加 结果存到C单元中 进位存放到C 1中 ADB32HBDB15HCDB2DUP MOVAL A 取被加数ADDAL B 二进制加法DAA 调整为十进制结果MOVC AL 存回C单元LAHF 取标志位ANDAH 01 取CF位MOVC 1 AH 存进位到C 1单元 要求不用分支结构 该怎么做 如果用分支结构该怎么做 75 1 比较 转移利用比较和条件转移指令实现两路分支 比较结果记录在某些标志位中 条件转移指令根据约定的条件进行对照 满足条件时转移 不满足条件时不转移 2 跳转表转移利用跳转表实现多路分支 比较 转移指令可嵌套 但程序结构复杂 跳转表可使程序结构清晰 4 6 3分支结构程序设计 76 利用比较和条件转移指令实现程序分支变量X为一任意有符号字节数 若X为负数 则将其取补码 否则 和Y相加 其和存入AX中 MOVAL XCMPAL 0JGEADDTNEGAL X求补MOVX ALJMPEXITADDT ADDAL Y X YADCAH 0EXIT X 0 X X取补 AX X Y Y N 77 设字节单元N1 N2中存放无符号数 1 若两个均是偶数 则分别加1后送D1 D2中 2 若两个均是奇数 则直接送D1 D2中 3 若一个是奇数 一个是偶数 则把奇数送D1 偶数送D2中 AL N1 AH N2 AL 0 0 AH 0 0 AL AL 1AH AH 1 AL AH D1 AL D2 AH 奇 偶 偶 奇 注意 根据条件 当N1是奇数时 无论N2是奇数还是偶数 都只需直接送D1 D2 78 程序如下 MOVAL N1MOVAH N2TESTAL 01H 测试N1的奇偶JNEENDO N1为奇数TESTAH 01H 测试N2的奇偶JNEL1 N2是奇数 转移INCAL 两个均是偶数INCAHJMPENDOL1 XCHGAL AH N1是偶数 N2是奇数ENDO MOVD1 AL 存放结果MOVD2 AH 转上页 79 利用跳转表实现多路分支跳转表是在某一内存区域顺序排列的一组有规律的入口地址 如是段内分支 每个地址占两个单元 IP的值 如是段间分支 每个地址占4个单元 CS IP的值 TABLESUB1TABLESUB1SUB2SUB3SUB2 IP IP IP IP CS IP CS 段内转移段间转移 80 根据AL中哪一位为1 从低位到高位 把程序转移到8个不同的程序分支去 TABLEDWROUTINE 1DWROUTINE 2DWROUTINE 3DWROUTINE 4DWROUTINE 5DWROUTINE 6DWROUTINE 7DWROUTINE 8 81 方法1用变址寻址方式 CMPAL 0JEDONEMOVSI 0L SHRAL 1JNBNOT YET CF 0或ZF 1跳转JMPTABLE SI NOT YET JZDONEADDSI TYPETABLE TypeTable 2JMPLDONE 82 方法2用寄存器间接寻址方式 CMPAL 0JEDONELEABX TABLEL SHRAL 1JNBNOT YETJMPWORDPTR BX NOT YET JZDONEADDBX TYPETABLEJMPLDONE 83 方法3用基址变址寻址方式 CMPAL 0JEDONELEABX TABLEMOVSI 7 TYPETABLEMOVCX 8L SHLAL 1JNBNOT YETJMPWORDPTR BX SI NOT YET JZDONESUBSI TYPETABLEJMPLDONE 84 在附加段中有一个从小到大排序的无符号数字数组 其首地址在DI中 数组的第一个单元存放数组长度 要求在数组中查找 AX 如找到 CF 0 并在SI中给出该元素在数组中的偏移地址 如未找到 CF 1 算法 在R数组中查找K 采用折半查找法LOW 1 HIGH N 若LOW HIGH 则查找失败 置CF 1 退出程序 否则 计算中点 MID LOW HIGH 2 3 K与R MID 比较 若 R MID 则查找成功 程序结束 若KR MID 则转 5 4 HIGH MID 1 转 2 5 LOW MID 1 转 2 85 CMPAX ES DI 2 与第一个数比较JACHK LAST AX ES DI 2 转LEASI ES DI 2 JEEXIT 相等 找到 就是第一个数STC 小于第一个数 失败JMPEXITCHK LAST MOVSI ES DI 取数组长度SHLSI 1 长度 2 DW型 ADDSI DICMPAX ES SI 与最后的数比较JBSEARCH 小于则转JEEXIT 相等则结束STC 大于最后一个 失败JMPEXIT 86 SEARCH MOVLOW IDX 1 给LOW赋初值MOVBX ES DI MOVHIGH IDX BX 给HIGH赋初值MOVBX DI BX中放首地址MID MOVCX LOW IDXMOVDX HIGH IDXCMPCX DXJANO MATCH LOW HIGH 失败ADDCX DXSHRCX 1 折半MOVSI CXSHLSI 1 2 DW型 COMPARE CMPAX ES BX SI 与中间数比较JEEXIT 相等 找到 87 JAHIGHER 大于中间数 转DECCXMOVHIGH IDX CX 调整查找区间到前半部分JMPMIDHIGHER INCCXMOVLOW IDX CX 调整查找区间到后半部分JMPMIDNO MATCH STCEXIT 88 循环程序的组成 1 初始化部分设置初始值2 循环工作部分具体的操作和运算3 循环修改部分为执行下一循环而修改某些参数4 循环控制部分判断循环继续还是结束 循环控制方法有 1 计数控制法增数法减数法 2 条件控制法 4 6 4循环结构程序设计 89 单重循环程序设计将以s1为起始地址的26个字母依次传送到以s2为起始地址的连续单元中 数据定义如下 DATASEGMENTS1DB ABCD XYZ DATAENDSESTRASEGMENTS2DB26DUP ESTRAENDS 90 方法1采用寄存器间接寻址方式MOVAX SEGS1 初始化MOVDS AXMOVAX SEGS2MOVES AXMOVSI OFFSETS1MOVDI OFFSETS2MOVCX 26LOP1 MOVAL SI 工作部分MOVES DI ALINCSI 修改部分INCDILOOPLOP1 控制部分 91 方法2采用变址寻址方式MOVAX SEGS1 初始化MOVDS AXMOVAX SEGS2MOVES AXMOVSI 0MOVDI 0MOVCX 26LOP1 MOVAL S1 SI 工作部分MOVES S2 DI ALINCSI 修改部分INCDILOOPLOP1 控制部分 92 方法3采用基址变址寻址方式MOVAX SEGS1 初始化MOVDS AXMOVAX SEGS2MOVES AXMOVBX OFFSETS1MOVBP OFFSETS2MOVSI 0MOVDI 0MOVCX 26LOP1 MOVAL BX SI 工作部分MOVES BP DI ALINCSI 修改部分INCDILOOPLOP1 控制部分 93 方法4采用串处理指令MOVAX SEGS1 初始化MOVDS AXMOVAX SEGS2MOVES AXLEASI S1LEADI S2MOVCX 26CLDREPMOVSB 94 计数控制法计数控制法适用于循环次数已知的场合 2 减数法初始化时循环计数器置为循环次数 每执行一次循环体后计数器减1 并测试循环计数器是否为0 如为0则终止循环 减数法一般用循环指令形成循环回路 1 增数法初始化时循环计数器置0 每执行一次循环体后计数器加1 并与已知的循环次数比较 如相等则退出循环 增数法一般用比较指令和条件转移指令实现循环转移 95 NUMDW1 MOVCX 0 初始化MOVAX 0ROTATE ADDAX NUM 累加INCWORDPTR NUM INCCX 计数器加1CMPCX 50 与已知的循环次数比较JNZROTATEMOVS AX 增数法计算S 1 2 3 50 结果存入AX中 如何做N的阶乘N 96 减数法将内存中6个十进制数的ASCII码转换为非压缩BCD码 并存放在后继相应单元中 如错 存放0FFH ASCBUFDB35H 38H 30H 4DH 39H 32HDB6DUP MOVDIOFFSETASCBUFMOVCX 6LAB 1 MOVBL 0FFH 设置错误标志MOVAL DI CMPAL 3AHJNBOK 大于等于3A则错SUBAL 30HJCOK 小于30H也错MOVBL AL OK MOVAL BLMOV DI 06H ALINCDILOOPLAB1 97 条件控制法在许多情况下 事先无法确定循环次数 这时可选用 条件 来控制循环 在问题的求解过程中 找出一个终止循环的条件 每循环一次 对条件进行一次检测 如满足终止循环的条件 便退出循环 否则继续循环 利用条件转移指令控制循环是否结束 有些情况下为防止死循环 可以附加一个合适的循环次数 98 条件控制法求字符串长度 从STRN地址开始有一个字符串 以 作为结束标志 长度不超过100个字节 要求统计该字符串长度并存于LENG单元 分析 1 设DX存放统计的串长度 为防止程序死循环 可根据串长不超过100作为循环结束的附加条件 2 如果程序运行过程中找到 则正常退出循环 如找不到 由于CX的初值为100 故不会使程序死循环 定义数据段如下 DATASEGMENTSTRNDB XCVFATTDEQJHI LENGDB0DATAENDS 99 MOVAX 0MOVDX AX DX清零LEADI STRN 串指针赋初值MOVCX 100 初始值为100MOVAL LP CMPAL DI JEDONE 条件控制INCDX 串长 1INCDI 串指针后移一个字节LOOPLP 附加条件DONE MOVLENG DL 存字符串长度 100 多重循环程序设计多重循环就其本质而言 就是循环层1包含循环层2 循环层2可能又包含循环层3 循环层1为最外层 内层循环是外层循环的循环体的一部分 101 多重循环程序设计 如果多重循环都使用LOOP语句 则要保护好外层循环的计数器CX 通常采用压栈或退栈的方法或者转存的方法 102 有一个首地址为A的N字数组 使该数组中的数从大到小排序 MOVCX NDECCXLOOP1 MOVDI CX 暂存外循环计数值MOVBX 0LOOP2 MOVAX A BX CMPAX A BX 2 比较a i 与a i 1 JGECOTINUEXCHGAX A BX 2 交换MOVA BX AXCOTINUE ADDBX 2LOOPLOOP2MOVCX DI 恢复外循环计数值LOOPLOOP1 冒泡排序法 103 4 6 5子程序设计 过程定义伪指令子程序的调用和返回主程序与子程序的连接子程序调用中的数据保护与恢复主程序与子程序之间的参数传递子程序嵌套与递归 104 格式 过程名PROC属性 过程体RET 过程体过程名ENDP说明 1 过程名是该子程序名 也是指令CALL的目标操作数2 过程的属性有两种 NEAR和FAR 分别表示段内调用和段间调用 若省略 则默认为NEAR3 至少有一条RET指令从过程中返回 可在过程中的任何位置 过程定义伪指令 105 主程序子程序SUBPROC CALLSUB 断点 RET 子程序的调用和返回 106 C SEGSEGMENTASSUMECS C SEGMAINPROCFAR 主程序 CALLSUB A MAINENDPSUB APROCNEAR 子程序 RETSUB AENDPC SEGENDSENDMAIN 主程序与子程序的连接 1 主程序和子程序在同一代码段内 107 模块1 模块2C SEG1SEGMENTC SEG2SEGMENTASSUMECS C SEG1ASSUMECS C SEG2 MAINPROCFARSUB 1PROCFAR CALLFARPTRSUB 1RET RETSUB 1ENDPMAINENDPC SEG2ENDSC SEG1ENDSENDENDMAIN 2 调用程序与子程序不在同一代码段内 108 为避免在主程序和子程序中使用相同的寄存器而引起的冲突 需要在调用子程序前对这些寄存器进行保护 在子程序调用结束后 再恢复原来的值 保护和恢复现场最佳的办法就是利用堆栈 以下就是一个保护和恢复现场的例子 SUBTPROCNEARPUSHAX 保护现场PUSHBXPUSHCX POPCX 恢复现场POPBXPOPAX 注意弹出的顺序与压栈顺序相反RETSUBTENDP 子程序调用中的数据保护与恢复 109 定义一个过程 它的功能是将AL中的组合BCD码转为ASCII码 再存入BX寻址的连续的两个内存单元中 TRANPROCFARPUSHAXPUSHBXPUSHCXPUSHDXMOVDL ALMOVCL 4SHRAL CLORAL 30HMOV BX ALINCBX MOVAL DLANDAL 0FHORAL 30HMOV BX ALPOPDXPOPCXPOPBXPOPAXRETTRANENDP 110 参数传递的方法一般有三种 1 寄存器传送将入口参数和出口参数放在约定的寄存器中适用于参数个数较少的情况 2 存储单元传递有直接存储单元传递和地址表传递两种方法 3 利用堆栈传递参数应注意避免破坏断点 主程序与子程序之间的参数传递 111 寄存器传递参数示例1十进制到十六进制数转换 从键盘取得一个十进制数 将其以十六进数形式显示出来 调用DECIBIN 调用CRLF 调用BINIHEX 调用CRLF 从键盘取得十进制数 小于65536 保存在BX 显示回车和换行 用十六进制形式显示BX中的数 112 主程序 MAINPROCFARREPEAT CALLDECIBINCALLCRLFCALLBINIHEXCALLCRLFJMPREPEATMAINENDP 113 DECIBINPROCNEAR 出口参数BXMOVBX 0NEWCHAR MOVAH 1INT21H 读键盘 输入的ASCII在AL中SUBAL 30HJLEXIT 小于0转CMPAL 9JGEXIT 大于9转CBW 字节转成字XCHGAX BXMOVCX 10MULCX 将以前的值乘以10XCHGAX BXADDBX AX 加这一次读的值JMPNEWCHAREXIT RETDECIBINENDP 功能 从键盘取得十进制数 保存在BX 114 BINIHEXPROCNEAR 入口参数BXMOVCH 4 循环4次 BX中有4位16进制数 ROTATE MOVCL 4ROLBX CL 循环左移四位 从最高位输出MOVAL BLANDAL 0FHADDAL 30HCMPAL 3AHJLPRINTIT 是0 9ADDAL 7 是A FPRINTIT MOVDL ALMOVAH 2INT21H 显示 输出 DL中的一个字符DECCHJNZROTATERETBINIHEXENDP 功能 用十六进制形式显示BX中的数 115 CRLFPROCNEARMOVDL 0DH 回车MOVAH 2INT21H 输出DL中的字符MOVDL 0AH 换行MOVAH 2INT21H 输出DL中的字符RETCRLFENDP 功能 显示回车和换行 116 寄存器传递参数示例2求数组元素之和 D SEGSEGMENTARRAYDB10 20 30 5 60COUNTEQU ARRAY 数组元素个数D SEGENDSS SEGSEGMENTPARASTACKDW100DUP S SEGENDSC SEGSEGMENTASSUMECS C SEG DS D SEG SS S SEGSTART LEASI ARRAY 参数准备MOVCX COUNTCALLSUM1 求和 117 子程序 SUM1 入口参数 SI 数组首址 CX 数组长度 出口参数 AX 数组和 使用寄存器 AX CX SISUM1PROCNEARCMPCX 0JZEXITXORAX AXAGAIN ADDAL SI ADCAH 0INCSILOOPAGAINEXIT RETSUM1ENDP 118 直接存储单元传送示例求数组元素之和 结果送SUM单元D SEGSEGMENTARRAYDW100DUP COUNTDW100SUMDW D SEGENDS CALLPROADD 主程序 119 PROADDPROCPUSHAX 保存现场PUSHCXPUSHSIXORAX AXLEASI ARRAY 直接使用存储单元中数据MOVCX COUNTNEXT ADDAX SI ADDSI 2LOOPNEXTMOVSUM AX 结果直接送SUMPOPSI 恢复现场POPCXPOPAXRETPROADDENDP 120 地址表传递示例调用子程序前 把所有参数的地址送入地址表 然后把地址表的偏移量通过寄存器带进子程序 子程序从地址表中取得参数地址 求数组之和D SEGSEGMENTARRAYDW50DUP COUNTDW50SUMDW TABLEDW3DUP D SEGENDS MOVTABLE OFFSETARRAYMOVTABLE 2 OFFSETCOUNTMOVTALBE 4 OFFSETSUMTABLEARRAY首址LEABX TABLE 2COUNT地址CALLPROADD 4SUM地址 121 PROADDPROC 入口参数BX为地址表首地址PUSHA 保护现场MOVSI BX 数组首地址送SIMOVDI BX 2 数组长度单元地址送BPMOVCX
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年单招综合素质测试题及答案
- 石油伴生气回收综合利用项目施工方案
- 堤顶防汛道路设计与施工优化方案
- 集装箱泊位建设工程施工方案
- 工业污水处理厂项目施工方案
- 城市综合体物业续约合同及环保服务标准
- 环保产业劳动合同签订与绿色产业发展战略
- 离婚协议书模板:房产、车辆及共同债务分割协议
- 《离婚协议书签订后变更与解除法律依据》
- 矿山开采项目竣工财务决算编制与审查服务合同
- 智能计算系统:从深度学习到大模型 第2版课件 2、第二章-深度学习基础
- 工程土石方运输合同
- 新能源车辆火灾防范与救援
- 教科版(2017)小学科学六年上册《斜面》说课稿(附反思、板书)课件
- 统编版七年级道德与法治上册《第三课梦想始于当下》单元检测卷(含答案)
- 合同制消防员违纪处理
- 《谵妄评估培训》课件
- 高级考评员职业技能鉴定考试题库(含答案)
- 8《荷花淀》《小二黑结婚》《党费》群文阅读课件 2024-2025学年统编版高中语文选择性必修中册
- GB/T 10069.3-2024旋转电机噪声测定方法及限值第3部分:噪声限值
- DL∕ T 1060-2007 750KV交流输电线路带电作业技术导则
评论
0/150
提交评论