汇编 ---- 第五章 拨开数据的迷雾

第一节 补码的本质

  • 大部分计算机存储整数都是按照补码表示法来进行存储的

  • 1用补码表示法存储过程:

    • 获取绝对值:1
    • 将绝对值转换为二进制:1
    • 根据数字在计算机中所占的位数(空间大小)在前面补0
      • 假设大小为1个字节,在前面补7个0:0000 0001
    • 判断符号:
      • 符号为正,存储结束
      • 符号为负,取其补码
  • -2用补码表示法存储过程:

    • 获取绝对值:2
    • 将绝对值转换为二进制:10
    • 根据数字在计算机中所占的位数(空间大小)在前面补0
      • 假设大小为1个字节,在前面补6个0:0000 0010
    • 判断符号:
    • 符号为负,取其补码:1111 1110
  • 处理器如何执行1 + (-2) ?

    • 0000 0001 + 1111 1110 = 1111 1111
    • 验证(补码表示法的逆运算):
      • 根据最高位(符号位)判断正负:1为负
      • 进行逆运算:
        • 减1:1111 1110 ----> -2
        • 取反:0000 0001 ----> 1
  • 在使用补码表示法存储整数时,正数和负数所对应的规则不同:

    • 正数:最终存储为二进制
    • 负数:最终存储为二进制的补码
  • -2在计算机中存储的值:

    • 8位: 1111 1110

    • 16位: 1111 1111 1111 1110

    • 32位:1111 1111 1111 1111 1111 1111 1111 1110

    • -2补码的本质:0-2的运算结果

    • 1 + (-2) ----> 1 + (-2的补码) ----> 1 + (0 - 2)

第二节 有符号数和无符号数

  • 8位存储单元
    • 补码表示法的存储范围: -128 ---- 127
    • 无符号表示法的存储范围: 0 ---- 255
      • 无符号表示法正数的存储范围要远远大于补码表示法
        • 原因:在存储单元大小相同的情况下,补码表示法要分出一半的空间用来存储负数,无符号表示法正数的存储范围是补码表示法的2倍
    • DB 200 ----> 补码表示法 ----> 1100 1000 ----> 补码表示法的逆运算 ----> -56
    • DB 200 ----> 无符号表示法 ----> 1100 1000 ----> 无符号表示法的逆运算 ----> 200
  • 除法指令:
    • DIV ----> 无符号数
    • IDIV ----> 有符号数
    • 举例:
      • Mov ax, 0x0400(被除数)
      • Mov bl, 200(除数)
      • div/idiv bl
        • div : 0x0400 = 1024, 200 = 200, 结果为0x05 = 5
        • idiv : 0x0400 = 1024, 200 = -56, 结果为0x12 = -18
      • 好处:节省程序所占用的内存空间、提升程序执行效率
  • 相同功能的指令被分为两种,一种可看作无符号数,一种可看作有符号数
    • 只有极少数的指令被分解为两种进行解析,绝大部分指令都既能操作有符号数,又能操作无符号数,因此并未分为两种进行解析
      • 原因:绝大多数指令无论从哪个角度解析数据,运算结果都正确
    • Mov al, 200 ----> 存储结果:1100 1000
    • add al, 1 ----> 运算结果: 1100 1001
    • 无符号数的角度进行解析:
      • 1100 1000 ----> 200
      • 1 ----> 1
      • 1100 1001 ----> 201
      • 200 + 1 = 201
    • 有符号数角度进行解析:
      • 1100 1000 ----> -56
      • 1 ----> 1
      • 1100 1001 ----> -55
      • -56 + 1 = -55

第三节 溢出标志位和进位标志位

  • 溢出标志位:OF ----> 有符号数

  • 进位标志位:CF ----> 无符号数

  • 发生溢出 ----> OF = 1

  • 发生进位 ----> CF = 1

  • 如果运算结果(十进制)超出了存储单元的存储范围,那么:OF = 1(有符号数)、CF = 1(无符号数)

    • 存储范围会根据存储单元的存储大小而发生变化
    mov al, 0xF0
    add al, 0x78
    
    (-128~127)
    有符号数
    (0-255)
    无符号数
    0xF01111 0000-16240
    0x78+ 0111 1000120120
    1 0110 1000104104(360)
    OF = 0CF = 1(进位)
  • (-128~127)
    有符号数
    (0-255)
    无符号数
    0xF01111 0000-16240
    0x88+ 1000 1000-120136
    1 0111 1000120(-136)120(376)
    OF = 1CF = 1
    (-128~127)
    有符号数
    (0-255)
    无符号数
    980110 00109898
    99+ 0110 00119999
    1100 0101-59(197)197(197)
    OF = 1CF = 0
    (-128~127)
    有符号数
    (0-255)
    无符号数
    980110 00109898
    99- 0110 00119999
    1111 1111-1(-1)255(-1)
    OF = 0CF = 1(借位)
  • 无论是有符号数还是无符号数,运算结果超出它的存储范围,得到的运算结果一定是错误的

  • 从有符号数的角度来分析,运算结果超出存储范围,OF = 1

  • 从无符号数的角度来分析,运算结果超出存储范围,CF = 1

  • 当OF(有符号数)或CF(无符号数)的值 = 1时,此次运算会得到一个错误的结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值