补码详细分析和汇编下的使用

原码,反码,补码

考虑范围:二进制8位整数,[-128,127]

():二进制数中的所有的0变为1;所有的1变为0

这里的01串默认为二进制

I.原码

把数的绝对值写成二进制的形式(7位),其中-128只取0000000

若数为非负数,则最高位(第八位)为0

若数为负数,则最高位(第八位)为为1

Ex:

72=2^6+2^3     01001000

-15=-(2^3+2^2+2^1+2^0) 10001111

II.原码与反码

正数:反码=原码

负数:在原码的基础上除最高位的数字“1”不变;其它位取反

反码=(原码-10000000)=11111111-(原码-10000000)

则 原码=11111111-反码=(补码)

III.原码与补码

正数:补码=原码

负数:在原码的基础上除最高位的数字“1”不变;其它位取反,再加1,如果有进位则忽略(原码10000000,则补码10000000)

除了10000000:

补码=(原码-10000000)+1

=11111111-(原码-10000000)+1

=100000000-(原码-10000000)

则 原码-10000000=11111111-补码+1=(补码)+1

原码-10000000=11111111-(补码-1)=(补码-1)

原码-10000000=100000000-补码

正数=原码=补码

负数=-(原码-10000000)=补码-100000000

即补码=负数+100000000

10000000同样满足负数=补码-100000000,补码=负数+100000000

一.

数:

1.正数(00000000~01111111):补码=正数=数%100000000

2.负数(-100000000~-00000001):

补码=负数+100000000=数%100000000

所以:补码=数%100000000

二.

补码:

1.00000000~01111111:数=补码

2.10000000~11111111:数=补码-100000000

由一、二得,数与补码互相唯一决定对方

IV.补码加法

要求:

1.不溢出:即结果在-128~127范围内

2.第9位的进位忽略,即结果对100000000取余

x+y=z

补码:x‘+y‘=z‘(补码对应原码,即x‘,y‘对应x,y)(这里的等号不是传统意义上的加法)

证明z‘与z互相唯一决定对方

证明:

z‘=(x‘+y‘)%100000000=(x%100000000+y%100000000)%100000000

=(x+y)%100000000=z%100000000

得证

V.补码减法

要求:

1.不溢出:即结果在-128~127范围内

2.若第8位不够减,则第9位进行补位,即结果对100000000取余

x-y=z

补码:x‘-y‘=z‘(补码对应原码,即x‘,y‘对应x,y)(这里的等号不是传统意义上的加法)

证明z‘与z互相唯一决定对方

证明:

z‘=(x‘-y‘)%100000000=(x%100000000-y%100000000)%100000000

=(x-y)%100000000=z%100000000

得证

以下是汇编部分——

VI.补码加法的溢出判断

要求:第9位的进位忽略,即结果对100000000取余

正数对应的补码:00000000<=t<=01111111

负数对应的补码:10000000<=t<=11111111

z‘=x‘+y‘ (x‘,y‘,z‘的原码为x,y,z)

z‘对应z,两者的溢出状况相同,即两者同时溢出或不溢出。

1.x’最高位为0,y’最高位为1(x=非负,y=负)

原码:

x+y>=0+(-128)=128

x+y<=127+(-1)=126<=127

原码没有溢出,对应补码也不会溢出

2. x’最高位为0,y’最高位为0(x=非负,y=非负)

00000000<=x‘,y‘<=01111111,两者相加小于100000000,不会进位,z‘=x‘+y‘。

非负数+非负数,结果为非负数,非负数最大时对应的补码为01111111。

当x‘+y‘大于等于10000000(80H),溢出;

当x‘+y‘小于10000000(80H),不溢出。

3. x’最高位为1,y’最高位为1(x=负,y=负)

10000000<=x‘,y‘<=11111111,两者相加大于等于10000000,会进位,z‘=x‘+y‘-100000000。

负数+负数,结果为负数,负数最大时对应的补码为10000000。

当x‘+y‘-100000000小于10000000(80H),溢出;

当x‘+y‘-100000000大于等于10000000(80H),不溢出。

VII.补码减法的溢出判断

要求:第9位的借位忽略,即结果对100000000取余

正数对应的补码:00000000<=t<=01111111

负数对应的补码:10000000<=t<=11111111

z‘=x‘-y‘ (x‘,y‘,z‘的原码为x,y,z)

z‘对应z,两者的溢出状况相同,即两者同时溢出或不溢出。

1.x’最高位为0,y’最高位为0(x=非负,y=非负)

原码:

x-y>=0-127=-127>=-128

x-y<=127-0=127

原码没有溢出,对应补码也不会溢出

2.x’最高位为1,y’最高位为1(x=负,y=负)

原码:

x-y>=(-128)-(-1)=-127>=-128

x-y<=(-1)-(-128)=127

原码没有溢出,对应补码也不会溢出

3. x’最高位为0,y’最高位为1(x=非负,y=负)

00000000<=x‘<=01111111,10000000<=y‘<=11111111,两者相减小于0,会借位,z‘=x‘-y‘+100000000。

非负数-负数,结果为非负数,非负数最大时对应的补码为01111111。

当x‘-y‘+100000000大于等于10000000(80H),溢出;

当x‘-y‘+100000000小于10000000(80H),不溢出。

4. x’最高位为1,y’最高位为0(x=负,y=非负)

10000000<=y‘<=11111111,00000000<=y‘<=01111111,两者相减大于0,不会借位,z‘=x‘-y‘。

负数-非负数,结果为负数,负数最大时对应的补码为10000000。

当x‘-y‘小于10000000(80H),溢出;

当x‘-y‘大于等于10000000(80H),不溢出

总结:补码的结果必然为负数和非负数的其中一类。当运算溢出,数超出了负数/非负数的范围[即若结果为负数,补码小于80H;若结果为非负数,补码大于等于80H],到达非负数/负数,即逻辑上真正的结果与实际结果相反。

sf:实际上是进行补码运算,即z‘=(x+/-y)%100000000,当z‘的最高位为1,即负,sf=1;当z‘的最高位为0,即非负,sf=0。(这样记忆就好了!)

cf:在无符号数运算中有进位或借位,cf=1;否则cf=0

of:进行有符号数运算,若溢出(超出[-128,127]),of=1;否则of=0

cmp x,y

对于x-y的结果:

I.当sf=1,of=0:没溢出,即结果为负数(sf),x<y。

II.当sf=1,of=1:溢出,即结果为非负数(非sf)。即为非负数-负数,所以不存在相等的情况。x>y。

III.当sf=0,of=0:没溢出,即结果为非负数(sf)。等号可以成立,当x=y时成立。x>=y。

IV.当sf=0,of=1:溢出,即结果为负数(非sf),x<y。

时间: 2024-08-28 20:49:31

补码详细分析和汇编下的使用的相关文章

详细分析contrex-A9的汇编代码__switch_to(进程切换)

//函数原型:版本linux-3.0.8 struct task_struct *__switch_to(structtask_struct *, struct thread_info *, struct thread_info *); #define switch_to(prev,next,last)                                       \ do {                                                     

MVC之前的那点事儿系列(5):HttpPipeline详细分析(下)(转载)

MVC之前的那点事儿系列(5):HttpPipeline详细分析(下) 文章内容 接上面的章节,我们这篇要讲解的是Pipeline是执行的各种事件,我们知道,在自定义的HttpModule的Init方法里,我们可以添加自己的事件,比如如下代码: public class Test : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_

熊猫烧香_汇编级_超详细分析

1.样本概况 1.1 应用程序信息 文件: C:\Windows\System32\drivers\spo0lsv.exe 大小: 30001 bytes 修改时间: 2007年1月17日, 12:18:40 MD5: 512301C535C88255C9A252FDF70B7A03 SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870 CRC32: E334747C 简单功能介绍: \1. 自启动 \2. 删除gho文件 \3. 全盘感染指定类型文件 \

uboot的relocation原理详细分析

最近在一直在做uboot的移植工作,uboot中有很多值得学习的东西,之前总结过uboot的启动流程,但uboot一个非常核心的功能没有仔细研究,就是uboot的relocation功能. 这几天研究下uboot的relocation功能,记录在此,跟大家共享. 所谓的relocation,就是重定位,uboot运行后会将自身代码拷贝到sdram的另一个位置继续运行,这个在uboot启动流程分析中说过. 但基于以前的理解,一个完整可运行的bin文件,link时指定的链接地址,load时的加载地址

Android版xx助手之天天酷跑外挂详细分析

Android版xx助手之天天酷跑外挂详细分析 图/文      莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也开始火了起来,这更是改变了人们长久以来的游戏娱乐习惯.茶余饭后,小伙伴们掏出"家伙"打个飞机已是习以为常的事情了.加之移动客户端游戏开发周期短,投入少等特点,很多初创公司也纷纷投入到这个领域中来,并且很多游戏都取得了不错的成绩.就在前不久,全球游戏巨头暴雪的新游戏<炉石传说>也推

uboot第一阶段详细分析

原文:uboot第一阶段详细分析 作者:程老师,华清远见嵌入式学院讲师. uboot的第一阶段设计的非常巧妙,几乎都是用汇编语言实现的,下面我们一起来看看它的精妙之处吧! 首先我们来看一下它的链接脚本,通过它我们可以知道它整个程序的各个段是怎么存放的. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")        OUTPUT_ARCH(arm)    

GandCrab5.0.9样本详细分析

?前言:?WannaCry利用永恒之蓝漏洞爆发以后,病毒安全的前沿对抗最频繁种类则是勒索病毒了,17年初或者更早就有人捕获了GandCrab家族的勒索病毒,直到18年已经更新迭代到了5.0版本,18年进入尾声的时候,安全研究人员发现了GandCrab勒索病毒的V5.1最新版变种.?对于勒索个人看法:当第一次听说勒索病毒的时候,就感觉一定是无法抗拒的利益驱动,才会让某一群人去迭代.维护.研发勒索病毒.这道理就像开了一家公司一样,能把病毒走向全世界,已经是很成功了,看似简单,其实背后的关联复杂.除了

10.hibernate缓存机制详细分析(转自xiaoluo501395377)

hibernate缓存机制详细分析 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信看完的朋友绝对能对hibernate的 N+1问题以及缓存有更深的了解. 一.N+1问题 首先我们来探讨一下N+1的问题,我们先通过一个例子来看一下,什么是N+1问题: list()获得对象: 1 /** 2 * 此时会发出一条sql,将30个学生全部查询出来

关于Delphi中的字符串的详细分析

关于Delphi中的字符串的详细分析 只是浅浅的解析下,让大家可以快速的理解字符串. 其中的所有代码均在Delphi7下测试通过. Delphi 4,5,6,7中有字符串类型包括了: 短字符串(Short String) 长字符串(Long String) 宽字符串(Wide String) 零结尾字符串(Null-Terminated String).PChar和字符数组 1.短字符串(Short String) 固 定长度,最大字符数个数为255,短字符串也成为长度字节(Length-byt