2021.09.08 20:01:38
[[Assembly|汇编笔记系列]]
先放一段源代码。
assume cs:code
code segment
mov ax, 0ffffh
mov ds, ax
mov bx, 0
mov dx, 0
mov cx, 12
s: mov al, [bx]
mov ah, 0
add dx, ax
inc bx
loop s
mov ax, 4c00h
int 21h
code ends
end
上面的程序计算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中的地址加法器会利用如下公式进行转换:
物理地址=段地址*16+偏移地址
8086中,段地址在段寄存器种存储。它有四个段寄存器:CS
,DS
,SS
,ES
。8086要访问内存时由这四个段寄存器提供内存单元的段地址。
[CS:IP]
[jmp]
[push,pop]