汇编补充(七)数据宽度与逻辑运算

前言

汇编实际上到 JCC 一共六篇就写完了。

但是我在进行下一阶段学习的时候发现之前学习还有个漏洞没有补。那就是计算机有符号位和无符号位的根本,还有计算机逻辑运算。这些当时只是草草的写了一篇,没有再回头看过,直到入手学逆向才发现不对劲。

这篇主要解决有符号位和逻辑运算。

符号位

老传统,小阳子提问环节

1.为什么可以通过有符号位二进制数的第一位判断正负?

2.那第一位如果被用作符号位,那是不是说明效率就低了(表示数少了)?

sjY5NQ.gif

正负判断原理

要理解这个原理必须借助几幅图来讲解,

有符号位范围

同样是一个字节,无符号数的最大值是255,而有符号数的最大值是127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于1字节数来说是2的7次方=128),所以仅仅少于一位,最大值一下子减半。

不过,有符号数的长处是它可以表示负数。因此,虽然它在最大值缩水了,却在负值的方向出现了伸展。字节的数值对比:

无符号数: 0 ----------------- 255

有符号数: -128 ----- 0 ----- 127

二进制值(1字节)十进制值
1000 0000红色的1代表负数蓝色的是补码(补码=反码+1)-128
1000 0001蓝色部分代表多大的值?:将补码还原为原码-127想化成负数?:先减去1按位取反
1000 0010还原方法:补码-1再取反-126
1000 0011-125
1111 1110-2
1111 1111-1

然后我们有些奇怪地发现,1000 0000 并没有拿来表示 -0;而1000 0001也不是拿来直观地表示-1。事实上,-1 用1111 1111来表示。

怎么理解这个问题呢?先得问一句是-1大还是-128大

当 然是 -1 大。-1是最大的负整数。以此对应,计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,在一字节中,最小的负值是1000 0000,也就是-128。

计算机如何区分有符号数和无符号数?

补充一下,x86上的加减法指令不需要区分有无符号,所以用的是同样的add/sub指令,而乘除法需要区分有无符号,所以有两种指令:mul/div(用于无符号)和imul/idiv(用于有符号),而数据本身是不包含它是有符号还是无符号的信息的。更进一步地说,数据本身其实是不包含类型信息的,区分类型全靠操作数据的指令。(当然,这是在CPU的层面上说的。)

逻辑运算

计算机实现加减法

一.加法

1)异或 不考虑进位的情况,异或的结果与按位加的结果是一样的。
2)与 判断是否有进位
3)有进位 结果左移一位 继续 1) 2)
4)无进位 输出结果

例子 4 + 5 = ?

1)异或:

    0000 0100
   ^0000 0101
    ----------
    0000 0001

2)判断是否有进位:

   0000 0100
 & 0000 0101
 -----------
   0000 0100

3)继续 异或:

  0000 0001
 ^0000 1000
 -----------
  0000 1001

4)判断是否有进位:

  0000 0001
 &0000 1000
 ----------
  0000 0000

5)结果:

 0000 1001

二.减法

将其转换为加法实现

乘除法实际上就是加减法的重复运算,和上述一样。

这些东西很少用到,如果对其特别感兴趣可以去学一学,没有害处。

逻辑运算用途

1、获取某个值的第N位的值:

对那一位进行与运算,就可以判断出值是0还是1了。

2、异或加密:

解密:与同一个数异或两次得到的是它本身。

指令补充

1 、pushad / popad

pushad和popad只能用于386及其后继机型。执行pushad,依次将EAX、ECX、EDX、EBX、ESI、EDI,执行后ESP- 32,用于保护中断现场;popad执行结果相反,用于恢复中断现场。

如果在程序中要用到某些寄存器,但它们的内容在将来还有用,就可以使用这组入栈和出栈指令。比如子程序的调用和中断处理程序调用会经常用到。在形式上与push和pop是类似的,但pushad和popad由于能一次性完成多个寄存器入栈出栈,故比单纯的push和pop更为方便,而且执行效率较高。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值