趁着我还没有彻底把我学的汇编还给老师,赶紧学一学。
本笔记基于王爽老师的《汇编语言第三版》和我学校里的学习,如有错误,希望各位大佬指出
第一章 基础知识
存储器被分为若干个存储单元,每个存储单元从0开始进行按顺序编号,一个存储单元能存储一个字节(即1Byte,8bits)
总线在逻辑上分为地址总线、控制总线和数据总线。
CPU通过地址总线指定存储单元,一个CPU有N根地址线,可以说这个CPU的地址总线宽度为N,最多可以寻找2的N次方个内存单元。
数据总线的宽度决定了CPU与外界的数据传送速度。N根数据总线可以传送N位数据(即Nbit)。
一台PC机装有多个存储器芯片,从读写上来看分为两类:随机存储器(RAM)和只读存储器(ROM)。随机存储器可读可写,但必须带点存储,关机后存储内容消失,只读存储器只能读取不能写入,关机后内容不丢失。
所有的物理存储器被看成一个由若干个存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。
第二章 寄存器
8086CPU一般为16位,可以存放两个字节。AX,BX,CX,DX,四个寄存器通常用来存放一般数据,称为通用寄存器。
一个16位寄存器可以存储一个16位的数据,而一个16位寄存器可以分为两个8位寄存器,如AX可以分为AL和AH。
简单的汇编指令:
如果执行add ax,93H
,则低8位的进位会存储至AH中,进行的是16位运算。如果执行的是add al,93H
,则会将低8位的进位1丢弃(指不保存在AH中),进行的是8位运算。
注意的是,进行数据传送或运算时,注意指令的操作对象位数一致。如mov ax,bx
可行,但mov ax,bl
错误。
16位CPU有以下几个特性:
- 一次可以处理16位数据
- 寄存器最大宽度为16
- 寄存器和运算器之间通路为16位。
8086通过地址加法器合成物理地址,即物理地址=段地址x16+偏移地址,即段地址左移一位(16进制下)再与偏移地址相加。
虽然被称为“段地址”,但内存并没有分段。段的划分来自于CPU,由于8086CPU用“物理地址=段地址x16+偏移地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
8086CPU有4个段寄存器:CS(代码段)、DS(数据段)、SS(堆栈段)、ES(附加段)。当8086CPU要访问内存时,由这四个段寄存器提供内存单元的段地址
CS和IP是8086CPU中最关键的寄存器,其中CS为代码段寄存器,IP为指令指针寄存器,物理地址即为CS的值x16+IP的值。
读取指令的操作为:
- 从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器。
- IP=IP+所读取指令的长度,从而指向下一条指令
- 执行指令,转到步骤1,重复该过程。
我们需要利用jmp xxx:x
对CS和IP进行修改。如:jmp 2AE3:3
执行后CS=2AE3H,IP=0003H。jmp 3:0B16
执行后CS=0003H,IP=0B16H。而jmp ax
执行后CS不变,IP变为ax的内容。
汇编编程环境准备
dosbox下载https://www.dosbox.com/download.php?main=1
masm下载http://www.masm32.com/
下载后创建一个文件夹并将masm等安装至文件夹中,该文件夹即为进行汇编编程的地方。
首先打开dosbox
debug的使用和常用
进入dosbox,通过
- 本文作者: Sn1pEr
- 本文链接: https://sn1per-ssd.github.io/2021/12/01/汇编语言学习笔记/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!