汇编基础

计算机基础知识

硬件

简易计算机:CPU + 内存条 + 主板

在这里插入图片描述

软件

作用 : 使计算机按照事先预定好的顺序完成特定的功能

分类:

分类标准 -> 功能
1. 系统软件
    DOS (Disk Operating System)
    Windows
    Linux
    Unix
    Mac
    Android
    IOS
     ...
2. 应用软件
    WPS
    微信
    ...


分类标准 -> 人机交互
1. 图形化界面
2. 命令行

计算机语言发展历史

机器语言

第一代语言 二进制
直接输入给计算机使用,不需要经过任何转换
最早的程序员 穿孔卡带

汇编语言

第二代语言 指令代替二进制
解决人类无法读懂机器语言的问题,把人类能够理解的语言转换成机器能够理解的语言
目前应用: 逆向工程,机器人,病毒,外挂

高级语言

第三代语言

面向过程

C 1972年诞生 特点:贴近硬件,运行极快;应用领域:操作系统,编译器,数据库,网络系统等;难点:指针和内存管理

面向对象

C++ 1982年诞生 兼容C 应用领域:图形领域、游戏等

Java 1995年初生 特点:没有指针,不需要进行内存管理,JVM实现WRITE ONCE,RUN ANYWHERE!高可用,高性能,高并发

机器语言

进制

本质:逢几进几
例如:

        1进制  逢1进1 --- 结绳记事
        2进制  逢2进1 --- 计算机
        8进制  逢8进1 --- 0~7
        10进制 逢10进1 --- 0~9
        16进制 逢16进1 --- 0~9,a~f

进制运算

本质:查数
无论什么进制,本身有一套完美的运算体系,均可以通过列表的方式(加法表和乘法表)进行计算!
减法、乘法的本质都是加法,除法的本质是除数乘以哪个数最接近被除数。

例如:8进制下的 77加法表 和 77乘法表

77加法表

1+1=2	
2+1=3	2+2=4	
3+1=4	3+2=5	3+3=6	
4+1=5	4+2=6	4+3=7	4+4=10	
5+1=6	5+2=7	5+3=10	5+4=11
5+5=12	
6+1=7	6+2=10	6+3=11	6+4=12	6+5=13	6+6=14	
7+1=10	7+2=11	7+3=12	7+4=13	7+5=14	7+6=15
7+7=16

77乘法表

1×1=1	
2×1=2	2×2=4	
3×1=3	3×2=6	3×3=11	
4×1=4	4×2=10	4×3=14	4×4=20	
5×1=5	5×2=12	5×3=17	5×4=24
5×5=31	
6×1=6	6×2=14	6×3=22	6×4=30	6×5=36	6×6=44	
7×1=7	7×2=16	7×3=25	7×4=34	7×5=43	7×6=52
7×7=61

二进制

计算机使用二进制的原因? 电路的电流状态 对应 0 和 1

物理极限:摩尔定律

未来提升计算机计算力:量子计算机的普及

二进制具有标志性的数字
10进制 2进制
2 10
4 100
8 1000

二进制的简化:十六进制 0 1 2 3 4 5 6 7 8 9 A B C D E F

数据宽度

硬件决定了数据的长度限制,即数据的宽度,超出宽度的部门会丢失。

在计算机中每一个数据都需要定义类型 — 定义在内存中的宽度

数据宽度 英文名称 取值范围
8 bits Byte 0-0xFF
16 bits Word 0-0xFFFF
32 bit DWord (Double Word) 0-0xFFFFFFFF
64 bit QWord 0-0xFFFFFFFFFFFFFFFF

有符号数和无符号数

二进制的解码规则:

1. 无符号数的解码规则
    数字是什么就是什么

2. 有符号数的解码规则  
    最高为是符号位:0 -- 正数 ; 1 -- 负数
    原码:最高位为符号位,其他位是该负数的绝对值
    反码:正数时,反码和原码相同;负数时,最高位为1, 其余位对原码取反
    补码:正数时,补码和原码相同;负数时,符号位为1, 反码 + 1
    
    8位下的实例:    -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

tips: 二进制的数字,需要注意区分有符号数还是无符号数

位运算

机器语言就是通过电路来实现位运算。计算机只会加法,通过机器语言来实现加法计算器本质就是设计电路。

与运算(and,&)

串行电路
两个都为1,结果为1

1011 0001
1101 1000
------------ 与运算
1001 0000

或运算(or, |)

并行电路
有一个为1,结果为1

1011 0001
1101 1000
------------ 或运算
1111 1001

亦或运算(xor,^)

交叉x行电路
不同为1,相同为0

1011 0001
1101 1000
-----------  异或运算
0110 1001

非运算(not,~)

单目运算符
取反

1011 1000
------------ 非运算
0100 0111  

位运算(移动位)

<<  左移  shl
所有二进制全部左移若干位,高位丢弃,低位补0
左移1位,对应十进制数×2

>>  右移 shr
所有二进制全部右移若干位,地位丢弃,高位补0(正数时)或1(负数时)
右移1位,对应十进制数/2

位运算实现加减乘除

加减乘除本质都是加法

异或运算 + 与运算 循环进行,直到与运算结果为0,判断无需进位为之

4 + 5 ?

4  0000  0100
5  0000  0101
---------------- 加法 计算机不会直接加
    0000 1001
    
# 计算机的实现原理
# step1.异或 如果不考虑进位,异或可以直接算出结果
0000  0100
0000  0101
------------- 异或运算
0000  0001

#step2. 与运算 判断进位,如果与运算结果为0,则无需进位
0000  0100
0000  0101
------------- 与运算
0000  0100

#step3.将与运算结果左移一位,进行进位
0000  1000

# step4.异或 
0000  0001
0000  1000
------------- 异或运算
0000  1001

#step5.与
0000  0001
0000  1000
------------- 与运算
0000  0000

#与运算结果为0, 最终结果为与运算上一个异或的运算结果
即 0000 1001




4 - 5 ?

-5
原码:1000  0101
反码:1111  1010
补码:1111  1011

# 计算机的实现原理
# step1.异或
0000  0100
1111  1011
------------
1111  1111

#step2. 与运算 判断进位
0000  0100
1111  1011
------------
0000  0000

#与运算结果为0, 因此最终结果为 1111  1111   16进制 FF  10进制 -1

乘 x*y 本质:y个x相加

除 x/y 本质:x最多能减去多少个y

汇编语言

用指令代替二进制
学习汇编语言的目的不是写代码,而是理解程序的本质

环境配置

  • Vc 6 指针 --> 内存地址
  • OD 反编译软件
  • 抓包工具
  • 加密解密工具

寄存器

通用寄存器,可以存储各种数据
存储功能: CPU -> 内存 -> 硬盘

寄存器主要用途
32位16位8位
EAXAXAL累加器
ECXCXCL计数
EDXDXDLI/O指针
EBXBXBLDS段的数据指针
ESPSPAH堆栈指针
EBPBPBHSS段的数据指针
ESISICH字符串操作的源指针;SS段的数据指针
EDIDIDH字符串操作的目标指针;ES段的数据指针

tips:8位对应的L代表低8位,H代表高8位

其他寄存器,每一位都有自己特定的功能

内存

寄存器很小,不够用,所以会把数据放入内存中。

32位的CPU,每个应用程序都有4GB的虚拟内存空间。

4GB虚拟内存空间 --> 物理内存 --> 内存条

程序真正运行时,才会用到物理内存

1 Byte = 8 bit
1 KB = 1024 Bytes
1 MB = 1024 KB
1 GB = 1024 MB

4GB内存换算成bit就是可以存储的最大容量

内存地址

计算机内的内存地址很多,空间很大,每个空间都分配一个地址(名字)。

给内存起的编号 如:0xFFFFFFFF就是内存地址

32位对应的内存地址为8个16进制的值

32位的寻址能力为4GB

汇编如何向内存中写值?

#将数字写入寄存器
mov 存的地址,存的数
#寄存器中的值写入另一个寄存器
mov 写入地址,需要复制对象的地址

mov 数据宽度 内存地址,值
mov byte ptr ds:[0x0019ff70],1

内存地址有多种写法

ds:[0x0019ff70 + 4] 内存地址偏移
ds:[eax] 寄存器
ds:[eax + 4] 寄存器偏移

数组[]
ds:[reg + reg*{1,2,4,8}] 
ds:[reg + reg*{1,2,4,8} + 4] 偏移
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值