notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • 进位记数制与不同基数的数之间的转换
  • 二进制数
  • 二进制数和十进制数之间的转换
  • 十六进制数及其与二进制、十进制数之间的转换
  • 二进制数和十六进制数运算
  • 二进制数运算
  • 十六进制数运算
  • 计算机中数和字符的表示
  • 数的补码表示
  • 补码的加法和减法
  • 无符号整数
  • 字符表示法
  • 几种基本的逻辑运算
  • “与”运算
  • “或”运算
  • “非”运算
  • “异或”运算
  1. blogs
  2. history

汇编语言程序设计基础知识

Previous汇编语言程序格式Next流水线技术

Last updated 3 years ago

进位记数制与不同基数的数之间的转换

二进制数

计算机为了便于存储及计算的物理实现,采用了二进制数。

二进制的基数为2,只有0,1两个数码,并遵循逢2进1的规则,它的各位权是以2的k次方表示的,因此二进制数$a_{n}a_{n-1}\cdots a_{0};\cdot;b_1b_2\cdots b_m$的值是:

a_n⋅2n+a_n−1⋅2n−1+⋯+a_0⋅20+b_1⋅2−1+b_2⋅2−2+⋯+b_m⋅2−ma\_n\cdot2^n+a\_{n-1}\cdot2^{n-1}+\cdots+a\_0\cdot2^0+b\_1\cdot2^{-1}+b\_2\cdot2^{-2}+\cdots+b\_m\cdot2^{-m}a_n⋅2n+a_n−1⋅2n−1+⋯+a_0⋅20+b_1⋅2−1+b_2⋅2−2+⋯+b_m⋅2−m 为便于人们阅读及书写,经常使用八进制数或十六进制数(以$2^n$作为基数)来表示二进制数。它们的基数和数码如下:

进位记数制
基数
数码

十六进制

16

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

十进制

10

0,1,2,3,4,5,6,7,8,9

八进制

8

0,1,2,3,4,5,6,7

二进制

2

0,1

在计算机里,通常用数字后面跟一个英文字母来表示该数的数制。十进制数一般用D(decimal)、二进制数用B(binary)、八进制数用O(octal)、十六进制数用H(hexadecimal)来表示。例如:117D,111010B。也可以用这些字母的小写形式。

二进制数和十进制数之间的转换

二进制数转换为十进制数

各位二进制数码乘以与其对应的权之和即为该二进制数相对应的十进制数。

十进制数转换为二进制数

  1. 降幂法 首先写出要转换的十进制数,其次写出所有小于该数的各位二进制权值,然后用要转换的十进制数减去与它最相近的二进制权值,如够减则减去并在相应位记以1;如不够减则在相应位记以0并跳过此位;如此不断反复,直到该数为0为止。

  2. 除法 把要转换的十进制数的整数部分不断除以2,并记下余数,直到商为0为止。 对于被转换的十进制数的小数部分则应不断乘以2,并记下其整数部分,直到结果的小数部分为0为止。

十六进制数及其与二进制、十进制数之间的转换

十六进制数的表示

计算机中存储信息的基本单位为一个二进制位(bit),它可以用来表示0和1两个数码。此外,由于计算机中常用的字符是采用由8位二进制数组成的一个字节(byte)来表示的,因此字节也成为计算机中存储信息的单位。计算机的字长一般都选为字节的整数倍,如16位、32位、64位等。一个字节由8位组成,它可以用两个半字节来表示,所以用十六进制数来表示二进制数是比较方便的。十六进制数的基数和二进制数的关系:

二进制数
十六进制数

0000

0

0001

1

0010

2

0011

3

0100

4

0101

5

0110

6

0111

7

1000

8

1001

9

1010

A

1011

B

1100

C

1101

D

1110

E

1111

F

### 十六进制数和二进制数之间的转换

  • 由于十六进制数的基数是2的幂,所以这两种数制之间的转换是十分容易的。一个二进制数,只要把它从低位到高位每4位组成一组,直接用十六进制数来表示就可以了。 例如: 0011 0101 1011 1111 3 5 B F

  • 反之,把十六进制数中的每一位用4位二进制数表示,就形成相应的二进制数了

十六进制数和十进制数之间的转换

  • 各位十六进制数与其对应权值的乘积之和即为与此十六进制数相对应的十进制数。

  • 十进制数转换为十六进制数

    • 降幂法 首先写出要转换的十进制数,其次写出小于该数的各位十六进制权值,然后找出该数中包含多少个最接近他的权值的倍数,这一倍数即对应位的值,用原数减去此倍数与相应位权值的乘积得到一个差值,再用此差值去找低一位的权值的倍数,如此反复直到差值为0为止。

    • 除法 把要转换的十进制数的整数部分不断除以16,并记下余数,直到商为0为止。 对于被转换的十进制数的小数部分则应不断乘以16,并记下其整数部分,直到结果的小数部分为0为止。

二进制数和十六进制数运算

二进制数运算

  • 加法规则 0+0=0 0+1=1 1+0=1 1+1=0(进位1)

  • 乘法规则 0×0=0 0×1=0 1×0=0 1×1=1

十六进制数运算

  • 十六进制加法 当两个一位数之和S小于16时,与十进制数同样处理;如果两个一位数之和大于或等于16时,则应该用S-16及进位1来取代S。

  • 十六进制减法 与十进制数类似,够减时可直接相减,不够减时服从向高位借1位16的规则。

  • 十六进制乘法 可以用十进制数的乘法规则来计算,但结果必须用十六进制数来表示。

  • 十六进制除法 可以根据其乘法和减法规则处理。

十六进制数的运算可以采用先把该十六进制数转换为十进制数,经过计算后再把结果转换为十六进制数的方法。

计算机中数和字符的表示

数的补码表示

计算机中的数是用二进制来表示的,数的符号也是用二进制表示的。 在机器中,把一个数连同其符号在内数值化表示的数称为机器数。一般用最高有效位来表示数的符号,正数用0表示,负数用1表示。机器数可以用不同的码制来表示,常用的有原码、补码和反码表示法。多数机器的整数采用补码表示。

  • 补码表示法中正数采用符号-绝对值表示,即数的最高有效位为0表示符号为正,数的其余部分则表示数的绝对值。 例如,假设机器字长为8,则$[+1]_补=00000001$,$[+127]_补=01111111$。

  • 表示负数要麻烦一些。负数X用$2^n-|X|$来表示,其中n为机器的字长。另一种简单的方法:先求出该负数相对应的正数的补码表示,然后按位求反,末位加1。 例如,机器字长为8,$[-127]_补=2^8-127=10000001$。

  • 补码表示法的符号扩展(如从8位扩展到16位),正数的符号扩展应该在前面补0,而负数的符号扩展应该在前面补1。

  • n位补码表示的数的表数范围:$-2^{n-1}\leq N \leq 2^{n-1}-1$。

补码的加法和减法

无符号整数

在某些情况下,要处理的数全是正数,此时再保留符号位就没有任何意义了。我们可以把最高有效位也作为数值处理,这样的数称为无符号整数。在计算机中最常用的无符号整数是表示地址的数。

字符表示法

字符包括:

  • 字母:A、B、...、Z,a、b、...、z;

  • 数字:0、1、...、9;

  • 专用字符:+、-、*、/、↑、SP(space空格)...;

  • 非打印字符:BEL(bell响铃)、LF(line feed换行)、CR(carriage return回车)、...

这些字符在机器里必须用二进制数来表示。80×86机采用目前最常用的美国信息交换标准码ASCII来表示。

几种基本的逻辑运算

“与”运算

“与”运算又称逻辑乘,可用符号$\cdot$或$\bigwedge$来表示。如A、B两个逻辑变量的“与”运算结果:

A
B
$A\bigwedge B$

0

0

0

0

1

0

1

0

0

1

1

1

“或”运算

“或”运算又称逻辑加,可用符号+或$\bigvee$来表示。“或”运算规则如下:

A
B
$A\bigvee B$

0

0

0

0

1

1

1

0

1

1

1

1

“非”运算

“非”运算规则如下:

A
$\overline A$

0

1

1

0

“异或”运算

“异或”运算可以用符号$\forall$来表示。运算规则如下:

A
B
$A\forall B$

0

0

0

0

1

1

1

0

1

1

1

0

所有逻辑运算都是按位操作的。

《IBM-PC汇编语言程序设计(第2版)》沈美明 温冬婵 著

对一个二进制数按位求反后在末位加1的运算称为求补运算,可以证明补码表示的数具有以下特性: [X]_补⇒求补[−X]_补⇒求补[X]_补[X]\_补\overset{求补}{\Rightarrow}[-X]\_补\overset{求补}{\Rightarrow}[X]\_补[X]_补⇒求补[−X]_补⇒求补[X]_补

补码的加法规则 [X+Y]_补=[X]_补+[Y]_补[X+Y]\_补=[X]\_补+[Y]\_补[X+Y]_补=[X]_补+[Y]_补

补码的减法规则 [X−Y]_补=[X]_补+[−Y]_补[X-Y]\_补=[X]\_补+[-Y]\_补[X−Y]_补=[X]_补+[−Y]_补