汇编程序的设计方法.ppt

上传人:za****8 文档编号:16592768 上传时间:2020-10-17 格式:PPT 页数:32 大小:354.50KB
返回 下载 相关 举报
汇编程序的设计方法.ppt_第1页
第1页 / 共32页
汇编程序的设计方法.ppt_第2页
第2页 / 共32页
汇编程序的设计方法.ppt_第3页
第3页 / 共32页
点击查看更多>>
资源描述
第三章 汇编程序的设计方法 3 1 顺序程序设计 一、乘法指令 1、 无符号数乘法指令 MUL 格式: MUL 源( mem、 reg) 功能: 累加器( AL / AX)内容与源操作数相乘,结果存 于 AX / DX+AX。 有符号数乘法 无符号数乘法 字节乘法 AL 源 AX 字乘法 AX 源 DX AX 隐含寻址 例: MUL BX; AX BX的积存于 DX+AX MUL BYTE PTR SI ; AL SI间接寻址的 mem单元 中的数据,乘积存于 AX 说明:运算结果影响 CF、 OF,对 AF、 PF、 SF、 ZF未定义 若乘积的 AH / DX0,则 CF=OF=1,说明 AH / DX中有数据 否则, CF=OF=0。 2、 有符号数乘法指令 IMUL 说明:除了对象是有符号数,其余思路、格式等与 MUL相 同 。 例:计算 AL=FEH, CL=11H的积。 MUL CL IMUL CL 注:运算结果影响 CF、 OF。 CF=OF=0,说明积的高半部分是符号扩展; CF=OF=1,说明积的高半部分有有效数据; 另:同样两个数,用 MUL、 IMUL指令后,运算结果不同。 无符号数用 MUL ,有符号数用 IMUL 看书例 P81 结果: FEH 11H=10DEH, CF=OF=1 结果: FEH 11H=FFDEH, CF=OF=0 二、除法指令 看书图,对比乘法指令学习。 三、扩展指令 1、 字节转换为字 CBW 功能: 按 AL的符号位扩展到整个 AH中。 字节除法之前,用该指令产生双字节被除数。 例: MOV AL, 24H CBW 例: MOV AL, 84H CBW 规则: 当 AL 80H时, AH=00H AL 80H时, AH=FFH 结果: AX=0024H 结果: AX=FF84H 2、 字转换为双字 CWD 功能: 按 AX的符号位扩展到整个 DX中。 字除法之前,用该指令产生双字被除数。 规则: 当 AX 8000H时, DX=0000H AX 8000H时, DX=FFFFH 四、综合程序举例 看书 P84 例 3 2 分支程序设计 分支程序:根据不同条件转向不同程序段执行的结构。 转移指令 一、无条件转移指令 JMP 1、 直接转移指令 (1) 段内直接转移 格式: JMP 标号 说明:标号 也称符号地址,它表示转移的目的地。 例: JMP 2500H 无条件转移指令 条件转移指令 段内转移 段间转移 直接 间接 直接 间接 转去执行 CS: 2500H单元的指令 (2) 段间直接转移 格式: 功能:将指令操作码后连续两个字作为立即数,用来修改 CS: IP的内容,然后转向新的 CS: IP指向的地址。 例: JMP 8000H: 1200H 操作码 00 12 00 80 IP CS 计算出物理地址 =81200H,程序转向从该单元开始的指令继 续执行 2、间 接转移指令 (1) 段内间接转移 说明:转移地址为指令指定的 16位 reg或 mem,可采用各 种寻址方式。 格式: JMP 目标 例: JMP BX JMP WORD PTR BX+DI (2) 段间间接转移 例: JMP DWORD PTR BX 功能:转向 BX 指向的 32位存储器地址,将连续 4个单元 的内容低字送 IP,高字送 CS。,程序转向新的 CS: IP指 向的单元存储的指令继续执行。 总结: 区分段内段间:看指令中给出的地址是几个 一个地址( 16位) 段内 二个地址( 32位) 段间 区分直接间接:看指令中的地址是直接给出(立 即数 /标号),还是间接放在寄存 器或存储器中。 二、条件转移指令 格式: Jcond OPRD 功能:当满足一定的条件时,转移到指定的地址,否则, 将顺序执行下条指令。 说明:当条件 cond成立,( IP) +偏移地址 IP 当条件 cond不成立,( IP) +2 IP 所有条件转移指令都是直接寻址方式的短转移。 1、简单的条件 转移指令 仅根据一个可测试标志位实现转移的指令。 注: G 大于 L 小于 E 等于 N 不 A 高于 B 低于 指令助记符 功能 标志设 置 JE/JZ 相等 /等于 0转移 ZF=1 JNE/JNZ 不相等 /不等于 0转移 ZF=0 JC JNC JS JNS JO JNO JP/JPE JNP/JPO 表 3 1 简单的条件转移指令 2、无符号数条件 转移指令 3、符号数条件 转移指令 三、分支程序举例 看 P96例 3.7 画出程序流程图 指令助记符 功能 标志设置 JB/JNAE 低于 /不高于等于转移 CF=1且 ZF=0 JNB/JAE 不低于 /高于等于转移 CF=0或 ZF=1 JA/JNBE 高于 /不低于等于转移 CF=0且 ZF=0 JNA/JBE 不高于 /低于等于转移 CF=1或 ZF=1 表 3 2 无符号数条件转移指令 3 3 循环程序设计 一、基本结构 循环一般由 4部分构成: 1、循环初态(初始化 / 准备) 循环工作部分初态 循环结束条件初态 2、循环体: 就是要求重复执行的程序段部分,是循 环程序的主体。 (设置地址指针、某些标志位等,使某些 寄存器清 0) (一般置以循环次数, eg:上例中 CX=8) 3、循环的修改:修改结束条件。 常见的就是计数的,当循环了一定次数后,就结束循环,在微机 中,常用一个内部寄存器,作为计数器,通常给这个计数器赋予循环 次数初值,每循环一次令其减 1,当计数器减为 0时,就停止循环。 4、循环的控制: 每循环一次,就检查循环结束条件,满足条件就停 止循环,顺序向下执行。否则,跳转到循环主体的开始,继续循环。 二、重复控制指令 1、格式: LOOP short lable 说明 : (1)指令执行: CX 1 CX ,若 CX0则程序跳 转到 short lable指向的指令执行;否则退出循环。 (2)循环次数在 CX中。 (3)转移的目标地址是以当前 IP为中心的 128 +127的范围内,故称为短 /近转移。 LOOP = DEC CX JNZ short lable 2、 LOOPZ / LOOPE指令 格式同 LOOP 指令 3、 LOOPNZ / LOOPNE指令 格式同 LOOP 指令 ZF=1或 CX=0 计数非 0且结果非 0循 环 LOOPNZ/LOOPNE short lable ZF=0或 CX=0 计数非 0且结果为 0循 环 LOOPZ/LOOPE short lable CX=0 计数非 0循环 LOOP short lable 结束条件 功能 格式 三、循环程序设计方式及举例 1、 计数控制的循环程序 例:编写程序,统计字变量 W中有多少位 1,并将结果存入 字节变量 N中。 最高位 =1? N+1 Y 修改 判断结束 N Y N END 开始 MOV N, 0 MOV CX, 16 AGAIN: SHL W, 1 JNC NOINC INC N NOINC: LOOP AGAIN 例:书 P97 例 3.10 MOV CX, 4 MOV SI, 0 AND AX, AX AGAIN: MOV AL, BYTE PTR XSI ADC AL, BYTE PTR YSI MOV ZSI, AL INC SI LOOP AGAIN MOV ZSI, 0 RCL ZSI, 1 ret 3 4 串处理程序设计 规定:源串的偏移地址由 SI,段地址取自 DS; 目的串的偏移地址由 DI,段地址取自 ES。 源串和目的串的偏移地址指针的移动方向由方向标志 DF确定。 DF=0, SI、 DI增量 DF=1, SI、 DI减量 一、方向标志修改指令 1、 置 1指令 格式: STD 功能:将 DF = 1,则串操作时 SI / DI的内容自动减量。 2、 清 0指令 格式: CLD 功能:将 DF = 0,则串操作时 SI / DI的内容自动增量。 二、串操作指令 1、 串传送指令 (1) 格式: MOVS 目的串,源串 MOVSB/MOVSW 功能:从 DS: SI指向的源操作数中取一字节 /字,传送到 ES: DI所指向的目的操作数中,并根据方向标志 DF对 SI / DI 进行增量 /减量修改,以指向下一个字节 /字。 例: MOVSB MOVSW MOVS ES: BYTE PTRDI, DS: SI (2) 重复前缀 REP 格式: REP MOVS/ MOVSB / MOVSW 功能:每完成 1次串传送, CX减 1,继续重复串传送,直 到 CX=0为止。 执行: a、 CX 1 CX ; b、 如 CX=0则退出 REP, 否则继续执行; c、 执行其后的 MOVS串指令; d、 重复 ac。 将( DS: SI) ES: DI,且 SI+1, DI+1 将( DS: SI) ES: DI ( DS: SI+1) ES: DI+1,且 SI再加 1, DI再加 1 该指令前期准备: a、 将数据段中的源串首址送入 SI; b、 将 (将要存放数据串的 )附加段中的目的串首址送入 DI; c、 串长度送 CX中 ; d、 建立方向标志。 例:自 1000H地址开始有一字符串,串长 36H个字节,编程 将该串传送到 1200H地址开始的存储区中。 CLD,令 DF=0 STD,令 DF=1 MOV SI, 1000H MOV DI, 1200H MOV CX, 36H CLD REP MOVSB ret 上述程序执行完后,( SI) =? ( DI) =?( CX) =? 2、 串比较指令 (1) 格式: CMPS 目的串,源串 CMPSB/CMPSW 功能:取 DS: SI指向的源串的一字节 /字,减去 ES: DI所 指向的目的串的一字节 /字,不回送结果,只影响标志位, 并同时修改 SI、 DI以指向下一个字节 /字。 (2)当相等 /为零时重复串操作 格式: REPE/REPZ CMPS/ CMPSB / CMPSW 功能: CX=0或 ZF=0(即某次比较的结果两个操作数不等) 时退出,否则继续执行; (3)当不相等 /不为零时重复串操作 格式: REPNE/REPNZ CMPS/ CMPSB / CMPSW 功能: CX=0或 ZF=1(即某次比较的结果两个操作数相等) 时退出,否则继续执行; 3、 串扫描指令 (1) 格式: SCAS 目的串 SCASB/SCASW 功能:用 AL/AX中的内容减去 ES: DI所指向的目 的串中的一字节 /字,不回送结果,只影响标志位, 并同时修改 DI以指向下一个字节 /字。 (2) 格式: REPE/REPZ REPNE/REPNZ 功能: 注:源串隐含 SCAS/ SCASB / SCASW MOV AX,8000H MOV ES,AX MOV DI,1000H MOV CX,32H CLD MOV AL,12H REPNE SCASB DEC DI MOV BX,DI 例:从 8000H:1000H开始存放将一个 50字节的字符串,从中 找出数据 12H,将存放此数据的单元的偏移地址存到 BX 4、从源串中取 串指令 格式: LODS / LODSB / LODSW 功能:从 DS: SI指向的源串中取一个字节 /字,送 到 AL/AX,同时修改 SI指向下一字节 /字。 5、往目的串中存 串指令 格式: STOS / STOSB / STOSW 功能:将 AL/AX 中的一字节 /字存入到 ES: DI指 向的目的串去,同时修改 DI指向下一字节 /字。 注:以上存、取串指令一般不加重复前缀,不影响标志位。 例:将存储器中一个 50字节的非零数组中的正、负数分开, 数组存放的首地址为 1000H,存放正、负数的首址是 2000H、 3000H。 注:目的串隐含 注:源串隐含 CLD MOV SI, 1000H MOV DI, 2000H MOV BX, 3000H MOV CX, 32H LOOP1: LODSB TEST AL, 80H JNZ LL STOSB JMP LR LL: XCHG BX, DI STOSB XCHG DI, BX LR: LOOP LOOP1 ret 3 5 子程序设计 一、子程序的概念 子程序是完成确定功能的独立的程序段,它可以被其 他程序调用,在完成确定功能后,又可自动返回到调用程 序处。 程序 X . 调用程序 Y 程序 Y . 调用 返回 X是 Y的主程序, Y是 X的子程序 调用程序 Z 程序 Z . 调用 返回 二、参数传递 主程序在调用子程序时,应为子程序提供运算所需的 初始数据,而子程序返回时,也将运算结果提供给主程序, 这些问题称为主程序与子程序间的参数传递。 1、寄存器法: 把参数放在 CPU内部的 reg中,通过 reg来 传递相应的信息。 2、堆栈法: 3、参数赋值法: 三、子程序调用指令与返回指令 1、调用指令 CALL 主程序 子程序 入口参数 出口参数 直接 间接 段内 段间 段内 段间 (1) 直接段内调用 格式: CALL NEAR PROC( NEAR型过程的符号地址) 执行: a、 IPH SP 1 IPL SP 2 ; b、 SP 2 SP; c、 被调用子程序的 16位偏移量 IP 。 (2) 直接段间调用 格式: CALL FAR PROC( FAR型过程的符号地址 /程序名) 执行: a、 CSH SP 1、 CSL SP 2 IPH SP 3 、 IPL SP 4 ; b、 SP 4 SP; c、 被调用子程序所在代码段段基址 CS 被调用子程序在所在代码段内的偏移量 IP 。 例: CALL 3000H: 2100H 保护断点 保护断点 (3) 间接段内调用 入口地址由 16reg /16men提供 格式: CALL 16reg /16men 执行: a、 IPH SP 1 IPL SP 2 ; b、 SP 2 SP; c、 16reg /16men IP 。 例: CALL BX CALL WORD PTRBX (4) 间接段间调用 格式: CALL 32men 执行: a、 CSH SP 1、 CSL SP 2 IPH SP 3 、 IPL SP 4 ; b、 SP 4 SP; c、 32men 低 16位 IP 32men 高 16位 CS 。 例: CALL DWORD PTRBX, 若( DS) =6000H,( BX) =0560H,子程序入口地址 如何载入? 60561H、 60560H IP 60563H、 60562H CS 2、返回指令 RET 格式: RET N ( N为正偶数,可缺省) 功能:将程序控制返回到主程序。(是 CALL的逆 操作) 执行: 段内返回: a、 SP IPL SP 1 IPH ; b、 SP 2 SP; 段间返回: a、 SP IPL 、 SP 1 IPH SP 2 CSL 、 SP 3 CSH ; b、 SP 4 SP; 看 书 P130例 3.29 恢复断点
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!