第一章、基础知识

基础知识目录

d2b5ca33bd182321

第一节、汇编语言基础

d2b5ca33bd201518

一些量词

d2b5ca33bd201700

bit: 比特,1位。010101。
byte
: 字节,8位。计算机的最小存储单元
WORD: 字。一个字通常是指两个字节(16位)。针对windows x64这个平台,这个规则总是成立的。其他一些小众的平台不一定满足这一点。
DWORD: windows API的类型,用于表示”double word”的数据,即32位。
QWORD: windows API的类型,用于表示”qual word”的数据,即63位。
x86_x64: 这是Intel最先推出的指令集。

栈帧: 用于记录程序在某时刻栈的状态。例如调用一个函数之前,需要保存栈帧,用于在完成调用之后恢复现场。

计算机寻址方式

d2b5ca33bd201818

 
• 在当前主流的操作系统中,都是以字节 (B) 为寻址单位进行寻址。
• 意味着计算机访问的最小单位是一个字节 (B)。
• 类比于人口普查,普查员以每户(B) 为单位统计,而不是访问到个人 ( b ) 。

前言

d2b5ca33bd202152

计算机井不能直接运行高级语言。
我们编写的高级语言程序需要进行编译后才能在计算机上运行。
高级语言经过编译之后,经过编译器处理,被打包成一个可执行文件的格式。
那么,计算机真正能够被运行的是什么?

机器码

也就是一个一个的010101

d2b5ca33bd202341

• 深入底层后,计算机其实很笨,只能完成一些很基本的操作,但是速度很快。
• 机器码就是一个个01组成的,为了方便人类阅读,一般都以16进制呈现。
• 尽管如此,一个个16进制字符可读性仍然很差。
•汇编语言就是把这些机器指令代码以一个助记符的形式翻译一下,方便人类阅读。

汇编语言就是机器码的一助记符,为了让人能看懂。 

d2b5ca33bd202509

寄存器

d2b5ca33bd202635

• 计算机的指令都是由CPU来执行。
• 在计算机系统结构中,CPU和内存是分开的。
• 寄存器存在于CPU中,是CPU的直接操作对象。
 

windows x64寄存器命名规则

  • 前缀R
    表示64位寄存器。例如RAX。
  • 前缀E
    表示32位寄存器。例如EAX
  • 后缀L
    表示寄存器的低8位
  • 后缀H
    表示寄存器的9~16位

寄存器的种类

这是64为系统所用到的寄存器

d2b5ca33bd202929

d2b5ca33bd113503

从第一个RAX到R15都是通用寄存器,基本完成一些数值运算,存储一些数据什么的,都可以。

计算机的发展是有一个过程的,最开始的时候不是64位的,最开始的可能是8位,16位的,
所以计算机的发展为了相互兼容,就保留了别的东西,在32位

首先我们看一下从RAX到R15都是通用寄存器。都是通用寄存器是  什么意思呢?
就是说我们基本完成一些数值运算,存储一些数据、乱七八糟的东西啊,通用寄存器干什么都可以。

然后呢,我们知道这个计算机的发展啊,并不是一蹴而就的。计算机发展是有个过程的,
最早的计算机呢?呃,并不是64位系统,最早的计算机可能是8位,可能是16位或者32位。
所以说呢,这个我们计算机的发展呢,为了向后兼容啊,所以说我们就留下保留了一些别的东西,

d2b5ca33bd151242

比如说呢,在32位系统中,是没有RAX寄存器的,
因为32位系统只有32位码,不可能直接访问64位的64位的东西,
所以说呢,在32位系统里面的这个RAX寄存器呢,就称之为EAX。
然后呢,在我们RAX的寄存器的低32位啊,就是EAX寄存器。

d2b5ca33bd111547

呃,以此类推啊,他的
低32位就是EAX寄存器
低16位就是AX寄存器
8到15位就是AH
AH什么意思呢?就是A寄存器的,高字节就是A high。
低8位就是AL,AL就是A low

RBX、RCX、RDX呢?它的命名的那个规则同RAX一样。

d2b5ca33bd164442

也就是,RBX的低32位是EBX,低16位就是BX。8到15位呢就是BH,低8位就是BL。

RAX

accumulator register,累加寄存器,通常用于存储函数的返回值。其实也可以用于存储其他值,只是通过RAX存储函数返回值属于惯例。

d2b5ca33bd111547

RBX

base register,基址寄存器,一般用于访问内存的基址。

d2b5ca33bd111912

RCX

counter register,计数寄存器。一般用于循环计数。

d2b5ca33bd111944

RDX

data register,数据寄存器。

d2b5ca33bd112015

RDI

destination index,目标变址寄存器,字符串运算时常用于目标指针。

d2b5ca33bd113817

RSI

source index,源变址寄存器,字符串运算时常应用于源指针。

d2b5ca33bd113937

R8 ~ R15

R8, R9, R10, … , R15属于普通寄存器,一般是可以任意使用,不指定特定用途。支持拆分,但是拆分的寄存器在命名规则上与特殊功能寄存器有所不同。32位拆分寄存器以D作为后缀(DWORD),16位寄存器以W作为后缀(WORD),8位则以B作为后缀(BYTE)。

d2b5ca33bd114615

RSP

stack pointer,栈指针寄存器,正常情况下存放栈顶地址,如果用于其他事务,使用完成之后需要恢复原先的数据。

d2b5ca33bd114041

RBP

base pointer,基址寄存器,正常情况用于访问栈底地址。与RBP类似,如果用于其他事务,使用完成之后需要恢复原先的数据。

d2b5ca33bd114121

EFLAGS

EFLAGS Register,用于保存CPU运行中的一些状态,比如,溢出,进位等等,
CMP(Compare)指令:比较两个寄存器的值,比较的结果是以改变EFLAGS的值来存储。

a9a5eabc36115358

CF:进位标志CF(Carry Flag),如果运算结果的最高位产生了一个进位或借位,其值为1,否则为0。

PF:奇偶标志PF(Parity Flag),运算结果中“1”的个数的奇偶性,偶数个1,PF=1,反之为0。

AF:辅助进位标志AF(Auxiliary Carry Flag),这个不太好理解,比如:EAX值为0xNNNNNNNN(红色地方有进位,AF就是1,不管使用的是:EAX、AX、AL)。

ZF:零标志ZF(Zero Flag),它记录相关指令执行后,结果是否为0;如果结果为0,zf=1,如果结果不为0,zf=0

SF:符号标志SF(Sign Flag),正负标志位,它记录相关指令执行后,结果是否为负,如果结果为负,zf=1,如果结果非负,zf=0。(说明一下:符号位是程序员确定的,如果是无符号数,就算SF位,如果是无符号数,就不管SF位,想让SF=1,就:MOV EAX,0x1然后SUB EAX,0x2)

OF:溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。(MOV AL,0x7F, ADD AL,0x1)
CF与OF的区别:
进位标志CF表示无符号数运算结果是否超出范围.
溢出标志OF表示有符号数运算结果是否超出范围.

DF:方向标志DF(Direction Flag),控制串指令(MOVS, CMPS, SCAS, LODS以及STOS)。DF=1,ESI,EDI自动递减(从高地址向低地址方向处理字符串),DF=0,ESI,EDI自动递增

RIP

instruction pointer,指令指针。只读,且不可拆分。指向下一条需要执行的指令地址。

d2b5ca33bd114726

指令计数器。当CPU来访问一个内存地址,就是来取指令的时候总有一个地址对吧?那这个地址呢,就存在RIP寄存器里。 RIP寄存器永远指向当前运行指令的下一个指令地址。

RIP指针用于存储CPU下一条将会执行的指针,不能直接修改,正常情况下会一次运行一条指令自增一条指令的长度,当发生跳转时才会以其他形式改变其值

寻址方式

d2b5ca33bd123711

 

汇编指令

计算机只能完成很基本的操作。
这些操作大多是对一些寄存器的值进行修改这些指令通过排列组合,完成复杂的功能,
两种格式: intel 和AT&T
  二者差别主要在于源和目的操作数顺序上
  可以通过立即数寻址来进行

 

d2b5ca33bd184016

1. MOV指令

MOV指令用于将数据从一个位置复制到另一个位置,其语法如下:

MOV destination, source
其中destination表示目标操作数source表示源操作数。例如:

MOV AX, BX
这条指令将BX寄存器中的值复制到AX寄存器中

 

 

 

 

 

 

 

 

 

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称

    暂无评论内容