《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt

上传人:xin****828 文档编号:6787279 上传时间:2020-03-04 格式:PPT 页数:99 大小:1.89MB
返回 下载 相关 举报
《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt_第1页
第1页 / 共99页
《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt_第2页
第2页 / 共99页
《汇编语言程序设计》第七章:算术运算指令与程序设计.ppt_第3页
第3页 / 共99页
点击查看更多>>
资源描述
汇编语言程序设计 朱耀庭 南开大学朱耀庭 第7章算术运算指令与程序设计 本章的主要内容就是介绍汇编语言中的算术运算指令及其程序设计 希望同学们在掌握上述内容的同时关注算术运算指令对标志寄存器的影响 因为标志位将是条件转移指令的判断依据 也是分支程序设计实现分支的依据 南开大学朱耀庭 第6章数据传送与顺序程序设计 7 1算术运算和逻辑运算对标记寄存器的影响 7 2算术运算的数据格式 7 3二进制数加减运算 7 4无符号二进制数乘除运算 7 5带符号二进制数乘除运算 7 6非压缩BCD码运算 7 7压缩型BCD码加减运算 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 标志寄存器和其他寄存器不一样 其他寄存器是用来存放数据的 并且整个寄存器具有一个含义 而标志寄存器是按位起作用的 每一位都有专门的含义 详见4 2 3节中的FLAG FLAGRegister 状态标志寄存器 本章主要使用的标志位有 CF PF AF ZF SF OF 下面举例说明算术运算和逻辑运算与标志寄存器的关系 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 例7 1用一个简单的加法例子编写程序计算255 1 256来说明算术运算的结果受标志寄存器的影响 源程序 Ex7 1 asm 如下 CODESEGMENTASSUMECS CODE SS CODEBEGIN MOVAL 255MOVAH 1ADDAL AHMOVAH 4CHINT21HCODEENDSENDBEGIN程序说明 程序执行过程中 AL 0FFH AH 1H AL AL AH 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 图7 1所示为加法运算结果示意图 从图7 1中可以看到 运算结果并不是预期的256 AL最大可以表示255 超过255时产生溢出 将不能正确显示 AL中显示0 而标志寄存器中 显示有进位标志CY 这一简短的例子说明 加法运算不只是把两个整数简单地相加 结果是否正确还要看标志位 减法 乘法以及除法中都会存在类似的问题 这就需要程序员经常地注意标志寄存器 以确保运算结果的正确性 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 图7 1加法运算结果 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 例7 2检查输入字符的后4位是否全为0 是 输出 Y 非 输出 N 设计思路 用INT21H的1号功能调用输入字符 用TEST指令测试低4位是否为0 源程序 Ex7 2 asm 如下 CODESEGMENTASSUMECS CODEBEGIN MOVAH 1INT21HTESTAL 0FHJELMOVAH 2MOVDL N INT21HJMPEXITL MOVAH 2MOVDL Y INT21HEXIT MOVAH 4CHINT21HCODEENDSENDBEGIN 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 例7 2检查输入字符的后4位是否全为0 是 输出 Y 非 输出 N 程序说明 可以使用多个数据测试上面的程序 从图7 2所示的示意图中可以看到 JE跳转时ZF 1 即标志寄存器标志位ZF为NZ 而TEST指令的结果会改变ZF的值 图7 2TEST指令 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 下面举例说明标志寄存器如何受运算指令的影响 1 ZF标志 零标志 例如 MOVAX 1SUBAX 1 执行后结果为0 ZF 1例如 MOVAX 2SUBAX 1 执行后结果不为0 ZF 0 2 PF标志 奇偶标志 例如 MOVAL 1000BADDAL 11B 执行后 结果为00001011B 其中有3个1 奇数 则PF 0SUBAL AL 执行后 结果为0 则0个1 偶数 PF 1 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 下面举例说明标志寄存器如何受运算指令的影响 3 SF标记 符号标记 例如 MOVAL 10000001BADDAL 1 执行后 结果为10000010 最高位为1 因此SF 1 4 CF标志 进位标志 例如 MOVAL 98HADDAL AL 执行到这里 AL 30H CF 1 实际结果应为130HSUBAL AL 执行到这里 AL 0H CF 0 没有借位MOVAL 97HSUBAL 98H 做减法 要向高位借位 用CF来记录这个位 CF 1 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 下面举例说明标志寄存器如何受运算指令的影响 3 SF标记 符号标记 例如 MOVAL 10000001BADDAL 1 执行后 结果为10000010 最高位为1 因此SF 1 4 CF标志 进位标志 例如 MOVAL 98HADDAL AL 执行到这里 AL 30H CF 1 实际结果应为130HSUBAL AL 执行到这里 AL 0H CF 0 没有借位MOVAL 97HSUBAL 98H 做减法 要向高位借位 用CF来记录这个位 CF 1 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 下面举例说明标志寄存器如何受运算指令的影响 5 OF标志溢出标志 对于8位的有符号数 机器能表示的范围是 127到127 对于16位有符号数 机器能表示的范围是 32768到32767 例如 MOVAL 98ADDAL 99 执行后 OF 1 CF 0 因为结果为197 未超过255 没有进位CF 0 但超过了127 溢出了 OF 1 南开大学朱耀庭 7 1算术运算和逻辑运算对标记寄存器的影响 下面举例说明标志寄存器如何受运算指令的影响 6 AF标志 辅助进位标志 例如 MOVAL 9ADDAL 8 执行后 低4位会向高4位进位 AF 1MOVAX 127ADDAX 1 执行后 低字节会向高字节进位 AF 1由此可见 标志寄存器在算术运算和逻辑运算中受程序指令的影响 可以用来定性记录运算结果的特征 这一点非常重要 它可以供后续指令进行判断和转移 本章还会对各个指令如何影响标志寄存器的哪个标志位进行详细介绍 南开大学朱耀庭 7 2算术运算的数据格式 80X86提供的二进制算术运算指令包括二进制运算和十进制运算指令 能对二进制数 字节或字 直接进行算术运算 并且通过专门的调整指令 可以完成十进制数 BCD码 的算术运算 它提供的加 减 乘 除4种基本的算术运算指令 只能直接对整数进行操作 而不能直接对实数 浮点数 进行运算 本章将详细介绍算术运算指令的格式 功能及用法 并举例说明多字节的无符号二进制数的加 减 乘 除运算 多字节压缩型BCD码的加 减运算 多字节非压缩型BCD码的加 减 乘 除运算的程序设计方法 南开大学朱耀庭 7 2算术运算的数据格式 南开大学朱耀庭 1 无符号二进制数 无符号二进制数可以是8位或16位8位无符号二进制数的范围为0 25516位无符号二进制数的范围为0 65535用于无符号二进制数的加法指令有 ADD ADC INC用于无符号二进制数的减法指令有 SUB SBB DEC用于无符号二进制数的乘法指令为MUL用于无符号二进制数的除法指令为DIV 南开大学朱耀庭 2 带符号二进制数 带符号的二进制数 整数 也可以为8位或16位其最高位 最左边的一位 是数的符号位 该位为0表示正数 为1表示负数负数是以二进制的补码形式给出的由于其最高位用来作符号位 所以 8位的带符号二进制数的范围为 128 127 16位的带符号二进制数的范围为 32768 32767带符号的二进制数的乘法指令为IMUL 除法指令为IDIV 而带符号的二进制数的加 减法运算与无符号二进制数的加 减法指令一样 南开大学朱耀庭 3 压缩型BCD码 压缩型BCD码 也称作压缩型二进制编码的十进制数 详见1 3 5节二进制编码的十进制数BCD码 Binary CodedDecimal 对于一个字节来说 压缩型BCD码数的范围为0 99压缩型BCD码的加 减分两步来实现 先用一条无符号二进制数的加 减指令对压缩型BCD码进行加 减 在AL中产生一个中间结果 可能为不正确的结果 然后再执行一条加 减法的压缩型BCD码调整指令加法调整指令为DAA 减法调整指令为DAS 调整指令将AL中的中间结果调整为最终正确的压缩型BCD码 压缩型BCD码不能进行乘 除运算 南开大学朱耀庭 4 非压缩型BCD码 非压缩型BCD码 也称作非压缩型二进制编码的十进制数 详见1 3 5节二进制编码的十进制数BCD码 Binary CodedDecimal 非压缩型BCD码一个字节只能存放一位非压缩型BCD码 即用00H 09H表示0 9 非压缩型BCD码十进制数的加 减 乘运算都是先用无符号二进制数的加 减 乘运算指令在AL中产生一个中间结果 然后 再执行一条调整指令 以便将AL中可能错误的中间结果调整成最终正确的非压缩型BCD码 其加法的调整指令为AAA 减法的调整指令为AAS 乘法的调整指令为AAM 而非压缩型BCD码十进制数的除法运算与加 减 乘不同 除法不是先计算后校正 而是先校正后做除法 除法调整指令为AAD 非压缩型BCD码在进行加 减时 可以直接用0 9数字的ASCII码参加运算 而不必将高4位清零 这也是将非压缩型BCD码的调整指令称为ASCII码调整指令的缘故 而乘 除运算之前则必须将ASCII码高4位清零 即必须转换为真正的非压缩型BCD码后才能够进行相应运算 南开大学朱耀庭 7 3二进制数加减运算 二进制数加法 二进制数减法 7 3 1 7 3 2 7 3 3 二进制加减运算的有效性 南开大学朱耀庭 7 3 1二进制数加法 南开大学朱耀庭 1 ADD指令 字节或字相加 格式 ADD目的操作数 源操作数功能 将目的操作数加上源操作数 和送至目的操作数 影响状态标志 AF CF OF PF SF ZF 目的操作数可以是寄存器和存储器 源操作数可以是寄存器 存储器和立即数 但是两者不能同时是存储器 ADD寄存器1 寄存器2例 ADDAX BX AX BX AXADD BX 同上 这里不写出目的操作数 隐含的目的操作数为AX 南开大学朱耀庭 1 ADD指令 字节或字相加 ADD寄存器 存储器例 ADDAX BX SI AX DS BX SI AXADD寄存器 立即数例 ADDAX 12 AX 12 AXADD存储器 寄存器例 ADD BX SI AX DS BX SI AX DS BX SI ADD存储器 立即数例 ADD BX SI 12 DS BX SI 12 BX SI 南开大学朱耀庭 2 ADC指令 带进位的加法指令 格式 同ADD功能 源操作数加目的操作数再加进位标志CF的和送至目的操作数 即如果进位标志已被置位 则两个操作数相加的结果在存入目的操作数之前再加上1 否则加上0 影响状态标志 AF CF OF DF SF ZF ADD和ADC指令既适用于无符号二进制数加法运算 也适用于带符号二进制数的加法运算 但是 它们的两个操作数必须同时为无符号数或同时为带符号数 并且同时为字节 8位数 或同时为字 16位数 ADC指令多用于多字节加法运算 需要分步计算时很有用 例如 有两个两字节的数相加 AF8AH 0A90H 先进行低字节相加 然后做高字节相加 并且要加上进位 示意如下 南开大学朱耀庭 2 ADC指令 带进位的加法指令 南开大学朱耀庭 3 INC指令 字节或字加1 格式 INC目的操作数功能 目的操作数加1后送至目的操作数 INC指令的目的操作数可为字节或字 并被当作一个无符号二进制数 这一点不同于ADD ADC 该指令常用于调整地址和计数器 影响状态标志 AF OF DF SF ZF 不影响进位标志CF 目的操作数可以为通用寄存器 也可以为存储器 但不能是立即数 例如 INCCXINCBLINCBYTEPTR BX 数据段中位移量 BX 的字节加1INCWORDPTR BX SI 数据段中位移量为 BX SI 处的字加1INCWORDPTR BP SI 堆栈段中位移量为 BP SI 处的字加1 南开大学朱耀庭 3 INC指令 字节或字加1 例7 3一位数加法实例题目 从键盘上输入两个一位数 相加后以十进制输出和设计思路 输入的每一个数为ASCII码 转化为对应的二进制数 相加的和化为ASCII码输出 例7 3一位数加法实例 程序说明 运行该程序 当出现输入提示符 可输入一个数字 程序显示一个 号 再输入一个数字 程序显示 号和结果 例如 8 7 15 其中带下划线的部分 由用户输入 程序中出现的除法运算本章7 4节会有详细介绍 例7 1和例7 3都是典型的顺序程序 或称作直接程序 南开大学朱耀庭 3 INC指令 字节或字加1 图7 3二进制加法流程图 演示动画 南开大学朱耀庭 7 3 2二进制数减法 南开大学朱耀庭 1 SUB指令 字节或字相减 格式 SUB目的操作数 源操作数其中 目的操作数和源操作数的具体格式同ADD指令 功能 目的操作数减去源操作数 结果送至目的操作数 影响状态标志 AF CF OF PF SF和ZF 南开大学朱耀庭 2 SBB指令 带借位的减法 格式 SBB目的操作数 源操作数功能 目的操作数减去源操作数 其结果再减去进位标志的内容 将最后的结果送至目的操作数SBB影响状态标志 AF CF OF PF SF和ZFSUB和SBB指令既适用于无符号二进制数减法运算 也适用于带符号二进制数的减法运算 但是 它们的两个操作数必须同时为无符号数或同时为带符号数 并且同时为字节或字 在进行减法运算时 用SUB或SBB指令 若有借位就置CF为1 否则CF清零 故当执行SBB指令时 若CF已置1 亦即在这以前有借位产生 时 则其差再减1 否则 若CF为0 即没有借位产生 时 则其差就减0 南开大学朱耀庭 2 SBB指令 带借位的减法 减法实际上是用加法做的 即先把源操作数 减数 变成其补码 把CF也变成补码 0的补码为0 1的补码为11111111 8位时 或1111111111111111 16位时 然后再做加法 例如 DL 03H BL 64H CF 1 指令 SBBBL DL 的执行结果是 BL 60H 示意如下 南开大学朱耀庭 3 DEC指令 字节或字减1 格式 DEC目的操作数其中 目的操作数可为字节或字 并被视为无符号二进制数 功能 目的操作数减1送至目的操作数 影响状态标志 AF OF PF SF ZF 但不影响CF 南开大学朱耀庭 4 NEG指令 求补 格式 NEG目的操作数功能 0减去目的操作数后送至目的操作数 使目的操作数符号变反 例如 1变成 1 变成 2 影响状态标志 AF CF OF PF SF和ZF 但要注意 除了操作数为0以外 CF总是1 操作数为0时CF置0 南开大学朱耀庭 4 NEG指令 求补 例7 4一位数减法实例 题目 从键盘上输入两个一位数 相减后以十进制输出和 设计思路 输入的每一个数为ASCII码 转化为对应的二进制数 相减的差化为ASCII码输出 例7 4一位数减法实例 南开大学朱耀庭 4 NEG指令 求补 例7 4一位数减法实例 程序说明 运行该程序 当出现输入提示符 可输入一个数字字符 将其转化成真正的数字 BL 显示一个 号 再输入一个数字字符 将其转化成真正的数字 BH 显示 号后 BL BH BL 若差小于零 则将其求补并且输出一个 号 将差拼成ASCII码后输出 若差为大于等于0的 则直接将差拼成ASCII码后输出即可 例如 8 3 5 3 8 5 南开大学朱耀庭 7 3 3二进制加减运算的有效性 在7 1节中已经看到 运算结果有时会超出范围 变得无效 如何判断运算的有效性就是本节要介绍的内容 加减指令同时会影响到标志寄存器的进位标志和溢出标志 这两个标志位主要是为算术运算设计的 设计规则如下 1 当符号位 即最高位 有进位时 进位标志设置成1 否则设置成0 2 数据位向符号位有进位 但符号位不再产生进位时有溢出 或者符号位产生进位但数据位不向符号位进位时也产生溢出 南开大学朱耀庭 7 3 3二进制加减运算的有效性 下面用实例来总结CF OF和运算有效性之间的关联规律 1 CF 0 OF 0符号位无进位CF 0 数据位向符号位无进位OF 0 南开大学朱耀庭 7 3 3二进制加减运算的有效性 下面用实例来总结CF OF和运算有效性之间的关联规律 2 CF 1 OF 0符号位有进位CF 1 数据位向符号位也有进位OF 0 南开大学朱耀庭 7 3 3二进制加减运算的有效性 下面用实例来总结CF OF和运算有效性之间的关联规律 3 CF 0 OF 1符号位无进位CF 0 数据位向符号位有进位OF 1 南开大学朱耀庭 7 3 3二进制加减运算的有效性 下面用实例来总结CF OF和运算有效性之间的关联规律 4 CF 1 OF 1符号位有进位CF 1 并且数据位向符号位无进位OF 1 南开大学朱耀庭 7 3 3二进制加减运算的有效性 上述标志位与运算结果的有效性见表7 1 表7 1 南开大学朱耀庭 7 4无符号二进制数乘除运算 南开大学朱耀庭 1 MUL指令 无符号二进制数乘法 功能 隐含目的操作数 把源操作数和AL AX 的值相乘保存到AX DX AX 中乘法运算和加减法运算不一样 加减运算时和或差最多比两个操作数多1位或少1位 或几位 而乘法运算结果长度可能要增加一倍 两个8位数相乘 乘积可能为16位 如图7 4所示 南开大学朱耀庭 1 MUL指令 无符号二进制数乘法 图7 4乘法运算的长度 南开大学朱耀庭 1 MUL指令 无符号二进制数乘法 8086 8088规定 如果源操作数为8位无符号数 则AL中的无符号数与源操作数相乘 乘积送至AX 如果源操作数为16位无符号数 则AX中的无符号数与源操作数相乘 乘积的扩展部分 高16位 送至扩展寄存器DX 低16位送至AX 如图7 5所示 图7 5乘法运算 南开大学朱耀庭 1 MUL指令 无符号二进制数乘法 如果乘积的高一半 即扩展部分 为0 则将CF清零 否则 CF 置1 OF也置1 执行MUL指令后 AF PF SF和ZF的内容不定 例如 计算36 100 将积送字变量WV 可用下列指令序列实现 MOVAL 36MOVBL 100MULBL AL BL AXMOVWV AX 将积 AX WV 南开大学朱耀庭 1 MUL指令 无符号二进制数乘法 计算320 10000 将积的高位字送字变量WH 低位字送字变量WL 可用下列指令序列来实现 MOVAX 320MOVBX 10000MULBX AX BX DX AXMOVWH DX 积的高位字 DX WHMOVWL AX 积的低位字 AX WL 南开大学朱耀庭 1 MUL指令 无符号二进制数乘法 7 5一位数乘法示例题目 输入两个一位无符号0 9数字 相乘后 将积 二化十 输出设计思路 首先将输入的ASCII数字字符 转化为对应二进制数 然后相乘 乘积十位与个位分离 然后用ASCII码分别输出 例7 5一位数乘法示例 程序说明 运行该程序时 首先输入一个0 9数字字符 程序将其转化成真正的二进制数值 显示 号后再输入一个0 9数字字符 将其转化成真正的二进制数值 做乘法运算 显示 号后 再显示两位十进制数字 结果 例如 7 8 56 南开大学朱耀庭 2 DIV指令 无符号字节或字除法 格式 DIV源操作数功能 将累加器及其扩展寄存器中的双倍长度的无符号被除数除以源操作数中的无符号除数 对于8位除数的除法运算 被除数在AH和AL中 对于16位除数的除法运算 被除数在DX和AX中 运算后将单倍长度的商送回累加器AL或AX 将单倍长度的余数送到扩展寄存器AH或DX 其操作如图7 6所示 南开大学朱耀庭 2 DIV指令 无符号字节或字除法 图7 6除法运算 南开大学朱耀庭 2 DIV指令 无符号字节或字除法 如果除法指令产生的结果 商的值 超出了保存它的目的寄存器的范围 就如同被0除了一样 置OF为1 产生溢出中断 除法指令DIV规定被除数为双倍除数的长度 是为了乘除连用时比较方便 比如 计算7 6 4时 8位数7 00000111B 和8位数6 00000110B 相乘 产生16位的乘积42 即0000000000101010B 送至AH和AL 即AX 用AX中的16位数可以直接除以8位数4 00000100B 南开大学朱耀庭 2 DIV指令 无符号字节或字除法 但是 8位数除以8位数时 不能简单地将被除数放在AL里 就直接去除以8位除数 因为除法指令将会把AH中无论什么毫无价值的内容都当成是被除数的最高有效8位数 所以在进行除法运算以前 必须先将AH清零 同样 16位数除以16位数时 将被除数送入AX以后 也应注意将DX清零后才能做除法运算 南开大学朱耀庭 2 DIV指令 无符号字节或字除法 例如 计算135 100 可用以下指令序列来实现 MOVAX 135 被除数135 AXMOVBL 100 除数100 BLDIVBL AX BL 商1 AL 余数35 AH计算12532 1000 可用下列指令序列实现 MOVAX 12532 被除数12532 AXMOVDX 0 0 DXMOVBX 1000 除数1000 BXDIVBX DXAX BX 商12 AX 余数532 DX 南开大学朱耀庭 2 DIV指令 无符号字节或字除法 例7 6一位数除法实例题目 输入两个一位数 作除法 用十进制形式输出商和余数设计思路 输入的两个数先化为二进制数 然后用DIV作除法 结果以ASCII码形式输出 例7 6一位数除法实例 南开大学朱耀庭 7 5带符号二进制数乘除运算 乘 除指令与加 减指令不一样 加 减指令既适用于无符号二进制数的运算 也适用于带符号二进制数的运算 而如果用无符号数的乘法指令MUL来进行带符号二进制数乘法运算就不会得出正确结果 必须为带符号数提供专用的乘法和除法指令 南开大学朱耀庭 7 5带符号二进制数乘除运算 带符号二进制乘法运算指令 带符号二进制除法运算指令 7 5 1 7 5 2 南开大学朱耀庭 7 5 1带符号二进制乘法运算指令 乘 除指令与加 减指令不一样 加 减指令既适用于无符号二进制数的运算 也适用于带符号二进制数的运算 而如果用无符号数的乘法指令MUL来进行带符号二进制数乘法运算就不会得出正确结果 必须为带符号数提供专用的乘法和除法指令 南开大学朱耀庭 7 5 1带符号二进制乘法运算指令 IMUL指令 带符号位的字节或字相乘 也称作整数乘法指令 此指令除了其操作数为带符号位的二进制数外 其格式 功能完全类似于MUL 对于IMUL指令来说 若结果的高半部分 8位数乘时为AH 16位乘时为DX 不是结果的符号位的扩展 所谓符号位扩展 正数扩展部分全为0 负数扩展部分全为1 则CF和OF置1 否则 CF和OF置0 也就是说 若CF和OF置1 则表示AH或DX中含有结果的有效数字 因此使用IMUL指令计算带符号二进制乘法必须对结果进行有效性判断 执行IMUL指令后 AF PF SF和ZF内容不定 南开大学朱耀庭 7 5 1带符号二进制乘法运算指令 例7 7带符号一位数乘法实例题目 从键盘上输入两个带符号一位数 相乘后以十进制输出积 设计思路 输入的每一个数为ASCII码 转化为对应的二进制数 相乘的积化为ASCII码输出 例7 7带符号一位数乘法实例 程序说明 本例中并未对结果作出有效性判断是因为带符号一位数乘法不会溢出 结果介于 81到81之间 处于有效范围 127 127 若多位数乘法就需要对结果作出有效性判断 该问题作为课下练习 南开大学朱耀庭 7 5 2带符号二进制除法运算指令 南开大学朱耀庭 1 IDIV指令 带符号的字节或字除法 IDIV指令除了其操作数为带符号的二进制数不同于DIV指令外 其格式 功能都类似于DIV指令 带符号数的除法指令IDIV规定 余数和被除数的符号相同 这样规定就使得商和余数是唯一的 例如 26 3 商 余数为 5 是正确的 26 4 商 余数为 2 是错误的 由于除法指令隐含使用字或双字作为被除数 所以在进行除法运算前需要扩展被除数 对于无符号除法 直接把扩展的寄存器置零 而对于有符号除法 需要把符号位扩展 8086 8088提供了专门的符号扩展指令 南开大学朱耀庭 2 CBW指令 把字节转化成字 CBW指令功能 将AL的符号扩充到AH对于带符号数 当8位数除以8位数时 将8位被除数送入AL后 应将AL的符号位扩充到AH 8位 比如 8位的 3为 11111101 在AL中 转换成16位为 1111111111111101 在AX中 AL中的符号位为1 扩充到AH8位全1 而8位的 3为 00000011 在AL中 转换成16位 0000000000000011 在AX中 AL中的符号位为0 扩充到AH8位全0 将8位带符号数扩充成16位数需要用指令CBW 南开大学朱耀庭 3 CWD指令 把字转化成双字 CWD指令功能 将AX的符号扩充到DX 16位数除以16位数时 应先将16位的被除数AX 转换成32位放到DX和AX中 即将AX中的符号位扩充到DX中去 这需要用指令CWD 例如 带符号字节变量A除以带符号字节变量B时 需用下列指令序列实现 MOVAL A 被除数 A AL CBW 把字节AL转换成字AX IDIVB AX B 商 AL 余数 AH带符号字变量W除以带符号字变量V时 需用下列指令实现 MOVAX W 被除数 W AX CWD 将AX字转换成双字 DX AX IDIVV DX AX V 商 AX 余数 DX 南开大学朱耀庭 3 CWD指令 把字转化成双字 例7 8带符号一位数除法实例题目 从键盘上输入两个带符号一位数 相除后以十进制输出商和余数设计思路 输入的每一个数为ASCII码 转化为对应的二进制数 相除的商和余数化为ASCII码输出 例7 8带符号一位数除法实例 南开大学朱耀庭 7 6非压缩BCD码运算 非压缩型BCD码加法运算 非压缩型BCD码减法运算 7 6 1 7 6 2 7 6 4 非压缩型BCD码除法运算 7 6 3 非压缩型BCD码乘法运算 南开大学朱耀庭 7 6 1非压缩型BCD码加法运算 南开大学朱耀庭 1 非压缩型BCD码 ASCII码 的加法调整指令AAA 格式 AAA 无操作数 功能 把ASCII码调整为非压缩型十进制数 BCD码 逻辑式为 AL 6 AL AL 0FH AL若 AL 0FH 9或 AF 1则 AH 1 AHCF 1AF 1否则 AL 0FH AL其中 AL 0FH AL的功能是为了将高4位清零 因为直接用ASCII码作运算 高4位有与BCD码无关的数3 符号 表示逻辑乘运算 AAA指令除影响AF和CF标志外 其余标志位均未定义 南开大学朱耀庭 2 多字节非压缩型BCD码 ASCII码 加法运算 例如 计算 用ASCII码作这个加法 数据定义为 ADB 1 5 8 BDB 3 6 9 CDB4DUP 南开大学朱耀庭 2 多字节非压缩型BCD码 ASCII码 加法运算 若相加的结果放在C 则具体计算步骤如图7 7所示 图7 7多字节加法计算步骤 以上将第一步结果4送至C 个位数字字节 第二步的结果1送至C 十位数字字节 第三步的结果8送至C 百位数字字节 将第三步后的进位1送至C 千位数字字节 最终结果在C4 C3 C2 C1各字节的低4位上 南开大学朱耀庭 2 多字节非压缩型BCD码 ASCII码 加法运算 例7 9多字节非压缩型BCD码加法实例题目 计算4321 6597 并将结果显示输出设计思路 用非压缩型BCD码加进行 计算步骤如图7 7所示 例7 9多字节非压缩型BCD码加法实例 程序说明 第一步相加最低位时 利用循环前的MOVAH 0H和SAHF将CF置零 相加结果产生的进位由LAHF保存在AH中 第二 三 四步时 SAHF为从AH取上次进位 LAHF保存在本次进位到AH 循环后 ANDAH 01H为从AH中取最后的进位 南开大学朱耀庭 2 多字节非压缩型BCD码 ASCII码 加法运算 例7 10用改进的方法重写例7 9程序设计思路 与例7 9的区别是输出结果的ASCII数字字符在最后统一转换并输出 例7 10用改进的方法重写例7 9程序 程序说明 本例中STRING1和STRING2均定义为5个字节 且最后一个字节初值为0 将相加运算用五步实现 这样第4位的进位就不必如例7 9那样单独处理 南开大学朱耀庭 7 6 2非压缩型BCD码减法运算 非压缩型BCD码减法调整指令如下 AAS指令 减法的ASCII调整 格式 AAS 无操作数 功能 此指令适用于非压缩型BCD码的减法运算 其格式同AAA指令 逻辑式为 AL 6H AL AL 0FH AL若 AL 0FH 9或 AF 1则 AH 1H AH 1 AF 1 AF否则 AL 0FH AL与加法运算类似 多字节非压缩型BCD码的减法运算是在带借位减法指令SBB后加上一条调整指令AAS来实现的 AAS指令除影响AF和CF标志外 其余标志位均未定义 南开大学朱耀庭 7 6 3非压缩型BCD码乘法运算 南开大学朱耀庭 1 非压缩型BCD码 ASCII码 乘法调整指令AAM 格式 AAM 无操作数 功能 对两个非压缩型BCD码相乘的结果 在AX中 进行修正 以便得到正确的十进制 BCD码 积 它的用法是在普通的无符号二进制乘法 8位 MUL指令后面写上一条AAM指令 非压缩型BCD码的乘法和加减法不同 加减法可以直接用ASCII码参加运算 而不管它的高位上与数字无关的数 只要在ADC 或SBB 指令后用一条调整指令AAA 或AAS 就能得到正确结果 而乘法运算要求参加运算的两个乘数必须是真正的非压缩型BCD码 即高4位为0 低4位为一个十进制数字 也就是说 如果用ASCII码作为非压缩型BCD码作乘法运算的话 在乘法运算之前 必须将高4位清零 南开大学朱耀庭 1 非压缩型BCD码 ASCII码 乘法调整指令AAM 下面举例说明AAM指令是如何实现调整的 例如用下列指令序列实现6 9 54 MOVAL 06HMOVBL 09HMULBLAAM执行指令MULBL结果应为 00000110B 00001001B 0000000000110110B 结果在AX中 AAM指令的功能是把AX中的二进制结果 十进制应为54 分解成AH中的5 00000101B 和AL中的4 00000100B 南开大学朱耀庭 1 非压缩型BCD码 ASCII码 乘法调整指令AAM AAM指令的具体操作是把AL的内容除以10 将商送到AH 余数送到AL 8位数乘8位数 其乘积应为16位数 在AX中 为什么AAM指令只将AL中的数除以10呢 这是因为1位十进制数乘1位十进制数 其乘积的最大值9 9 81 01010001B只有7位有效数字 乘积的高8位 AH中 必为0 总之 AAM指令的功能是将AL中二进制乘积分解为两位十进制数字 BCD码 十位数的BCD码送至AH 个位数的BCD码送至AL 其具体操作为将AL的内容除以0AH 商送至AH 余数送至AL AAM指令用下面的方法设置标志位 CF OF AF不定 PF取决于AL寄存器的内容 SF取决于AL寄存器的高位 ZF取决于AL寄存器的内容 南开大学朱耀庭 2 多字节非压缩型BCD码的乘法 上面对一位非压缩型BCD码和另一位非压缩型BCD码如何进行乘法运算进行了介绍 现在将进一步介绍多位BCD码与一位BCD码如何实现其乘法 比如 539 6 通常的算法为 9乘6得54 写下4同时将5进位 3乘6得18 加进位的5得23 写下3的同时将2进位 5乘6得30 加进位的2得32 写下这个数 写成竖式为 南开大学朱耀庭 2 多字节非压缩型BCD码的乘法 假设539是以非压缩型BCD码的形式 分别存入变量a a2和a1中 数6是以非压缩型BCD码的形式 存放在变量b中 又假设a3 a2 a1和b中的数高4位均已清0 并将a3 a2 a1乘以b所得的乘积存放到c4 c3 c2 c1变量中 即 南开大学朱耀庭 2 多字节非压缩型BCD码的乘法 例7 11多字节非压缩型BCD码乘法实例题目 用非压缩型BCD码计算 94573 6设计思路 用本小节7 6 3中2的方法进行运算 例7 11多字节非压缩型BCD码乘法实例 南开大学朱耀庭 十进制数除法调整指令AAD格式 AAD功能 将AX中的两位非压缩型BCD码转换成真正的二进制数 其操作为 AH 0AH AL AL 且0 AH下面来介绍如何进行被除数为两位 除数为一位的非压缩型BCD码的除法运算 7 6 4非压缩型BCD码除法运算 南开大学朱耀庭 比如 计算43除以6 假设43是在AX中 00000100B在AH中 00000011B在AL中 而6 00000110B 是在BL中 除数6是一位数 它的非压缩型BCD码 高4位为0 正好与其二进制表示形式相同 因此 不需要调整 而AX中的43 0000010000000011 和二进制的43 0000000000101011 根本不是一回事 所以需要将被除数43转换成二进制表示形式 要完成这一点 只需将AH的内容乘以10 再与AL的内容相加 在AL中便得到二进制的43 00101011 再将AH清零 这正是AAD指令的功能 这样 AX中便是真正的二进制的43了 然后 用AX 43 除以BL 6 就会在AL中得到二进制表示的商7 在AH中得到二进制表示的余数1 7 6 4非压缩型BCD码除法运算 南开大学朱耀庭 例如 计算43 6的程序序列为 MOVAX 0403HAADMOVBL 06HDIVBL 7 6 4非压缩型BCD码除法运算 南开大学朱耀庭 7 6 4非压缩型BCD码除法运算 例7 12多字节非压缩型BCD码除法实例题目 用非压缩型BCD码计算597864 8设计思路 用非压缩型BCD码 从高位到低位依次除以除数 每次循环得到的余数 AH 作为下一次除法的高位 最后将商从高位到低位输出 并输出余数 例7 12多字节非压缩型BCD码除法实例 程序说明 本例从高位开始除 每次除得的余数在AH中 作为下一次除法的高字节 而低字节通过MOVAL SI 得到 南开大学朱耀庭 7 7压缩型BCD码加减运算 8088微处理器只提供了压缩型BCD码的加减运算调整指令而没有提供乘除运算调整指令因此 对于压缩型BCD码来说 只能进行加减运算 不能直接进行乘除运算 南开大学朱耀庭 7 7压缩型BCD码加减运算 压缩型BCD码加法运算 压缩型BCD码减法运算 7 7 1 7 7 2 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 压缩型BCD码做加法运算时 调整指令应做什么呢 请看下面的例子 1 34 23 57的操作示意如下 结果正确 这时调整指令不需要做什么 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 压缩型BCD码做加法运算时 调整指令应做什么呢 请看下面的例子 2 48 29 77的操作示意如下 结果不正确 因为用ADC指令进行加法运算时 低4位向高4位有一个进位 这个进位是按十六进制进行的 即低4位逢十六才进一 而十进制数加法应是逢十进一 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 2 48 29 77的操作示意如下 因此 比正确结果少6 进行调整时 应在低4位上加上6 即 加法运算后 低4位向高4位有进位时 即AF 1时 调整指令应做加06H 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 3 57 46 103 加法运算后 低4位 9时 调整指令需做加06H 高4位 9时 调整指令需做加60H 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 3 57 46 103 加法运算后 低4位 9时 调整指令需做加06H 高4位 9时 调整指令需做加60H 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 4 72 91 163 加法运算后 当CF 1 有进位产生 时 调整指令应做加60H 南开大学朱耀庭 1 DAA指令 压缩型BCD码的加法调整 格式 DAA 无操作数 功能 把AL中的值调整成压缩型BCD码 逻辑式为 AL 06H AL若 AL 0FH 9或 AF 1则 AF 1 AL 60H AL若 AL 9FH或 CF 1则 CF 1此指令影响状态标志 AF CF PF SF ZF 但不影响OF 7 7 1压缩型BCD码加法运算 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 例7 13多字节压缩型BCD码加法实例题目 计算 72574834 91462923设计思路 将这两个十进制数以压缩型BCD码的形式存储 并且低位放在低地址字节里 一个字节存放两位BCD码 将第一个加数存放在以变量名A为起始地址的存储区里 将第二个加数存放在变量名B为起始地址的存储区里 在数据段定义数据如下 ADB34H 48H 57H 72H 00HBDB23H 29H 46H 91H 00H计算过程从低位字节开始对应字节相加 先用一条ADC指令 再用DAA指令进行调整 由于用的是ADC指令 故必须事先将CF清零才能保证第一个字节相加的和是正确的 假设将相加的结果存放在A原来的位置 由于结果可能比原来的加数多1位 故多分配一个字节 初值为0 例7 13多字节压缩型BCD码加法实例 南开大学朱耀庭 7 7 1压缩型BCD码加法运算 例7 13多字节压缩型BCD码加法实例题目 计算 72574834 91462923程序说明 此程序将结果存放在第一个加数原来的位置 结果没有显示输出 BCD码的显示输出需要用到逻辑指令 这将在第8章专门介绍 南开大学朱耀庭 1 DAS指令 减法的十进制调整 格式 DAS 无操作数 功能 此指令适用于压缩型BCD码的减法运算 其格式同AAA指令 逻辑式为 AL 6H AL若 AL 0FH 9或 AF 1则1 AF AL 60H AL若 AL 9FH或 CF 1则1 CF与多字节压缩型BCD码加法运算类似 多字节压缩型BCD码减法运算是在带借位减SBB指令后加上一条调整指令DAS来实现的 7 7 2压缩型BCD码减法运算 南开大学朱耀庭 综上所述 十进制数的算术运算中值得注意的是 除法调整指令用于除法指令之前 而加 减 乘的调整指令是放在相应运算指令之后 也就是说 加 减 乘调整是纠正错误的结果使之成为正确的结果 而除法调整则是要避免产生错误的结果 乘 除只有非压缩型BCD码运算指令 而没有压缩型BCD码运算指令 要求被乘数和乘数 被除数和除数在参加运算之前必须将高4位清零 使之成为真正的BCD码 而加 减法并不要求将高4位清零 也就是说 非压缩型BCD码的加 减运算可以直接用ASCII码参加运算 调整指令能将错误的结果修正成正确的 多位数的被乘数可以乘一位数 而且很容易将乘法运算推广到多位数乘多位数 多位数的被除数也可以用一位数去除 但是 除法却不能推广到多位数除以多位数 7 7 2压缩型BCD码减法运算 南开大学朱耀庭 ThankYou
展开阅读全文
相关资源
相关搜索

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


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

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


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