汇编学习笔记:汇编基础
[[Assembly|汇编笔记系列]]
先放一段源代码。
1 | assume cs:code |
上面的程序计算ffff:0-ffff:b
单元中数据的和,结果存储在dx
中。
下面先说些东西再看这个程序。
存储单元
存储器被划分为多个存储单元,编号从0开始。一个存储单元可存储一个Byte
(B),即8bit
(1bit(b)是一个二进制位)或者称作一字节。两个字节合成一个字,也就是字面意思上的字。
寄存器
这里**只讨论8086CPU
**。CPU主要部件是寄存器。我们通过改写寄存器中的内容来控制CPU,从而完成各种程序。
8086CPU的寄存器有:AX
、BX
、CX
、DX
、SI
、DI
、SP
、BP
、IP
、CS
、SS
、DS
、ES
、PSW
。后面单独介绍这些寄存器。
通用寄存器
8086所有寄存器都是16位的,可存放两个字节(或称为一个字)。AX
、BX
、CX
、DX
这四个寄存器通常用来存放一般性的数据,所以它们又被称作通用寄存器。它由16个二进制位构成,最右边是最低位,最左边是最高位,编号从零开始,从右往左依次升高,这和数字各位的读写顺序一样。
不仅如此,这四个寄存器每个都能分成2个独立的8位寄存器来使用。AX
对应AH
和AL
,H是high,即高八位;L是low,即低八位。另外3个寄存器同理。
字和字节在其中的存储,都是从右至左,从低八位最右侧到高八位最左侧。
内存的读写
首先做一个简单的算数。8位对应256种状态,同时也对应2个16进制数。而8086的物理地址长度是20位,也就对应5位十六进制数。那么,地址应该如何存储呢?用两个寄存器。一个存放16位,另一个存放4位。前者存放的,被称为偏移地址(offset),后者存放的,被称为段地址。
当获得段地址和偏移地址后,CPU中的地址加法器会利用如下公式进行转换:
1 | 物理地址=段地址*16+偏移地址 |
段寄存器
8086中,段地址在段寄存器种存储。它有四个段寄存器:CS
,DS
,SS
,ES
。8086要访问内存时由这四个段寄存器提供内存单元的段地址。
[CS:IP]
[jmp]
Debug简介
DS和[address]
mov, add, sub指令
CPU的栈机制
[push,pop]