汇编 编程实现从键盘输入三位以内的十进制负数_macOS上的汇编入门(二)——数学基础...
在正式介绍汇编语言之前,我会先用几篇文章讲一些数学基础和硬件基础。如果读者已经具备了一定的知识基础,可以直接跳过这些文章去汇编语言部分。
二进制,八进制与十六进制
在计算机底层的软件层面,我们通常采用二进制,八进制或十六进制来记录数字,其中最常用的是十六进制。所谓
0x
开头表示十六进制,用0
开头表示八进制,而没有前缀来表示十进制。因此,比如说以下的汇编代码(并不需要理解实际含义)
movq $0x1a, %rax
与
movq $26, %rax
相同。
十进制数与十六进制数的转化可以在搜索引擎上找到,这里不再赘述。而八进制,十六进制数与二进制数的转换则十分简单。一个八进制数的一位代表一个二进制数的三位,比如说八进制数的一位5
就代表二进制数的三位011
; 同理,一个十六进制数的一位就代表二进制数的四位。因此,十六进制数0x2000001
就代表二进制数0010000000000000000000000001
.
我们知道,之所以使用二进制数,是因为计算机底层采用高电平/低电平这种方法来表示数。那么,我们为什么要使用八进制、十六进制呢?我们知道,如今的计算机大多采用64位系统,意思是说,任何一个地址都是一个64位二进制数。那么,如果我们只采用二进制来表示一个地址,那么得有64个0
或者1
, 这不仅让我们看花眼了,而且也极大的浪费了电脑的显示资源。而刚才讲到的十六进制数则帮我们解决了这个问题。我们知道,十六进制数的一位对应二进制数的4位。因此,一个$n$位二进制数,只需要
补码
进制问题解决了在计算机底层软件中数的表示问题,接下来还需要解决的是记录问题,也就是说,如何把数实际存储在64位寄存器中。我们想要解决两个问题:
- 如何记录负数
- 可以使用加法器计算减法么
天才般的先行者,使用了补码来一举解决了这两个问题。
想要解决第二个问题,一个想法自然出现了,既然
然而,我们知道,在计算机中,一个存储单位存储的数据大小是有上限的。比如说在64位CPU中,每个寄存器有64位,因此可以存储64位二进制数。因此,在CPU的加法器中,实际上使用了模
因此,我们只有找到合适的将负数记录成64位二进制数的方法,才能将加法器转化为减法器。
注意到
而由于
但是,还有一个细节需要注意。比如说,我们想要记录的二进制数是0xfffffffffffffffe
, 那么根据刚刚讨论的,我们可以将其记录为0x1
. 这就出现了问题,如何区分0x1
和0xfffffffffffffffe
呢?我们采用这种方法只是为了方便减法,并不打算将正数和负数混同啊。
因此,在实际操作中,当出现负数时,能够允许的负数的绝对值最大值是
0
表示正数,1
表示负数。这种记录方法叫做补码。也就是说,对于小于
有符号整数。反之,如果直接使用其二进制表示为其记录的话,那么只能表示
无符号整数。
逻辑运算
除了加减乘除以外,二进制数还有独特的运算——逻辑运算。分别是与(and), 或(or), 非(not)和异或(xor). 与或非大家都很熟悉了,异或就是当且仅当两个操作数不同时输出1
, 相同时输出0
.
可以在哪看到这系列文章
我在我的GitHub上,知乎专栏上和CSDN上同步更新。
上一篇文章:macOS上的汇编入门(一)——引言
下一篇文章:macOS上的汇编入门(三)——硬件基础
汇编 编程实现从键盘输入三位以内的十进制负数_macOS上的汇编入门(二)——数学基础...相关推荐
- java编程基础篇-- 编写一个程序,从键盘输入三个整数,求三个整数中的最小值。
编写一个程序,从键盘输入三个整数,求三个整数中的最小值. package Exam01;import java.util.Scanner;public class Topic03 {public st ...
- 求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中个.十位数 ...
- 从键盘输入一位整数,当输入1~7时,输出“星期一”~“星期日” 输入其他数字时,提示用户重新输入,输入0,程序结束
使用了for.while.do-while三种循环和switch选择结构实现 代码加注释 package com.baidu.www.demo02;import java.util.Scanner;p ...
- c语言学习-从键盘输入三个数,按照从小到大(或从大到小)的顺序输出
从键盘输入三个数,按照从小到大(或从大到小)的顺序输出 程序流程图: 代码: #include<stdio.h> void main() {float a,b,c,d; printf(&q ...
- 编写程序:由键盘输入三个整数分别存入变量num1、num2、num3, 对它们进行排序(使用 if-else if-else),并且从小到大输出。
/* 4. 编写程序:由键盘输入三个整数分别存入变量num1.num2.num3, 对它们进行排序(使用 if-else if-else),并且从小到大输出. */ import java.util. ...
- 编写程序,由键盘输入三个整数分别存入变量num1,num2,num3中,对它们进行排序, 使用if-else结构,并按从小到大的顺序输出
/* 5.编写程序,由键盘输入三个整数分别存入变量num1,num2,num3中,对它们进行排序, 使用if-else结构,并按从小到大的顺序输出 */ public class Test05{pub ...
- 5位评委对参赛选手进行打分,将所有的打分结果存储到对应类型的数组中, 将所有的评分结果去除一个最低分,去除一个最高分,然后获取的平均分数为 选手的最终得分.设计程序,用键盘输入5位评委的评分,并打印输
5位评委对参赛选手进行打分,将所有的打分结果存储到对应类型的数组中, 将所有的评分结果去除一个最低分,去除一个最高分,然后获取的平均分数为 选手的最终得分.设计程序,用键盘输入5位评委的评分,并打印输 ...
- java三个数排序从小到大,键盘输入三个数,实现从小到大排序,键盘输入从小到大...
键盘输入三个数,实现从小到大排序,键盘输入从小到大 // 导包 import java.util.Scanner; public class Sort { public static void mai ...
- Java---从键盘输入一位整数,当输入1-7时,输出星期一~星期日
从键盘输入一位整数,当输入1-7时,输出星期一~星期日 要求输入其他数字时,提示用户重新输入,输入0时程序结束,输入1-7时继续输入. public static void main(String[] ...
最新文章
- 2016年日本信息安全市场规模分析
- 浪潮POWER 9:英特尔的挑战者
- 用python操作MySQL
- PyTorch基础-交叉熵函数mnist数据集识别-04
- nopCommerce的源代码结构和架构
- android 构造xml,android 中生成xml文件
- c++基础学习(08)--(继承、重载、多态、虚函数)
- 基于Twemproxy的Redis集群方案
- JDBC Java数据库编程
- JavaScript 上万条数据 导出Excel文件 页面卡死
- 转行学IT为什么一定要趁早?
- unity Animator 同时播放两个动画,并动态更换Animator中的AnimationClip
- 微信绑定银行卡消息服务器,微信绑定了银行卡,如果不注意这个消息,可能会出现自动扣费...
- 自写七言绝句三首,外加离职学习 ——彩虹国秘书长
- c语言说明函数的作用是,C语言中rewind函数的作用是什么?
- MakeMKV for mac(MKV视频格式转换工具)
- 根据 Excel 中的数据批量修改文件的扩展名
- 云产研见客户的行为分析
- 使用 vue 开发 APICloud 应用的教程
- 我叒玩坏eclipse以后决定把问题记录下来了