Java学习笔记8-1——汇编语言入门

目录

  • 概述
  • 进制运算
  • 二进制
  • 数据宽度
  • 无符号数和有符号数
  • 原码、反码、补码
  • 位运算
  • 位运算实现加减乘除
  • 汇编学习环境和必要说明
    • 汇编语言
    • 通用寄存器
    • 内存
  • 未完待续

概述

为什么要学习汇编语言

进制运算

运算的本质是查表

二进制

为什么要学习理解二进制?
寄存器、内存、位…底层的每一个位都是有含义的。这是汇编入门理解的基础。
汇编高级则是了解程序的深层和操作系统的内核。

数据宽度

  • 计算机内存有限制,数字没有无穷大(长度),因此要给数字增加数据宽度
    bit:1位
    Byte:8位
    Word:16位
    DWord:32位
  • C、C++和Java等都需要定义数据的类型。计算机底层需要我们给这些数据定义宽度。
    位:0、1
    字节:0~0xFF
    字:0~0xFFFF
    双字:0~0xFFFFFFFF
  • 在计算机中,每一个数据需要给它定义类型。给它定义宽度,在内存中的宽度。

无符号数和有符号数

无符号数规则
你这数字是什么,那就是什么(就是一串数字)

1001 1010 十六进制:0x9A  十进制:154

有符号数规则
最高位是符号位:负数:1;正数:0

1001 1010 如何转换?

原码、反码、补码

有符号数的编码规则
原码:最高位是符号位,其余位表示数值的大小

反码:

  • 正数:反码和原码相同
  • 负数:符号位一定是1,其余位对原码取反

补码:

  • 正数:补码和原码相同
  • 负数:符号位一定是1,反码+1
以8位数据举例
如果是正数,大家都一样
1:
原码:0 0 0 0   0 0 0 1
反码:0 0 0 0   0 0 0 1
补码:0 0 0 0   0 0 0 1如果是负数
-1
原码:1 0 0 0   0 0 0 1
反码:1 1 1 1   1 1 1 0
补码:1 1 1 1   1 1 1 1-7
原码:1 0 0 0   0 1 1 1
反码:1 1 1 1   1 0 0 0
补码:1 1 1 1   1 0 0 1

如果看到一个二进制的数字,需要了解它是无符号数还是有符号数

位运算

2*8的最高效计算方式?

  • 声明变量、赋值等,位运算比任何方式运算速度都快,比直接写数字也都快。例如:int a = 1<<4;比int a = 16;快

很多底层的调试器,需要通过位来判断CPU的状态

与运算(and &)
全都为1,结果为1。

或运算(or |)
只要有一个1,结果都为1。

异或运算(xor ^)
不一样就是1。

非运算(单目运算符 not ~)
取反。(单目运算符意为只需一个数字就能完成操作)

通过位运算可以实现加减乘除。
位运算
移动位,左移为×2,右移为÷2

0000 0001    1
0000 0010    2
0000 0100    4
0000 1000    8

左移:(shl <<)
所有二进制位全部左移若干位,高位丢弃,低位补0

0000 0001
左移1位
0000 0010

右移:(shr >>)
所有二进制位全部右移若干位,低位丢弃,高位就要补0或1(符号位决定补0还是补1)

0000 0001
右移1位
0000 0000

位运算实现加减乘除

计算机只认识0和1
基本数学是建立在加减乘除上的,只要搞定加法,其他都能用加法表示。

4 + 5 =?

# 二进制加法:
0000 0100
0000 0101
--------------(计算机不会直接加的)
0000 1001# 计算机实现加法的原理:
# 第一步:异或  如果不考虑进位,异或就可以直接出结果。
0000 0100
0000 0101
--------------
0000 0001# 第二步:与运算  判断进位,如果与运算结果为0则表示没有进位
0000 0100
0000 0101
--------------
0000 0100# 第三步:将与运算的结果左移一位
0000 0100——>0000 1000# 第四步:将上一步的结果跟前面异或的结果再异或
0000 1000
0000 0001
--------------
0000 1001# 第五步:与运算 判断进位,如果与运算结果为0则表示没有进位
0000 1000
0000 0001
--------------
0000 0000
最终结果就是与运算结果的上一个异或运算的结果。否则继续重复步骤一到五。

4 - 5 =?

即4+(-5)  计算机中的负数用补码表示
# 二进制减法:
0000 0100
1111  1011
--------------(计算机不会直接减的)
1111  1111  # 第一步:异或  如果不考虑进位,异或就可以直接出结果。
0000 0100
1111  1011
--------------
1111  1111 # 第二步:与运算  判断进位,如果与运算结果为0则表示没有进位
0000 0100
1111  1011
--------------
0000 0000所以最终结果:
1111 1111

乘:x*y,就是y个x相加,还是加法

除:x/y,本质就是减法,就是x能减去多少个y,本质也是加法

计算机只会做加法
机器语言就是位运算。都是电路来实现的,这就是计算机最底层的本质。

对这些数定义一些规则(数据宽度、有符号数和无符号数、原码反码补码这些),规则之上加入位运算,就能表示很多东西。

汇编学习环境和必要说明

汇编语言

即通过指令来代替二进制编码。
例如上面的复杂的加法操作通过一个ADD指令,使计算机将ADD直接转换为二进制加法操作的机器语言

在学习汇编之前,需要先掌握环境的配置:

  1. VC6(程序到汇编的理解)
  2. OD
  3. 抓包工具
  4. 加密解密工具

学汇编不是为了写代码,是为了理解程序的本质。
建议学习32位的《汇编语言》,至于64位,本质架构区别不大,只是,寻址能力增加。
汇编入门:了解汇编和程序的对应关系,程序的本质即可。

通用寄存器

寄存器:
存储数据:CPU>内存>硬盘
32位CPU
64位CPU

通用寄存器(可以存储任意的内容)
32位的通用寄存器只有8个:
EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
存值的范围:0~FFFFFFFF

计算机向寄存器存值:
mov指令

mov 地址,值
mov 地址1,地址2

不同的寄存器

FFFFFFFF    FFFF       FF
32位        16位        8位
EAX         AX         AL
ECX         CX         CL
EDX         DX         DL
EBX         BX         BL
ESP         SP         AH
EBP         BP         CH
ESI         SI         DH
EDI         DI         BH8位  L:低八位   H:高8位

除了通用寄存器之外,其他的寄存器每一位都有其特定的功能。比如开机关机啥的。

内存

寄存器很小,不够用,所以数据要放在内存中。
每个应用程序进程都有4GB的内存空间(但是相当于空头支票),程序真正运行的时候才会用到物理内存。
1B = 8bit
1KB = 1024B

4G的内存(4096M)最终计算为位,就是这个内存可以存储的最大容量。因此4G内存中的内存地址很多,空间很大。

内存地址
存一个数:占用的大小?数据宽度?存到哪里?
计算机中内存很多,空间很大,每个空间分配一个地址、名字。这些给内存起的编号,就是我们的内存地址。

每个内存地址都有一个编号。可以通过这些编号向里面存值。
内存如何存值?

汇编如何向内存中写值
mov 数据宽度 内存地址,值例mov byte ptr ds:[0x19FF70],1
传递的值的大小一定要和数据宽度匹配

内存地址有多种写法:
ds:[0x19FF70+4] 内存地址偏移
ds:[eax] 寄存器
ds:[eax+4] 寄存器偏移

数组[]:
ds:[reg+reg*{1,2,4,8}] 数组
ds:[reg+reg*{1,2,4,8}] 数组偏移

未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字图像与数字图像处理

数字图像与数字图像处理 1、基本概念 &#xff08;1&#xff09;图&#xff1a;是物体反射或者透射电磁波的分布。 &#xff08;2&#xff09;像&#xff1a;是人的视觉系统对接收的图信息在大脑 中形成的印象。 &#xff08;3&#xff09;图像(image)&#xff1a;是“图”和…

[剑指offer][JAVA]面试题第[46]题[把数字翻译成字符串][递归][逆推]

【问题描述】[中等] 给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &#xff0c;1 翻译成 “b”&#xff0c;……&#xff0c;11 翻译成 “l”&#xff0c;……&#xff0c;25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函…

LVM分区无损增减

http://www.361way.com/change-lvm-size/1792.html转载于:https://www.cnblogs.com/augusite/p/10431263.html

前端基础1——HTML5

目录初识HTML网页基本标签列表表格视频和音频页面结构内联框架表单语法初识HTML Hyper Text Markup Language&#xff08;超文本标记语言&#xff09; <!--DOCTYPE&#xff1a;告诉浏览器使用什么规范&#xff08;默认是html&#xff09;--> <!DOCTYPE html> <…

数字图像处理系统组成 及研究内容

数字图像处理系统组成 及研究内容 .数字图像处理系统的组成 基本图象处理系统的结构 图像输入设备 扫描仪分辨率与扫描图象的大小 分辨率&#xff1a;单位长度上采样的像素个数DPI(dot/inch) 图像输出设备 喷墨打印机 激光打印机 数字印刷机 .图像处理技术研究的内容 图…

[剑指offer][JAVA]面试题第[18]题[删除链表的节点]

【问题描述】[中等] 给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。注意&#xff1a;此题对比原题有改动示例 1:输入: head [4,5,1,9], val 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点&#xff0…

Python3 循环

L [Bart, Lisa, Adam] for i in L:print("这是for循环的" "输出 hello:" i.upper())i 0 while i < len(L):print("这是while 循环的输出 hello:" L[i])i i 1转载于:https://www.cnblogs.com/RHadoop-Hive/p/10432219.html

HDU 6168 Numbers 思维

本题就是告诉你有两个数串 其中第一个数串中的每两个元素ai和aj&#xff08;i<j&#xff09;相加得到的元素 放入第二个数串里 但由于两个数串给搞的比较混乱 需要解决从中识别出第一个数串并将其输出出来 本题其实仔细一想就能发现 这个问题 我们从数串的特点上考虑 第二…

前端基础2——CSS3

目录什么是CSSCSS的导入方式选择器美化网页元素盒子模型浮动定位什么是CSS Cascading Style Sheet 层叠级联样式表 CSS&#xff1a;表现层&#xff08;美化网页&#xff09; 字体&#xff0c;颜色&#xff0c;边距&#xff0c;高宽&#xff0c;背景图片&#xff0c;网页定位&…

Socket常见错误代码与描述

如错误代码10061&#xff0c; 说明服务器已经找到&#xff0c;但连接被服务器拒绝&#xff0c; 连接失败原因可能是&#xff1a; 端口号设置错误&#xff1b; 2.服务器没有处于监听状态 &#xff08;即ServerSocket –>Activetrue&#xff09;&#xff1b; 3.数据包被服务…

关于set的自定义比较函数的使用及结构体的上下二分用法

如果set的类型是个结构体 我们需要定义重载函数 ***set 容器模版需要3个泛型参数&#xff0c;如下&#xff1a; template <class Key,class Compare less <key>,class Alloc alloc>class set {...}; 第一个是元素类型&#xff0c;必选&#xff1b; 第二个指定…

BZOJ 3456: 城市规划(dp+多项式求逆)

传送门 解题思路 这道题就是求带标号的无向连通图个数&#xff0c;首先考虑\(O(n^2)\)的做法&#xff0c;设\(f_i\)表示有\(i\)个节点的无向连通图个数&#xff0c;那么考虑容斥&#xff0c;先把所有的无向图求出&#xff0c;即为\(2^{C(n,2)}\)&#xff0c;再减去不联通的情况…

前端基础3-1——JavaScript

目录什么是JavaScript快速入门引入JavaScript数据类型和基本语法入门1.变量2.number3.字符串4.布尔值5.逻辑运算6.比较运算符7.浮点数8.数组9.对象10.流程控制11.Map和Set集合严格检查模式use strict函数定义函数变量的作用域方法什么是JavaScript 概述 JavaScript是一门世界上…

[剑指offer][JAVA]面试题第[17]题[打印从1到最大的n位整数][大整数][递归回溯]

【问题描述】[中等] 输入数字 n&#xff0c;按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3&#xff0c;则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n 1 输出: [1,2,3,4,5,6,7,8,9]说明&#xff1a;用返回一个整数列表来代替打印 n 为正整数【解答思路】…

html:(40):块级元素和内联块级元素

1.下表列出了内联元素和块级元素的主要区别 html中内联元素和块级元素的区别 块级元素 行内元素 独占一行,默认情况下&#xff0c;其宽度自动填满其父元素宽度 相邻的行内元素会排列在同一行里&#xff0c;直到一行排不下&#xff0c;才会换行&#xff0c;其宽度随元素的内…

Django中提供了6种缓存方式

开发调试内存文件数据库Memcache缓存&#xff08;python-memcached模块&#xff09;Memcache缓存&#xff08;pylibmc模块&#xff09;1. 开发调试 12345678910111213141516171819202122232425262728293031323334353637383940# 此为开始调试用&#xff0c;实际内部不做任何操作…

HDU-6180 Schedule

题意 给n个工作的开始时间和结束时间 每个工作需要用机器来完成 让我们给这n个工作规划机器 规划出尽可能少机器数目 以及计算最少的机器时间(机器时间为机器使用的最终结束时间减去开始时间)分析 这道题其实就是一个工作的开始结束形成了一个线段 让我们求多个线段不交叉不重…

数字图像处理技术的应 用领域

数字图像处理技术的应 用领域 图像处理技术的主要应用领域有&#xff1a; 生物医学、遥感技术、工业生产、军事技术、 通信技术、侦缉破案、气象预报、宇宙探索、考 古等&#xff0c;已经遍布国民经济的各个领域。 发展历史 20世纪20年代&#xff1a;报纸业 Bartlane电缆图…

前端基础3-2——JavaScript

目录内部对象DateJSONAJAX面向对象编程操作BOM对象&#xff08;重点&#xff09;操作DOM对象&#xff08;重点&#xff09;操作表单formjQuery如何巩固前端基础内部对象 标准对象 Date 基本使用 转换 JSON JSON是什么 在javascript中&#xff0c;一切皆为对象&#…

ltp makefile 解析

困惑于 /include/mk/automake.mk中出现了第一个目标 而makefile却任然将all当做最终目标 测试了一番后发觉&#xff1a; ifeq ($(MAKE_3_80_COMPAT),1)# Trick make 3.80 into thinking that the default goal is all..PHONY: defaultdefault: allelse #pick this.DEFAULT_GOA…