滴水一
1,进制问题,我们正常使用的一直为十进制即封十进一,但也有其他的
例如时间计时中的秒到分即六十进一所以说进制是不仅仅只有十进制的还
有其他的。
2,在计算机中常见的不仅有十进制还有十六进制与二进制,而十六进制与二
进制在计算机中其主要作用,由于计算机在内部是由二进制进行运算储存的
但二进制又有一定的局限性进而使用十六进制。
3,二进制即是由 0 1 两个字符构成
二进制(0到15)
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
十六进制即 0 1 2 3 4 5 6 7 8 9 a b c d e f十六个字符构成
十六进制(0到15)
0 1 2 3 4 5 6 7 8 9 a b c d e f
4,由此不难发现二进制较长不易抒写于是用十六进制代替二进制就较易书写
存储。
二进制相比较十六进制
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0 1 2 3 4 5 6 7 8 9 a b c d e f
所以说计算机在内部储存是常用十六进制来代替二进制。
听课笔记若有错误希望海涵并指出错误,感谢。
滴水 二
1,日常中数字的个数是没有个数的,但在计算机中不是的,在计算机中储存个数是一定
一旦超出便会舍弃。
2,在四位宽度的计算机中,也就是计算机只能储存二进制的四位(0000 1111)
若是有符号位则分为(0000到0111)和(1110到1111)即若是无符号为 0000 1111(0~15)
3,在八位宽度的计算机中,也就是计算机只能储存二进制的八位(0 到FF)
若是有符号位则分为(0到7f)和(80到ff)即若是无符号为 0 ff(0~255)
4,在我们实际生活中常用到的为X32位和X64位比较多
同理32位无符号为是(0到ffffffff)有符号为分为(0到7fffffff)和(8000到ffffffff)
5,计算机运算问题,首先需要明白计算机是不会加减乘除的他只会位运算即 或 非 与 异或
6,明白以上位运算以后便可以知晓计算机是如何做加减乘除的啦
举个栗子 9+10=19
7,会了加法减法不就是手到擒来吗?至于乘除无非就是多加几次的问题,反正计算机不是你,
又没有小情需。
8,在我们正常情况下,我们会遇到一些求第几位是什莫的问题(在二进制中)这个若我们在
用小本本写就太拉跨了,既然我们学了位运算那岂不是可以有更好的方法那,这个是当然有的
很简单我们只需要一个与运算就能解决。
9,就以上位运算也诞生了最简单加密方式即通过位运算加密
当然要解密只需通过密匙在进行一次异或即可
滴水 三
1,寄存器他与普通的内存条差不多但它是在CPU内部的可以对CPU数据进行快速储存
寄存器的基本样式如下
2,实际上寄存器是包含关系大致意思
3,基础汇编指令 mov 指令 用法 mov eax,0x32435 即将32453移动到EAX中
基本指令
4,内存 当我们需要运算一个很大的数时我们就会发现寄存器不够用了,而这就自然而然
引出内存的概念,内存是在CPU外面的所以说它可以很大但速度就与寄存器差很多啦,所
以内存不想寄存器有那麽多EAX ECX 啥的具体分类,内存是通过0x000 0x001 0x002这种
进行编号的由于寄存器和内存功能啥的是一致的(内存要和硬盘区分开)所以说以32为计算
机为例寄存器识别 0x00000000到0xffffffff 所以说内存编号只能到0x00000000 0xffffffff为止
内存一个存储单元最大单位是字节 而寄存器是四个字节所以说在汇编中内存的读取是一次性读取
四个地址 内存编号0x00000000 0xffffffff 所以说内存存储最大位0xffffffff+1也就是4G,所以说32位
计算机对应的识别内存是4G。(事无绝对也可以通过补丁等手段令其改变)
5,在汇编中获取内存是若用0x3223f890f这种方法会与立即数产生矛盾所以用内存时需要先[]来将
地址括住
滴水五
1,在汇编中的寻址方式
读取内存的值 MOV EAX,dword prt ds:[0xabbc8221]这种是读取的改地址的值
LEA eax,dword prt ds:[0x36716bac]这种是读取的该地址不是地址里面的值
读取或写入数据时都应注意LEA MOV的读取的内容
在读取地址时需注意【在这里面是可以加减的但不能除,乘法也只能乘 1,2,4,8.在这里面也可以是EAX,ECX等】总之寻址方式挺好懂的不过多介绍
2,堆栈
这个不好解释但也挺好懂咱们直接上图
这个堆栈就是以一个寄存器例如EAX为底部ECX为顶部然后存入数据时从EAX开始储存(是EAX存的地址)然后以此储存并让ECX存最后一个数据的地址这样就是堆栈以后查找只需从EAX或ECX用偏移的方法依次查找。
滴水四
补:先补充一下上个笔记漏的内容 push 和pop 堆栈用的ESP 栈顶 EBP栈底
push用于堆栈填充数据时使用即push 0x16362787或加eax啥的可以直接放入堆栈中并栈顶加4
pop用于堆栈的删除数据并ESP-4
1,
基本代表属性
CF进位替代标识及当寄存器AX(举例)ffff加一是AX会变成0000并且CF会有零变为一进行标识
这个进位标志仅用于最高位进位或借位
PF奇偶标志如果运算结果中1的个数为偶数个则为1反之则为0(只看前两位)
AF辅助进位标志若是EAX时就是AX[1234ffff]加一发生进位或AX[122f0001]-2是发生借位AF变为1
ZF零标志运算结果为零则为反之为0(自身异或)
SF符号标志这个就是运算后最高位是什么就是什么
TF单步标志
IF中断使能标志
DF方向标志0是加 1是减控制堆栈方向
OF溢出标志这个与CF相比就是这个负责的是有符号为
即0~7f为正 80~ff为负,当运算结果出现溢出时OF变为1(强调OF表示是有符号为的溢出)
ADC指令带进位加法 即正常加法再加上CF的值
SBB指令带借位减法即正常减法后额外减去CF的值
XCHG交换指令可以领两个寄存器内存啥的交换内容注意那个位数需要一定不能是两个内存条
MOVS指令移动数据:内存到内存。
作用使寄存器ESI储存的地址编号对应的储存信息复制到EDI储存的地址编号对应的内存条中并使ESI EDI储存的地址编号加上对应使用的储存宽度(4或2 1)DF控制其加还是减
标准写法 : movs dword ptr es:[edi],dword ptr es:[esi] 简写movsd
同理 movsw movsb
STOS指令:将EAX 的值储存到[EDI]内存条中并对应EDI加或减(4或2 1)
标准写法 : stos dword ptr es:[edi] 简写:stosd 同理stosw stosb
REP指令即根据EAX内的值进行重复次数
使用方法 mov eax,7 (对EAX进行赋值)
rep movsd或rep stosd 等
滴水六
JMP指令 即可以更改EIP的值 使用方法 jmp,0x42878828
CALL指令 可以更改EIP的值 注意:更改后执行后堆栈会压入一个当前地址加当前地址储存字节数的地址也就是下一个地址编号(这个和内存不同他不是一次加四个类)再次执行后会返回原地址的下一个地址。
CMP指令 与SUB指令差不多不过CMP指令用后结果不保存只改变0标志位ZF位
TEST指令这个与 与运算差不多不过也是不保留运算结果只是改变标志寄存器
余下的滴水基本都是C语言与汇编的基本认识与call等函数的