在正式介绍汇编语言之前,我会先用几篇文章讲一些数学基础和硬件基础。如果读者已经具备了一定的知识基础,可以直接跳过这些文章去汇编语言部分。

二进制,八进制与十六进制

在计算机底层的软件层面,我们通常采用二进制,八进制或十六进制来记录数字,其中最常用的是十六进制。所谓

进制,就是从0开始数,逢
进1. 比如说二进制,就是从0开始数,到1,然后到2的时候进1变成10. 八进制也是类似,但是到了十六进制就犯了难,我们的数字只有0到9这十个,并不能表示出16个呀,于是,我们默认使用了a到f这六个字母来分别表示10到15这六个数。也就是说,十进制数10对应的十六进制数是a, 十进制数26对应的十六进制数是1a. 在计算机底层,通常用

0x开头表示十六进制,用0开头表示八进制,而没有前缀来表示十进制。因此,比如说以下的汇编代码(并不需要理解实际含义)

movq $0x1a, %rax

movq $26, %rax

相同。

十进制数与十六进制数的转化可以在搜索引擎上找到,这里不再赘述。而八进制,十六进制数与二进制数的转换则十分简单。一个八进制数的一位代表一个二进制数的三位,比如说八进制数的一位5就代表二进制数的三位011; 同理,一个十六进制数的一位就代表二进制数的四位。因此,十六进制数0x2000001就代表二进制数0010000000000000000000000001.

我们知道,之所以使用二进制数,是因为计算机底层采用高电平/低电平这种方法来表示数。那么,我们为什么要使用八进制、十六进制呢?我们知道,如今的计算机大多采用64位系统,意思是说,任何一个地址都是一个64位二进制数。那么,如果我们只采用二进制来表示一个地址,那么得有64个0或者1, 这不仅让我们看花眼了,而且也极大的浪费了电脑的显示资源。而刚才讲到的十六进制数则帮我们解决了这个问题。我们知道,十六进制数的一位对应二进制数的4位。因此,一个$n$位二进制数,只需要

位十六进制数即可。也就是说,我们要表示64位的地址,只需要16位十六进制数即可。

补码

进制问题解决了在计算机底层软件中数的表示问题,接下来还需要解决的是记录问题,也就是说,如何把数实际存储在64位寄存器中。我们想要解决两个问题:

  • 如何记录负数
  • 可以使用加法器计算减法么

天才般的先行者,使用了补码来一举解决了这两个问题。

想要解决第二个问题,一个想法自然出现了,既然

, 那可以在加法器中输入一个正数和一个负数来实现减法呀。

然而,我们知道,在计算机中,一个存储单位存储的数据大小是有上限的。比如说在64位CPU中,每个寄存器有64位,因此可以存储64位二进制数。因此,在CPU的加法器中,实际上使用了模

加法。也就是说,加法器做的,就是对于输入的两个64位二进制数
, 输出64位二进制数
.

因此,我们只有找到合适的将负数记录成64位二进制数的方法,才能将加法器转化为减法器。

注意到

而由于

是64位二进制数,因此,
必然是一个正数,而正数的记录方法我们是知道的。因此,我们可以使用
来记录
, 其参与的减法就可以变成相应的加法。

但是,还有一个细节需要注意。比如说,我们想要记录的二进制数是0xfffffffffffffffe, 那么根据刚刚讨论的,我们可以将其记录为0x1. 这就出现了问题,如何区分0x10xfffffffffffffffe呢?我们采用这种方法只是为了方便减法,并不打算将正数和负数混同啊。

因此,在实际操作中,当出现负数时,能够允许的负数的绝对值最大值是

. 换句话说,其记录值最高位

0表示正数,1表示负数。这种记录方法叫做补码。也就是说,对于小于

的正数,采用其二进制表示为其实际记录;对于不低于
的负数,将其加上
后的正数的二进制表示为其实际记录。如果采用补码,那么可以表示
的整数。因此,采用补码记录的数称为

有符号整数。反之,如果直接使用其二进制表示为其记录的话,那么只能表示

的整数。因此,这种数的记录形式称为

无符号整数

逻辑运算

除了加减乘除以外,二进制数还有独特的运算——逻辑运算。分别是与(and), 或(or), 非(not)和异或(xor). 与或非大家都很熟悉了,异或就是当且仅当两个操作数不同时输出1, 相同时输出0.

可以在哪看到这系列文章

我在我的GitHub上,知乎专栏上和CSDN上同步更新。

上一篇文章:macOS上的汇编入门(一)——引言

下一篇文章:macOS上的汇编入门(三)——硬件基础

汇编 编程实现从键盘输入三位以内的十进制负数_macOS上的汇编入门(二)——数学基础...相关推荐

  1. java编程基础篇-- 编写一个程序,从键盘输入三个整数,求三个整数中的最小值。

    编写一个程序,从键盘输入三个整数,求三个整数中的最小值. package Exam01;import java.util.Scanner;public class Topic03 {public st ...

  2. 求A,B 输入三位数字N,求两位数AB(其中个位数字为B,十位数字为A,且有0 #60 A #60 B #60 9)。

    [问题描述] 输入三位数字N,求两位数AB(其中个位数字为B,十位数字为A,且有0 < A < B < 9).使得下列等式成立: AB x BA = N 其中BA是把AB中个.十位数 ...

  3. 从键盘输入一位整数,当输入1~7时,输出“星期一”~“星期日” 输入其他数字时,提示用户重新输入,输入0,程序结束

    使用了for.while.do-while三种循环和switch选择结构实现 代码加注释 package com.baidu.www.demo02;import java.util.Scanner;p ...

  4. c语言学习-从键盘输入三个数,按照从小到大(或从大到小)的顺序输出

    从键盘输入三个数,按照从小到大(或从大到小)的顺序输出 程序流程图: 代码: #include<stdio.h> void main() {float a,b,c,d; printf(&q ...

  5. 编写程序:由键盘输入三个整数分别存入变量num1、num2、num3, 对它们进行排序(使用 if-else if-else),并且从小到大输出。

    /* 4. 编写程序:由键盘输入三个整数分别存入变量num1.num2.num3, 对它们进行排序(使用 if-else if-else),并且从小到大输出. */ import java.util. ...

  6. 编写程序,由键盘输入三个整数分别存入变量num1,num2,num3中,对它们进行排序, 使用if-else结构,并按从小到大的顺序输出

    /* 5.编写程序,由键盘输入三个整数分别存入变量num1,num2,num3中,对它们进行排序, 使用if-else结构,并按从小到大的顺序输出 */ public class Test05{pub ...

  7. 5位评委对参赛选手进行打分,将所有的打分结果存储到对应类型的数组中, 将所有的评分结果去除一个最低分,去除一个最高分,然后获取的平均分数为 选手的最终得分.设计程序,用键盘输入5位评委的评分,并打印输

    5位评委对参赛选手进行打分,将所有的打分结果存储到对应类型的数组中, 将所有的评分结果去除一个最低分,去除一个最高分,然后获取的平均分数为 选手的最终得分.设计程序,用键盘输入5位评委的评分,并打印输 ...

  8. java三个数排序从小到大,键盘输入三个数,实现从小到大排序,键盘输入从小到大...

    键盘输入三个数,实现从小到大排序,键盘输入从小到大 // 导包 import java.util.Scanner; public class Sort { public static void mai ...

  9. Java---从键盘输入一位整数,当输入1-7时,输出星期一~星期日

    从键盘输入一位整数,当输入1-7时,输出星期一~星期日 要求输入其他数字时,提示用户重新输入,输入0时程序结束,输入1-7时继续输入. public static void main(String[] ...

最新文章

  1. 2016年日本信息安全市场规模分析
  2. 浪潮POWER 9:英特尔的挑战者
  3. 用python操作MySQL
  4. PyTorch基础-交叉熵函数mnist数据集识别-04
  5. nopCommerce的源代码结构和架构
  6. android 构造xml,android 中生成xml文件
  7. c++基础学习(08)--(继承、重载、多态、虚函数)
  8. 基于Twemproxy的Redis集群方案
  9. JDBC Java数据库编程
  10. JavaScript 上万条数据 导出Excel文件 页面卡死
  11. 转行学IT为什么一定要趁早?
  12. unity Animator 同时播放两个动画,并动态更换Animator中的AnimationClip
  13. 微信绑定银行卡消息服务器,微信绑定了银行卡,如果不注意这个消息,可能会出现自动扣费...
  14. 自写七言绝句三首,外加离职学习 ——彩虹国秘书长
  15. c语言说明函数的作用是,C语言中rewind函数的作用是什么?
  16. MakeMKV for mac(MKV视频格式转换工具)
  17. 根据 Excel 中的数据批量修改文件的扩展名
  18. 云产研见客户的行为分析
  19. 使用 vue 开发 APICloud 应用的教程
  20. 我叒玩坏eclipse以后决定把问题记录下来了

热门文章

  1. 文巾解题 197. 上升的温度
  2. MATLAB对函数做评估
  3. MATLAB基本操作(九):可视化矩阵的矢量场quiver函数
  4. python 模块学习 hashlib
  5. Python输出py文件模拟代码高亮
  6. matlab gui创建,Matlab创建GUI
  7. android 图片圆角 遮罩_Android 自定义View练手Demo(一)实现圆角遮罩效果
  8. Python编程基础:第二十五节 args参数*args
  9. Windows平台kafka环境的搭建
  10. window xp Apache与Tomcat集群配置--转载