《汇编语言》王爽 - 1-3章基础 - 霜冷的秘密基地

《汇编语言》王爽 - 1-3章基础

读书笔记 0 评

前言:本系列章节参照王爽老师的《汇编语言》书籍进行摘要,可直接观看《汇编语言》,书籍涉及到8086CPU的原理入门,到汇编语言的编写,为逆向等课程学习打下基础。

一、基础知识

指令

机器指令:CPU能直接识别并执行的二进制编码
汇编指令:汇编指令是机器指令的助记符,同机器指令一一对应。
指令:指令通常由操作码和地址码(操作数)两部分组成
指令集:每种CPU都有自己的汇编指令集。

汇编语言由3类指令组成:

汇编指令
伪指令:没有对应的机器码,由编译器执行,计算机并不执行
其他符号:如+、-、*、/等,由编译器识别,没有对应的机器码。

编译器:够将汇编指令转换成机器指令的翻译程序每一种CPU都有自己的汇编指令集。

存储器

随机存储器(RAM)在程序的执行过程中可读可写,必须带电存储
只读存储器(ROM)在程序的执行过程中只读,关机数据不丢失

总线

1、总线是连接各个部件的信息传输线,是各个部件共享的传输介质。

主板上有核心器件和一些主要器件,这些器件通过总线(地址总线、数据总线、控制总线)相连。这些器件有CPU、存储器、外围芯片组、扩展插槽等。扩展插槽上一般插有RAM内存条和各类接口卡。

总线根据位置分类:

片内总线(芯片内部总线)
系统总线(计算机各个部件之间的总线)

系统总线根据传输信息不同分为:

地址总线:CPU通过地址总线来指定存储单元(n根地址线宽度计算:2^n-1)
数据总线:CPU与内存或其他器件之间的数据传送(一根一bit)
控制总线:CPU对外部器件的控制

2、内存地址空间

CPU将系统中各类存储器看作一个逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。
对于CPU,所有存储器中的存储单元都处于一个统一的逻辑存储器中,它的容量受CPU寻址能力限制。
每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据(对ROM写无效)。

二、寄存器

CPU由运算器、控制器、寄存器等器件构成,这些器件靠片内总线相连。
运算器进行信息处理;控制器控制各种器件进行工作;寄存器进行信息存储;
8086CPU有14个寄存器:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW都是16位
20190320231551626.png

16位结构CPU具有下面几方面的结构特性。

运算器一次最多可以处理16位的数据
寄存器的最大宽度为16位
寄存器和运算器之间的通路为16位

8086CPU可以一次性处理以下两种尺寸的数据

字节:记为byte,一个字节由8个bit组成,可以存在8位寄存器中。
字:记为word,一个字由两个字节组成,可以存在一个16位寄存器中(16位CPU)

20190320231904812.png

2、通用寄存器

通用寄存器:通常用来存放一般性的数据,有AX、BX、CX、DX,它们可分为两个可独立使用的8位寄存器
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的
一个8位寄存器所能存储的数据范围是0 ~ 28-1。

3、8086CPU给出物理地址的方法

8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。
8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。
从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出16位的地址,表现出的寻址能力只有64KB。
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
20190320232455205.png
当8086CPU要读写内存时:

  • CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址
  • 地址加法器将两个16位地址合成为一个20位的物理地址

段地址x16+偏移地址 = 物理地址【解释】

  • 段地址X16即二进制数据左移4位(一个十六进制数等于4位二进制数),这时候原段地址变成了20位数据
  • 加上偏移地址,则形成了物理地址

例如,8086CPU要访问地址为123C8H的内存单元,1230H左移一位(空出4位)加上00C8H合成123C8H

4、段寄存器

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,可以用分段的方式来管理内存。

用一个段存放数据,将它定义为“数据段”

用一个段存放代码,将它定义为“代码段”

用一个段当作栈,将它定义为“栈段”

注意点:

一个段的起始地址一定是16的倍数
偏移地址为16位,变化范围为0-FFFFH,所以一个段的长度最大为64KB
CPU可以用不同的段地址和偏移地址形成同一个物理地址

8086CPU有4个段寄存器:CS、DS、SS、ES,提供内存单元的段地址

CS和IP

CS为代码段寄存器,IP为指令指针寄存器
CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,
CPU将CS:IP指向的内容当作指令执行。(即PC)
20190321105503491.png

8086CPU的工作过程:

从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器
IP=IP+所读取指令的长度,从而指向下一条指令
执行指令。转到步骤1,重复这个过程

注:在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC机刚启动时,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

8086CPU提供转移指令修改CS、IP的内容。

jmp 段地址:偏移地址:用指令中给出的段地址修改CS,偏移地址修改IP,如:jmp 2AE3:3
jmp 某一合法寄存器:仅修改IP的内容,如:jmp ax

8086CPU不支持将数据直接送入段寄存器的操作,这属于8086CPU硬件设计

Debug的使用

R - 查看,改变CPU寄存器的内容
D - 查看内存中的内容
E - 改写内存中的内容
U - 将内存中的机器指令翻译成汇编指令
T - 执行下一条机器指令
A - 以汇编指令的格式在内容中写入一条机器指令

有意思的东东,往显存里写数据(屏幕会出现一些符号):

-e b810:0 01 01 02 02 03 03 04 04

DS和[address]

DS寄存器:通常用来存放要访问数据的段地址
[address]表示一个偏移地址为address的内存单元,段地址默认放在ds中
通过数据段段地址和偏移地址即可定位内存单元。

mov bx,1000H
mov ds,bx
mov ax,[0]    //将1000:0处的字型数据送入ax
mov [0],cx    //将cx中的16位数据送到1000:0处

SS和SP - 栈

在基于8086CPU编程的时候,可以将一段内存当作栈来使用。栈是先入后出的。

栈段寄存器SS,存放段地址,SP寄存器存放偏移地址,任意时刻,SS:SP指向栈顶元素

8086CPU中,入栈时,栈顶从高地址向低地址方向增长。

push ax表示将寄存器ax中的数据送入栈中,数据以字传输

  • SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
  • 将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶
    stack_push.png

pop ax表示从栈顶取出数据送入ax

  • 将SS:SP指向的内存单元处的数据送入ax中
  • SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶
    stack_pop.png

后记:到这里结束了前三章基础学习,后面开始正式汇编程序的学习

AndroidStudio - 学习笔记(JetPack) Day 5
快来做第一个评论的人吧~
0:00